-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvalue.c
67 lines (62 loc) · 1.7 KB
/
value.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdio.h>
#include <string.h>
#include "memory.h"
#include "value.h"
#include "object.h"
void init_val_array(ValueArray *arr) {
/* code */
arr->values = NULL;
arr->capacity = 0;
arr->count = 0;
}
//possibly also use stretchy buffers? but noteworthy to understand this
void write_val_array(RotoVM* vm,ValueArray *arr, Value value){
if(arr->capacity < arr->count + 1){
int old_cap = arr->capacity;
arr->capacity = GROW_CAPACITY(old_cap);
arr->values = GROW_ARRAY(vm,arr->values, Value, old_cap, arr->capacity);
}
arr->values[arr->count] = value;
arr->count++;
}
void free_val_array(RotoVM* vm,ValueArray *arr){
FREE_ARRAY(vm,Value,arr->values,arr->capacity);
init_val_array(arr);
}
void print_value(Value value){
#ifdef NAN_BOXING
if(IS_BOOL(value)){
printf(AS_BOOL(value) ? "true" : "false");
} else if(IS_NIL(value)){
printf("nil");
} else if(IS_NUMBER(value)){
printf("%g",AS_NUMBER(value));
} else if (IS_OBJ(value)){
print_object(value);
}
#else
switch (value.type) {
case VAL_BOOL: printf(AS_BOOL(value) ? "true" : "false"); break;
case VAL_NIL: break;
case VAL_NUMBER: printf("%g", AS_NUMBER(value)); break;
case VAL_OBJ: print_object(value); break;
}
#endif
}
bool vals_equal(Value a, Value b){
#ifdef NAN_BOXING
//could be ignored...
if(IS_NUMBER(a) && IS_NUMBER(b)){
return AS_NUMBER(a) == AS_NUMBER(b);
}
return a == b;
#else
if(a.type != b.type) return false;
switch (a.type) {
case VAL_BOOL: return AS_BOOL(a) == AS_BOOL(b);
case VAL_NIL: return true;
case VAL_NUMBER: return AS_NUMBER(a) == AS_NUMBER(b);
case VAL_OBJ: return AS_OBJ(a) == AS_OBJ(b);
}
#endif
}