1 //
2 //  macros.h
3 //  gravity
4 //
5 //  Created by Marco Bambini on 24/04/15.
6 //  Copyright (c) 2015 CreoLabs. All rights reserved.
7 //
8 
9 #ifndef __GRAVITY_MACROS__
10 #define __GRAVITY_MACROS__
11 
12 #include "gravity_config.h"
13 
14 #define AUTOLENGTH                          UINT32_MAX
15 
16 // MARK: -
17 // pragma unused is not recognized by VC
18 #define UNUSED_PARAM(_x)                    (void)(_x)
19 #define UNUSED_PARAM2(_x,_y)                UNUSED_PARAM(_x),UNUSED_PARAM(_y)
20 #define UNUSED_PARAM3(_x,_y,_z)             UNUSED_PARAM(_x),UNUSED_PARAM(_y),UNUSED_PARAM(_z)
21 
22 // MARK: -
23 #define VALUE_AS_OBJECT(x)                  ((x).p)
24 #define VALUE_AS_STRING(x)                  ((gravity_string_t *)VALUE_AS_OBJECT(x))
25 #define VALUE_AS_FIBER(x)                   ((gravity_fiber_t *)VALUE_AS_OBJECT(x))
26 #define VALUE_AS_FUNCTION(x)                ((gravity_function_t *)VALUE_AS_OBJECT(x))
27 #define VALUE_AS_PROPERTY(x)                ((gravity_property_t *)VALUE_AS_OBJECT(x))
28 #define VALUE_AS_CLOSURE(x)                 ((gravity_closure_t *)VALUE_AS_OBJECT(x))
29 #define VALUE_AS_CLASS(x)                   ((gravity_class_t *)VALUE_AS_OBJECT(x))
30 #define VALUE_AS_INSTANCE(x)                ((gravity_instance_t *)VALUE_AS_OBJECT(x))
31 #define VALUE_AS_LIST(x)                    ((gravity_list_t *)VALUE_AS_OBJECT(x))
32 #define VALUE_AS_MAP(x)                     ((gravity_map_t *)VALUE_AS_OBJECT(x))
33 #define VALUE_AS_RANGE(x)                   ((gravity_range_t *)VALUE_AS_OBJECT(x))
34 #define VALUE_AS_CSTRING(x)                 (VALUE_AS_STRING(x)->s)
35 #define VALUE_AS_ERROR(x)                   ((const char *)(x).p)
36 #define VALUE_AS_FLOAT(x)                   ((x).f)
37 #define VALUE_AS_INT(x)                     ((x).n)
38 #define VALUE_AS_BOOL(x)                    ((x).n)
39 
40 // MARK: -
41 #if GRAVITY_USE_HIDDEN_INITIALIZERS
42 #define VALUE_FROM_ERROR(msg)               (gravity_value_from_error(msg))
43 #define VALUE_NOT_VALID                     VALUE_FROM_ERROR(NULL)
44 #define VALUE_FROM_OBJECT(obj)              (gravity_value_from_object(obj))
45 #define VALUE_FROM_STRING(_vm,_s,_len)      (gravity_string_to_value(_vm, _s, _len))
46 #define VALUE_FROM_CSTRING(_vm,_s)          (gravity_string_to_value(_vm, _s, AUTOLENGTH))
47 #define VALUE_FROM_INT(x)                   (gravity_value_from_int(x))
48 #define VALUE_FROM_FLOAT(x)                 (gravity_value_from_float(x))
49 #define VALUE_FROM_NULL                     (gravity_value_from_null())
50 #define VALUE_FROM_UNDEFINED                (gravity_value_from_undefined())
51 #define VALUE_FROM_BOOL(x)                  (gravity_value_from_bool(x))
52 #define VALUE_FROM_FALSE                    VALUE_FROM_BOOL(0)
53 #define VALUE_FROM_TRUE                     VALUE_FROM_BOOL(1)
54 #else
55 #define VALUE_FROM_ERROR(msg)               ((gravity_value_t){.isa = NULL, .p = ((gravity_object_t *)msg)})
56 #define VALUE_NOT_VALID                     VALUE_FROM_ERROR(NULL)
57 #define VALUE_FROM_OBJECT(obj)              ((gravity_value_t){.isa = ((gravity_object_t *)(obj)->isa), .p = (gravity_object_t *)(obj)})
58 #define VALUE_FROM_STRING(_vm,_s,_len)      (gravity_string_to_value(_vm, _s, _len))
59 #define VALUE_FROM_CSTRING(_vm,_s)          (gravity_string_to_value(_vm, _s, AUTOLENGTH))
60 #define VALUE_FROM_INT(x)                   ((gravity_value_t){.isa = gravity_class_int, .n = (x)})
61 #define VALUE_FROM_FLOAT(x)                 ((gravity_value_t){.isa = gravity_class_float, .f = (x)})
62 #define VALUE_FROM_NULL                     ((gravity_value_t){.isa = gravity_class_null, .n = 0})
63 #define VALUE_FROM_UNDEFINED                ((gravity_value_t){.isa = gravity_class_null, .n = 1})
64 #define VALUE_FROM_BOOL(x)                  ((gravity_value_t){.isa = gravity_class_bool, .n = (x)})
65 #define VALUE_FROM_FALSE                    VALUE_FROM_BOOL(0)
66 #define VALUE_FROM_TRUE                     VALUE_FROM_BOOL(1)
67 #endif // GRAVITY_USE_HIDDEN_INITIALIZERS
68 
69 #define STATICVALUE_FROM_STRING(_v,_s,_l)   gravity_string_t __temp = {.isa = gravity_class_string, .s = (char *)_s, .len = (uint32_t)_l, }; \
70                                             __temp.hash = gravity_hash_compute_buffer(__temp.s, __temp.len); \
71                                             gravity_value_t _v = {.isa = gravity_class_string, .p = (gravity_object_t *)&__temp };
72 
73 // MARK: -
74 #define VALUE_ISA_FUNCTION(v)               (v.isa == gravity_class_function)
75 #define VALUE_ISA_INSTANCE(v)               (v.isa == gravity_class_instance)
76 #define VALUE_ISA_CLOSURE(v)                (v.isa == gravity_class_closure)
77 #define VALUE_ISA_FIBER(v)                  (v.isa == gravity_class_fiber)
78 #define VALUE_ISA_CLASS(v)                  (v.isa == gravity_class_class)
79 #define VALUE_ISA_STRING(v)                 (v.isa == gravity_class_string)
80 #define VALUE_ISA_INT(v)                    (v.isa == gravity_class_int)
81 #define VALUE_ISA_FLOAT(v)                  (v.isa == gravity_class_float)
82 #define VALUE_ISA_BOOL(v)                   (v.isa == gravity_class_bool)
83 #define VALUE_ISA_LIST(v)                   (v.isa == gravity_class_list)
84 #define VALUE_ISA_MAP(v)                    (v.isa == gravity_class_map)
85 #define VALUE_ISA_RANGE(v)                  (v.isa == gravity_class_range)
86 #define VALUE_ISA_BASIC_TYPE(v)             (VALUE_ISA_STRING(v) || VALUE_ISA_INT(v) || VALUE_ISA_FLOAT(v) || VALUE_ISA_BOOL(v))
87 #define VALUE_ISA_NULLCLASS(v)              (v.isa == gravity_class_null)
88 #define VALUE_ISA_NULL(v)                   ((v.isa == gravity_class_null) && (v.n == 0))
89 #define VALUE_ISA_UNDEFINED(v)              ((v.isa == gravity_class_null) && (v.n == 1))
90 #define VALUE_ISA_CLASS(v)                  (v.isa == gravity_class_class)
91 #define VALUE_ISA_CALLABLE(v)               (VALUE_ISA_FUNCTION(v) || VALUE_ISA_CLASS(v) || VALUE_ISA_FIBER(v))
92 #define VALUE_ISA_VALID(v)                  (v.isa != NULL)
93 #define VALUE_ISA_NOTVALID(v)               (v.isa == NULL)
94 #define VALUE_ISA_ERROR(v)                  VALUE_ISA_NOTVALID(v)
95 
96 // MARK: -
97 #define OBJECT_ISA_INT(obj)                 (obj->isa == gravity_class_int)
98 #define OBJECT_ISA_FLOAT(obj)               (obj->isa == gravity_class_float)
99 #define OBJECT_ISA_BOOL(obj)                (obj->isa == gravity_class_bool)
100 #define OBJECT_ISA_NULL(obj)                (obj->isa == gravity_class_null)
101 #define OBJECT_ISA_CLASS(obj)               (obj->isa == gravity_class_class)
102 #define OBJECT_ISA_FUNCTION(obj)            (obj->isa == gravity_class_function)
103 #define OBJECT_ISA_CLOSURE(obj)             (obj->isa == gravity_class_closure)
104 #define OBJECT_ISA_INSTANCE(obj)            (obj->isa == gravity_class_instance)
105 #define OBJECT_ISA_LIST(obj)                (obj->isa == gravity_class_list)
106 #define OBJECT_ISA_MAP(obj)                 (obj->isa == gravity_class_map)
107 #define OBJECT_ISA_STRING(obj)              (obj->isa == gravity_class_string)
108 #define OBJECT_ISA_UPVALUE(obj)             (obj->isa == gravity_class_upvalue)
109 #define OBJECT_ISA_FIBER(obj)               (obj->isa == gravity_class_fiber)
110 #define OBJECT_ISA_RANGE(obj)               (obj->isa == gravity_class_range)
111 #define OBJECT_ISA_MODULE(obj)              (obj->isa == gravity_class_module)
112 #define OBJECT_IS_VALID(obj)                (obj->isa != NULL)
113 
114 // MARK: -
115 #define LIST_COUNT(v)                       (marray_size(VALUE_AS_LIST(v)->array))
116 #define LIST_VALUE_AT_INDEX(v, idx)         (marray_get(VALUE_AS_LIST(v)->array, idx))
117 
118 // MARK: -
119 #define GRAVITY_JSON_FUNCTION               "function"
120 #define GRAVITY_JSON_CLASS                  "class"
121 #define GRAVITY_JSON_RANGE                  "range"
122 #define GRAVITY_JSON_INSTANCE               "instance"
123 #define GRAVITY_JSON_ENUM                   "enum"
124 #define GRAVITY_JSON_MAP                    "map"
125 #define GRAVITY_JSON_VAR                    "var"
126 #define GRAVITY_JSON_GETTER                 "$get"
127 #define GRAVITY_JSON_SETTER                 "$set"
128 
129 #define GRAVITY_JSON_LABELTAG               "tag"
130 #define GRAVITY_JSON_LABELNAME              "name"
131 #define GRAVITY_JSON_LABELTYPE              "type"
132 #define GRAVITY_JSON_LABELVALUE             "value"
133 #define GRAVITY_JSON_LABELIDENTIFIER        "identifier"
134 #define GRAVITY_JSON_LABELPOOL              "pool"
135 #define GRAVITY_JSON_LABELPVALUES           "pvalues"
136 #define GRAVITY_JSON_LABELPNAMES            "pnames"
137 #define GRAVITY_JSON_LABELMETA              "meta"
138 #define GRAVITY_JSON_LABELBYTECODE          "bytecode"
139 #define GRAVITY_JSON_LABELLINENO            "lineno"
140 #define GRAVITY_JSON_LABELNPARAM            "nparam"
141 #define GRAVITY_JSON_LABELNLOCAL            "nlocal"
142 #define GRAVITY_JSON_LABELNTEMP             "ntemp"
143 #define GRAVITY_JSON_LABELNUPV              "nup"
144 #define GRAVITY_JSON_LABELARGS              "args"
145 #define GRAVITY_JSON_LABELINDEX             "index"
146 #define GRAVITY_JSON_LABELSUPER             "super"
147 #define GRAVITY_JSON_LABELNIVAR             "nivar"
148 #define GRAVITY_JSON_LABELSIVAR             "sivar"
149 #define GRAVITY_JSON_LABELPURITY            "purity"
150 #define GRAVITY_JSON_LABELREADONLY          "readonly"
151 #define GRAVITY_JSON_LABELSTORE             "store"
152 #define GRAVITY_JSON_LABELINIT              "init"
153 #define GRAVITY_JSON_LABELSTATIC            "static"
154 #define GRAVITY_JSON_LABELPARAMS            "params"
155 #define GRAVITY_JSON_LABELSTRUCT            "struct"
156 #define GRAVITY_JSON_LABELFROM              "from"
157 #define GRAVITY_JSON_LABELTO                "to"
158 #define GRAVITY_JSON_LABELIVAR              "ivar"
159 
160 #define GRAVITY_VM_ANONYMOUS_PREFIX         "$$"
161 
162 // MARK: -
163 
164 #if 1
165 #define DEBUG_ASSERT(condition, message)    do { \
166                                                 if (!(condition)) { \
167                                                     fprintf(stderr, "[%s:%d] Assert failed in %s(): %s\n", \
168                                                     __FILE__, __LINE__, __func__, message); \
169                                                     abort(); \
170                                                 } \
171                                             } \
172                                             while(0)
173 #else
174 #define DEBUG_ASSERT(condition, message)
175 #endif
176 
177 #endif
178