Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
epidemian
GitHub Repository: epidemian/gravity
Path: blob/master/src/shared/gravity_macros.h
1218 views
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
#define AUTOLENGTH UINT32_MAX
13
14
// MARK: -
15
#define VALUE_AS_OBJECT(x) ((x).p)
16
#define VALUE_AS_STRING(x) ((gravity_string_t *)VALUE_AS_OBJECT(x))
17
#define VALUE_AS_FIBER(x) ((gravity_fiber_t *)VALUE_AS_OBJECT(x))
18
#define VALUE_AS_FUNCTION(x) ((gravity_function_t *)VALUE_AS_OBJECT(x))
19
#define VALUE_AS_PROPERTY(x) ((gravity_property_t *)VALUE_AS_OBJECT(x))
20
#define VALUE_AS_CLOSURE(x) ((gravity_closure_t *)VALUE_AS_OBJECT(x))
21
#define VALUE_AS_CLASS(x) ((gravity_class_t *)VALUE_AS_OBJECT(x))
22
#define VALUE_AS_INSTANCE(x) ((gravity_instance_t *)VALUE_AS_OBJECT(x))
23
#define VALUE_AS_LIST(x) ((gravity_list_t *)VALUE_AS_OBJECT(x))
24
#define VALUE_AS_MAP(x) ((gravity_map_t *)VALUE_AS_OBJECT(x))
25
#define VALUE_AS_RANGE(x) ((gravity_range_t *)VALUE_AS_OBJECT(x))
26
#define VALUE_AS_CSTRING(x) (VALUE_AS_STRING(x)->s)
27
#define VALUE_AS_ERROR(x) ((const char *)(x).p)
28
#define VALUE_AS_FLOAT(x) ((x).f)
29
#define VALUE_AS_INT(x) ((x).n)
30
#define VALUE_AS_BOOL(x) ((x).n)
31
32
// MARK: -
33
#define VALUE_FROM_ERROR(msg) ((gravity_value_t){.isa = NULL, .p = ((gravity_object_t *)msg)})
34
#define VALUE_NOT_VALID VALUE_FROM_ERROR(NULL)
35
#define VALUE_FROM_OBJECT(obj) ((gravity_value_t){.isa = ((gravity_object_t *)(obj)->isa), .p = (gravity_object_t *)(obj)})
36
#define VALUE_FROM_STRING(_vm,_s,_len) (gravity_string_to_value(_vm, _s, _len))
37
#define VALUE_FROM_CSTRING(_vm,_s) (gravity_string_to_value(_vm, _s, AUTOLENGTH))
38
#define VALUE_FROM_INT(x) ((gravity_value_t){.isa = gravity_class_int, .n = (x)})
39
#define VALUE_FROM_FLOAT(x) ((gravity_value_t){.isa = gravity_class_float, .f = (x)})
40
#define VALUE_FROM_NULL ((gravity_value_t){.isa = gravity_class_null, .n = 0})
41
#define VALUE_FROM_UNDEFINED ((gravity_value_t){.isa = gravity_class_null, .n = 1})
42
#define VALUE_FROM_BOOL(x) ((gravity_value_t){.isa = gravity_class_bool, .n = (x)})
43
#define VALUE_FROM_FALSE VALUE_FROM_BOOL(0)
44
#define VALUE_FROM_TRUE VALUE_FROM_BOOL(1)
45
#define STATICVALUE_FROM_STRING(_v,_s,_l) gravity_string_t __temp = {.isa = gravity_class_string, .s = (char *)_s, .len = (uint32_t)_l, }; \
46
__temp.hash = gravity_hash_compute_buffer(__temp.s, __temp.len); \
47
gravity_value_t _v = {.isa = gravity_class_string, .p = (gravity_object_t *)&__temp };
48
// MARK: -
49
#define VALUE_ISA_FUNCTION(v) (v.isa == gravity_class_function)
50
#define VALUE_ISA_INSTANCE(v) (v.isa == gravity_class_instance)
51
#define VALUE_ISA_CLOSURE(v) (v.isa == gravity_class_closure)
52
#define VALUE_ISA_FIBER(v) (v.isa == gravity_class_fiber)
53
#define VALUE_ISA_CLASS(v) (v.isa == gravity_class_class)
54
#define VALUE_ISA_STRING(v) (v.isa == gravity_class_string)
55
#define VALUE_ISA_INT(v) (v.isa == gravity_class_int)
56
#define VALUE_ISA_FLOAT(v) (v.isa == gravity_class_float)
57
#define VALUE_ISA_BOOL(v) (v.isa == gravity_class_bool)
58
#define VALUE_ISA_LIST(v) (v.isa == gravity_class_list)
59
#define VALUE_ISA_MAP(v) (v.isa == gravity_class_map)
60
#define VALUE_ISA_RANGE(v) (v.isa == gravity_class_range)
61
#define VALUE_ISA_BASIC_TYPE(v) (VALUE_ISA_STRING(v) || VALUE_ISA_INT(v) || VALUE_ISA_FLOAT(v) || VALUE_ISA_BOOL(v))
62
#define VALUE_ISA_NULLCLASS(v) (v.isa == gravity_class_null)
63
#define VALUE_ISA_NULL(v) ((v.isa == gravity_class_null) && (v.n == 0))
64
#define VALUE_ISA_UNDEFINED(v) ((v.isa == gravity_class_null) && (v.n == 1))
65
#define VALUE_ISA_CLASS(v) (v.isa == gravity_class_class)
66
#define VALUE_ISA_CALLABLE(v) (VALUE_ISA_FUNCTION(v) || VALUE_ISA_CLASS(v) || VALUE_ISA_FIBER(v))
67
#define VALUE_ISA_VALID(v) (v.isa != NULL)
68
#define VALUE_ISA_NOTVALID(v) (v.isa == NULL)
69
#define VALUE_ISA_ERROR(v) VALUE_ISA_NOTVALID(v)
70
71
// MARK: -
72
#define OBJECT_ISA_INT(obj) (obj->isa == gravity_class_int)
73
#define OBJECT_ISA_FLOAT(obj) (obj->isa == gravity_class_float)
74
#define OBJECT_ISA_BOOL(obj) (obj->isa == gravity_class_bool)
75
#define OBJECT_ISA_NULL(obj) (obj->isa == gravity_class_null)
76
#define OBJECT_ISA_CLASS(obj) (obj->isa == gravity_class_class)
77
#define OBJECT_ISA_FUNCTION(obj) (obj->isa == gravity_class_function)
78
#define OBJECT_ISA_CLOSURE(obj) (obj->isa == gravity_class_closure)
79
#define OBJECT_ISA_INSTANCE(obj) (obj->isa == gravity_class_instance)
80
#define OBJECT_ISA_LIST(obj) (obj->isa == gravity_class_list)
81
#define OBJECT_ISA_MAP(obj) (obj->isa == gravity_class_map)
82
#define OBJECT_ISA_STRING(obj) (obj->isa == gravity_class_string)
83
#define OBJECT_ISA_UPVALUE(obj) (obj->isa == gravity_class_upvalue)
84
#define OBJECT_ISA_FIBER(obj) (obj->isa == gravity_class_fiber)
85
#define OBJECT_ISA_RANGE(obj) (obj->isa == gravity_class_range)
86
#define OBJECT_ISA_MODULE(obj) (obj->isa == gravity_class_module)
87
#define OBJECT_IS_VALID(obj) (obj->isa != NULL)
88
89
// MARK: -
90
#define LIST_COUNT(v) (marray_size(VALUE_AS_LIST(v)->array))
91
#define LIST_VALUE_AT_INDEX(v, idx) (marray_get(VALUE_AS_LIST(v)->array, idx))
92
93
// MARK: -
94
#define GRAVITY_JSON_FUNCTION "function"
95
#define GRAVITY_JSON_CLASS "class"
96
#define GRAVITY_JSON_ENUM "enum"
97
#define GRAVITY_JSON_MAP "map"
98
#define GRAVITY_JSON_VAR "var"
99
#define GRAVITY_JSON_GETTER "$get"
100
#define GRAVITY_JSON_SETTER "$set"
101
102
#define GRAVITY_JSON_LABELTAG "tag"
103
#define GRAVITY_JSON_LABELNAME "name"
104
#define GRAVITY_JSON_LABELTYPE "type"
105
#define GRAVITY_JSON_LABELIDENTIFIER "identifier"
106
#define GRAVITY_JSON_LABELPOOL "pool"
107
#define GRAVITY_JSON_LABELMETA "meta"
108
#define GRAVITY_JSON_LABELBYTECODE "bytecode"
109
#define GRAVITY_JSON_LABELNPARAM "nparam"
110
#define GRAVITY_JSON_LABELNLOCAL "nlocal"
111
#define GRAVITY_JSON_LABELNTEMP "ntemp"
112
#define GRAVITY_JSON_LABELNUPV "nup"
113
#define GRAVITY_JSON_LABELARGS "args"
114
#define GRAVITY_JSON_LABELINDEX "index"
115
#define GRAVITY_JSON_LABELSUPER "super"
116
#define GRAVITY_JSON_LABELNIVAR "nivar"
117
#define GRAVITY_JSON_LABELSIVAR "sivar"
118
#define GRAVITY_JSON_LABELPURITY "purity"
119
#define GRAVITY_JSON_LABELREADONLY "readonly"
120
#define GRAVITY_JSON_LABELSTORE "store"
121
#define GRAVITY_JSON_LABELINIT "init"
122
#define GRAVITY_JSON_LABELSTATIC "static"
123
#define GRAVITY_JSON_LABELPARAMS "params"
124
#define GRAVITY_JSON_LABELSTRUCT "struct"
125
126
#define GRAVITY_VM_ANONYMOUS_PREFIX "$$"
127
128
129
#endif
130
131