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