32#ifndef DUK_HOBJECT_H_INCLUDED
33#define DUK_HOBJECT_H_INCLUDED
38#define DUK_HOBJECT_FLAG_EXTENSIBLE DUK_HEAPHDR_USER_FLAG(0)
39#define DUK_HOBJECT_FLAG_CONSTRUCTABLE DUK_HEAPHDR_USER_FLAG(1)
40#define DUK_HOBJECT_FLAG_BOUND DUK_HEAPHDR_USER_FLAG(2)
41#define DUK_HOBJECT_FLAG_COMPILEDFUNCTION DUK_HEAPHDR_USER_FLAG(4)
42#define DUK_HOBJECT_FLAG_NATIVEFUNCTION DUK_HEAPHDR_USER_FLAG(5)
43#define DUK_HOBJECT_FLAG_BUFFEROBJECT DUK_HEAPHDR_USER_FLAG(6)
44#define DUK_HOBJECT_FLAG_THREAD DUK_HEAPHDR_USER_FLAG(7)
45#define DUK_HOBJECT_FLAG_ARRAY_PART DUK_HEAPHDR_USER_FLAG(8)
46#define DUK_HOBJECT_FLAG_STRICT DUK_HEAPHDR_USER_FLAG(9)
47#define DUK_HOBJECT_FLAG_NOTAIL DUK_HEAPHDR_USER_FLAG(10)
48#define DUK_HOBJECT_FLAG_NEWENV DUK_HEAPHDR_USER_FLAG(11)
49#define DUK_HOBJECT_FLAG_NAMEBINDING DUK_HEAPHDR_USER_FLAG(12)
50#define DUK_HOBJECT_FLAG_CREATEARGS DUK_HEAPHDR_USER_FLAG(13)
51#define DUK_HOBJECT_FLAG_ENVRECCLOSED DUK_HEAPHDR_USER_FLAG(14)
52#define DUK_HOBJECT_FLAG_EXOTIC_ARRAY DUK_HEAPHDR_USER_FLAG(15)
53#define DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ DUK_HEAPHDR_USER_FLAG(16)
54#define DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS DUK_HEAPHDR_USER_FLAG(17)
55#define DUK_HOBJECT_FLAG_EXOTIC_DUKFUNC DUK_HEAPHDR_USER_FLAG(18)
56#define DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ DUK_HEAPHDR_USER_FLAG(19)
58#define DUK_HOBJECT_FLAG_CLASS_BASE DUK_HEAPHDR_USER_FLAG_NUMBER(20)
59#define DUK_HOBJECT_FLAG_CLASS_BITS 5
61#define DUK_HOBJECT_GET_CLASS_NUMBER(h) \
62 DUK_HEAPHDR_GET_FLAG_RANGE(&(h)->hdr, DUK_HOBJECT_FLAG_CLASS_BASE, DUK_HOBJECT_FLAG_CLASS_BITS)
63#define DUK_HOBJECT_SET_CLASS_NUMBER(h,v) \
64 DUK_HEAPHDR_SET_FLAG_RANGE(&(h)->hdr, DUK_HOBJECT_FLAG_CLASS_BASE, DUK_HOBJECT_FLAG_CLASS_BITS, (v))
66#define DUK_HOBJECT_GET_CLASS_MASK(h) \
67 (1UL << DUK_HEAPHDR_GET_FLAG_RANGE(&(h)->hdr, DUK_HOBJECT_FLAG_CLASS_BASE, DUK_HOBJECT_FLAG_CLASS_BITS))
74#define DUK_HOBJECT_CLASS_AS_FLAGS(v) (((duk_uint_t) (v)) << DUK_HOBJECT_FLAG_CLASS_BASE)
77#define DUK_HOBJECT_CLASS_UNUSED 0
78#define DUK_HOBJECT_CLASS_ARGUMENTS 1
79#define DUK_HOBJECT_CLASS_ARRAY 2
80#define DUK_HOBJECT_CLASS_BOOLEAN 3
81#define DUK_HOBJECT_CLASS_DATE 4
82#define DUK_HOBJECT_CLASS_ERROR 5
83#define DUK_HOBJECT_CLASS_FUNCTION 6
84#define DUK_HOBJECT_CLASS_JSON 7
85#define DUK_HOBJECT_CLASS_MATH 8
86#define DUK_HOBJECT_CLASS_NUMBER 9
87#define DUK_HOBJECT_CLASS_OBJECT 10
88#define DUK_HOBJECT_CLASS_REGEXP 11
89#define DUK_HOBJECT_CLASS_STRING 12
90#define DUK_HOBJECT_CLASS_GLOBAL 13
91#define DUK_HOBJECT_CLASS_OBJENV 14
92#define DUK_HOBJECT_CLASS_DECENV 15
93#define DUK_HOBJECT_CLASS_BUFFER 16
94#define DUK_HOBJECT_CLASS_POINTER 17
95#define DUK_HOBJECT_CLASS_THREAD 18
96#define DUK_HOBJECT_CLASS_ARRAYBUFFER 19
97#define DUK_HOBJECT_CLASS_DATAVIEW 20
98#define DUK_HOBJECT_CLASS_INT8ARRAY 21
99#define DUK_HOBJECT_CLASS_UINT8ARRAY 22
100#define DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY 23
101#define DUK_HOBJECT_CLASS_INT16ARRAY 24
102#define DUK_HOBJECT_CLASS_UINT16ARRAY 25
103#define DUK_HOBJECT_CLASS_INT32ARRAY 26
104#define DUK_HOBJECT_CLASS_UINT32ARRAY 27
105#define DUK_HOBJECT_CLASS_FLOAT32ARRAY 28
106#define DUK_HOBJECT_CLASS_FLOAT64ARRAY 29
107#define DUK_HOBJECT_CLASS_MAX 29
110#define DUK_HOBJECT_CMASK_ALL ((1UL << (DUK_HOBJECT_CLASS_MAX + 1)) - 1UL)
111#define DUK_HOBJECT_CMASK_UNUSED (1UL << DUK_HOBJECT_CLASS_UNUSED)
112#define DUK_HOBJECT_CMASK_ARGUMENTS (1UL << DUK_HOBJECT_CLASS_ARGUMENTS)
113#define DUK_HOBJECT_CMASK_ARRAY (1UL << DUK_HOBJECT_CLASS_ARRAY)
114#define DUK_HOBJECT_CMASK_BOOLEAN (1UL << DUK_HOBJECT_CLASS_BOOLEAN)
115#define DUK_HOBJECT_CMASK_DATE (1UL << DUK_HOBJECT_CLASS_DATE)
116#define DUK_HOBJECT_CMASK_ERROR (1UL << DUK_HOBJECT_CLASS_ERROR)
117#define DUK_HOBJECT_CMASK_FUNCTION (1UL << DUK_HOBJECT_CLASS_FUNCTION)
118#define DUK_HOBJECT_CMASK_JSON (1UL << DUK_HOBJECT_CLASS_JSON)
119#define DUK_HOBJECT_CMASK_MATH (1UL << DUK_HOBJECT_CLASS_MATH)
120#define DUK_HOBJECT_CMASK_NUMBER (1UL << DUK_HOBJECT_CLASS_NUMBER)
121#define DUK_HOBJECT_CMASK_OBJECT (1UL << DUK_HOBJECT_CLASS_OBJECT)
122#define DUK_HOBJECT_CMASK_REGEXP (1UL << DUK_HOBJECT_CLASS_REGEXP)
123#define DUK_HOBJECT_CMASK_STRING (1UL << DUK_HOBJECT_CLASS_STRING)
124#define DUK_HOBJECT_CMASK_GLOBAL (1UL << DUK_HOBJECT_CLASS_GLOBAL)
125#define DUK_HOBJECT_CMASK_OBJENV (1UL << DUK_HOBJECT_CLASS_OBJENV)
126#define DUK_HOBJECT_CMASK_DECENV (1UL << DUK_HOBJECT_CLASS_DECENV)
127#define DUK_HOBJECT_CMASK_BUFFER (1UL << DUK_HOBJECT_CLASS_BUFFER)
128#define DUK_HOBJECT_CMASK_POINTER (1UL << DUK_HOBJECT_CLASS_POINTER)
129#define DUK_HOBJECT_CMASK_THREAD (1UL << DUK_HOBJECT_CLASS_THREAD)
130#define DUK_HOBJECT_CMASK_ARRAYBUFFER (1UL << DUK_HOBJECT_CLASS_ARRAYBUFFER)
131#define DUK_HOBJECT_CMASK_DATAVIEW (1UL << DUK_HOBJECT_CLASS_DATAVIEW)
132#define DUK_HOBJECT_CMASK_INT8ARRAY (1UL << DUK_HOBJECT_CLASS_INT8ARRAY)
133#define DUK_HOBJECT_CMASK_UINT8ARRAY (1UL << DUK_HOBJECT_CLASS_UINT8ARRAY)
134#define DUK_HOBJECT_CMASK_UINT8CLAMPEDARRAY (1UL << DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY)
135#define DUK_HOBJECT_CMASK_INT16ARRAY (1UL << DUK_HOBJECT_CLASS_INT16ARRAY)
136#define DUK_HOBJECT_CMASK_UINT16ARRAY (1UL << DUK_HOBJECT_CLASS_UINT16ARRAY)
137#define DUK_HOBJECT_CMASK_INT32ARRAY (1UL << DUK_HOBJECT_CLASS_INT32ARRAY)
138#define DUK_HOBJECT_CMASK_UINT32ARRAY (1UL << DUK_HOBJECT_CLASS_UINT32ARRAY)
139#define DUK_HOBJECT_CMASK_FLOAT32ARRAY (1UL << DUK_HOBJECT_CLASS_FLOAT32ARRAY)
140#define DUK_HOBJECT_CMASK_FLOAT64ARRAY (1UL << DUK_HOBJECT_CLASS_FLOAT64ARRAY)
142#define DUK_HOBJECT_CMASK_ALL_BUFFEROBJECTS \
143 (DUK_HOBJECT_CMASK_BUFFER | \
144 DUK_HOBJECT_CMASK_ARRAYBUFFER | \
145 DUK_HOBJECT_CMASK_DATAVIEW | \
146 DUK_HOBJECT_CMASK_INT8ARRAY | \
147 DUK_HOBJECT_CMASK_UINT8ARRAY | \
148 DUK_HOBJECT_CMASK_UINT8CLAMPEDARRAY | \
149 DUK_HOBJECT_CMASK_INT16ARRAY | \
150 DUK_HOBJECT_CMASK_UINT16ARRAY | \
151 DUK_HOBJECT_CMASK_INT32ARRAY | \
152 DUK_HOBJECT_CMASK_UINT32ARRAY | \
153 DUK_HOBJECT_CMASK_FLOAT32ARRAY | \
154 DUK_HOBJECT_CMASK_FLOAT64ARRAY)
156#define DUK_HOBJECT_IS_OBJENV(h) (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_OBJENV)
157#define DUK_HOBJECT_IS_DECENV(h) (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_DECENV)
158#define DUK_HOBJECT_IS_ENV(h) (DUK_HOBJECT_IS_OBJENV((h)) || DUK_HOBJECT_IS_DECENV((h)))
159#define DUK_HOBJECT_IS_ARRAY(h) (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_ARRAY)
160#define DUK_HOBJECT_IS_COMPILEDFUNCTION(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPILEDFUNCTION)
161#define DUK_HOBJECT_IS_NATIVEFUNCTION(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATIVEFUNCTION)
162#define DUK_HOBJECT_IS_BUFFEROBJECT(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFFEROBJECT)
163#define DUK_HOBJECT_IS_THREAD(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_THREAD)
165#define DUK_HOBJECT_IS_NONBOUND_FUNCTION(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, \
166 DUK_HOBJECT_FLAG_COMPILEDFUNCTION | \
167 DUK_HOBJECT_FLAG_NATIVEFUNCTION)
169#define DUK_HOBJECT_IS_FUNCTION(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, \
170 DUK_HOBJECT_FLAG_BOUND | \
171 DUK_HOBJECT_FLAG_COMPILEDFUNCTION | \
172 DUK_HOBJECT_FLAG_NATIVEFUNCTION)
174#define DUK_HOBJECT_IS_CALLABLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, \
175 DUK_HOBJECT_FLAG_BOUND | \
176 DUK_HOBJECT_FLAG_COMPILEDFUNCTION | \
177 DUK_HOBJECT_FLAG_NATIVEFUNCTION)
180#define DUK_HOBJECT_EXOTIC_BEHAVIOR_FLAGS (DUK_HOBJECT_FLAG_EXOTIC_ARRAY | \
181 DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS | \
182 DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ | \
183 DUK_HOBJECT_FLAG_EXOTIC_DUKFUNC | \
184 DUK_HOBJECT_FLAG_BUFFEROBJECT | \
185 DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ)
187#define DUK_HOBJECT_HAS_EXOTIC_BEHAVIOR(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_EXOTIC_BEHAVIOR_FLAGS)
189#define DUK_HOBJECT_HAS_EXTENSIBLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXTENSIBLE)
190#define DUK_HOBJECT_HAS_CONSTRUCTABLE(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CONSTRUCTABLE)
191#define DUK_HOBJECT_HAS_BOUND(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUND)
192#define DUK_HOBJECT_HAS_COMPILEDFUNCTION(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPILEDFUNCTION)
193#define DUK_HOBJECT_HAS_NATIVEFUNCTION(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATIVEFUNCTION)
194#define DUK_HOBJECT_HAS_BUFFEROBJECT(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFFEROBJECT)
195#define DUK_HOBJECT_HAS_THREAD(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_THREAD)
196#define DUK_HOBJECT_HAS_ARRAY_PART(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_ARRAY_PART)
197#define DUK_HOBJECT_HAS_STRICT(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_STRICT)
198#define DUK_HOBJECT_HAS_NOTAIL(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NOTAIL)
199#define DUK_HOBJECT_HAS_NEWENV(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NEWENV)
200#define DUK_HOBJECT_HAS_NAMEBINDING(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NAMEBINDING)
201#define DUK_HOBJECT_HAS_CREATEARGS(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CREATEARGS)
202#define DUK_HOBJECT_HAS_ENVRECCLOSED(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_ENVRECCLOSED)
203#define DUK_HOBJECT_HAS_EXOTIC_ARRAY(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARRAY)
204#define DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ)
205#define DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS)
206#define DUK_HOBJECT_HAS_EXOTIC_DUKFUNC(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_DUKFUNC)
207#define DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(h) DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ)
209#define DUK_HOBJECT_SET_EXTENSIBLE(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXTENSIBLE)
210#define DUK_HOBJECT_SET_CONSTRUCTABLE(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CONSTRUCTABLE)
211#define DUK_HOBJECT_SET_BOUND(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUND)
212#define DUK_HOBJECT_SET_COMPILEDFUNCTION(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPILEDFUNCTION)
213#define DUK_HOBJECT_SET_NATIVEFUNCTION(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATIVEFUNCTION)
214#define DUK_HOBJECT_SET_BUFFEROBJECT(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFFEROBJECT)
215#define DUK_HOBJECT_SET_THREAD(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_THREAD)
216#define DUK_HOBJECT_SET_ARRAY_PART(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_ARRAY_PART)
217#define DUK_HOBJECT_SET_STRICT(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_STRICT)
218#define DUK_HOBJECT_SET_NOTAIL(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NOTAIL)
219#define DUK_HOBJECT_SET_NEWENV(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NEWENV)
220#define DUK_HOBJECT_SET_NAMEBINDING(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NAMEBINDING)
221#define DUK_HOBJECT_SET_CREATEARGS(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CREATEARGS)
222#define DUK_HOBJECT_SET_ENVRECCLOSED(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_ENVRECCLOSED)
223#define DUK_HOBJECT_SET_EXOTIC_ARRAY(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARRAY)
224#define DUK_HOBJECT_SET_EXOTIC_STRINGOBJ(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ)
225#define DUK_HOBJECT_SET_EXOTIC_ARGUMENTS(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS)
226#define DUK_HOBJECT_SET_EXOTIC_DUKFUNC(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_DUKFUNC)
227#define DUK_HOBJECT_SET_EXOTIC_PROXYOBJ(h) DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ)
229#define DUK_HOBJECT_CLEAR_EXTENSIBLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXTENSIBLE)
230#define DUK_HOBJECT_CLEAR_CONSTRUCTABLE(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CONSTRUCTABLE)
231#define DUK_HOBJECT_CLEAR_BOUND(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUND)
232#define DUK_HOBJECT_CLEAR_COMPILEDFUNCTION(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPILEDFUNCTION)
233#define DUK_HOBJECT_CLEAR_NATIVEFUNCTION(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATIVEFUNCTION)
234#define DUK_HOBJECT_CLEAR_BUFFEROBJECT(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFFEROBJECT)
235#define DUK_HOBJECT_CLEAR_THREAD(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_THREAD)
236#define DUK_HOBJECT_CLEAR_ARRAY_PART(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_ARRAY_PART)
237#define DUK_HOBJECT_CLEAR_STRICT(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_STRICT)
238#define DUK_HOBJECT_CLEAR_NOTAIL(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NOTAIL)
239#define DUK_HOBJECT_CLEAR_NEWENV(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NEWENV)
240#define DUK_HOBJECT_CLEAR_NAMEBINDING(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NAMEBINDING)
241#define DUK_HOBJECT_CLEAR_CREATEARGS(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CREATEARGS)
242#define DUK_HOBJECT_CLEAR_ENVRECCLOSED(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_ENVRECCLOSED)
243#define DUK_HOBJECT_CLEAR_EXOTIC_ARRAY(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARRAY)
244#define DUK_HOBJECT_CLEAR_EXOTIC_STRINGOBJ(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ)
245#define DUK_HOBJECT_CLEAR_EXOTIC_ARGUMENTS(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS)
246#define DUK_HOBJECT_CLEAR_EXOTIC_DUKFUNC(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_DUKFUNC)
247#define DUK_HOBJECT_CLEAR_EXOTIC_PROXYOBJ(h) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ)
250#define DUK_PROPDESC_FLAG_WRITABLE (1 << 0)
251#define DUK_PROPDESC_FLAG_ENUMERABLE (1 << 1)
252#define DUK_PROPDESC_FLAG_CONFIGURABLE (1 << 2)
253#define DUK_PROPDESC_FLAG_ACCESSOR (1 << 3)
254#define DUK_PROPDESC_FLAG_VIRTUAL (1 << 4)
257#define DUK_PROPDESC_FLAGS_MASK (DUK_PROPDESC_FLAG_WRITABLE | \
258 DUK_PROPDESC_FLAG_ENUMERABLE | \
259 DUK_PROPDESC_FLAG_CONFIGURABLE | \
260 DUK_PROPDESC_FLAG_ACCESSOR)
265#define DUK_PROPDESC_FLAG_NO_OVERWRITE (1 << 4)
268#define DUK_PROPDESC_FLAGS_NONE 0
269#define DUK_PROPDESC_FLAGS_W (DUK_PROPDESC_FLAG_WRITABLE)
270#define DUK_PROPDESC_FLAGS_E (DUK_PROPDESC_FLAG_ENUMERABLE)
271#define DUK_PROPDESC_FLAGS_C (DUK_PROPDESC_FLAG_CONFIGURABLE)
272#define DUK_PROPDESC_FLAGS_WE (DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_ENUMERABLE)
273#define DUK_PROPDESC_FLAGS_WC (DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_CONFIGURABLE)
274#define DUK_PROPDESC_FLAGS_EC (DUK_PROPDESC_FLAG_ENUMERABLE | DUK_PROPDESC_FLAG_CONFIGURABLE)
275#define DUK_PROPDESC_FLAGS_WEC (DUK_PROPDESC_FLAG_WRITABLE | \
276 DUK_PROPDESC_FLAG_ENUMERABLE | \
277 DUK_PROPDESC_FLAG_CONFIGURABLE)
280#define DUK_GETDESC_FLAG_PUSH_VALUE (1 << 0)
281#define DUK_GETDESC_FLAG_IGNORE_PROTOLOOP (1 << 1)
289#define DUK_ASSERT_HOBJECT_VALID(h) do { \
290 DUK_ASSERT((h) != NULL); \
291 DUK_ASSERT(!DUK_HOBJECT_IS_CALLABLE((h)) || \
292 DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_FUNCTION); \
293 DUK_ASSERT(!DUK_HOBJECT_IS_BUFFEROBJECT((h)) || \
294 (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_BUFFER || \
295 DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_ARRAYBUFFER || \
296 DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_DATAVIEW || \
297 DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_INT8ARRAY || \
298 DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT8ARRAY || \
299 DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY || \
300 DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_INT16ARRAY || \
301 DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT16ARRAY || \
302 DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_INT32ARRAY || \
303 DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT32ARRAY || \
304 DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_FLOAT32ARRAY || \
305 DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_FLOAT64ARRAY)); \
312#if defined(DUK_USE_HEAPPTR16)
313#define DUK_HOBJECT_GET_PROPS(heap,h) \
314 ((duk_uint8_t *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, ((duk_heaphdr *) (h))->h_extra16))
315#define DUK_HOBJECT_SET_PROPS(heap,h,x) do { \
316 ((duk_heaphdr *) (h))->h_extra16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (x)); \
319#define DUK_HOBJECT_GET_PROPS(heap,h) \
321#define DUK_HOBJECT_SET_PROPS(heap,h,x) do { \
322 (h)->props = (duk_uint8_t *) (x); \
326#if defined(DUK_USE_HOBJECT_LAYOUT_1)
328#define DUK_HOBJECT_E_GET_KEY_BASE(heap,h) \
329 ((duk_hstring **) (void *) ( \
330 DUK_HOBJECT_GET_PROPS((heap), (h)) \
332#define DUK_HOBJECT_E_GET_VALUE_BASE(heap,h) \
333 ((duk_propvalue *) (void *) ( \
334 DUK_HOBJECT_GET_PROPS((heap), (h)) + \
335 DUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_hstring *) \
337#define DUK_HOBJECT_E_GET_FLAGS_BASE(heap,h) \
338 ((duk_uint8_t *) (void *) ( \
339 DUK_HOBJECT_GET_PROPS((heap), (h)) + DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue)) \
341#define DUK_HOBJECT_A_GET_BASE(heap,h) \
342 ((duk_tval *) (void *) ( \
343 DUK_HOBJECT_GET_PROPS((heap), (h)) + \
344 DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) \
346#define DUK_HOBJECT_H_GET_BASE(heap,h) \
347 ((duk_uint32_t *) (void *) ( \
348 DUK_HOBJECT_GET_PROPS((heap), (h)) + \
349 DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \
350 DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \
352#define DUK_HOBJECT_P_COMPUTE_SIZE(n_ent,n_arr,n_hash) \
354 (n_ent) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \
355 (n_arr) * sizeof(duk_tval) + \
356 (n_hash) * sizeof(duk_uint32_t) \
358#define DUK_HOBJECT_P_SET_REALLOC_PTRS(p_base,set_e_k,set_e_pv,set_e_f,set_a,set_h,n_ent,n_arr,n_hash) do { \
359 (set_e_k) = (duk_hstring **) (void *) (p_base); \
360 (set_e_pv) = (duk_propvalue *) (void *) ((set_e_k) + (n_ent)); \
361 (set_e_f) = (duk_uint8_t *) (void *) ((set_e_pv) + (n_ent)); \
362 (set_a) = (duk_tval *) (void *) ((set_e_f) + (n_ent)); \
363 (set_h) = (duk_uint32_t *) (void *) ((set_a) + (n_arr)); \
365#elif defined(DUK_USE_HOBJECT_LAYOUT_2)
367#if (DUK_USE_ALIGN_BY == 4)
368#define DUK_HOBJECT_E_FLAG_PADDING(e_sz) ((4 - (e_sz)) & 0x03)
369#elif (DUK_USE_ALIGN_BY == 8)
370#define DUK_HOBJECT_E_FLAG_PADDING(e_sz) ((8 - (e_sz)) & 0x07)
371#elif (DUK_USE_ALIGN_BY == 1)
372#define DUK_HOBJECT_E_FLAG_PADDING(e_sz) 0
374#error invalid DUK_USE_ALIGN_BY
376#define DUK_HOBJECT_E_GET_KEY_BASE(heap,h) \
377 ((duk_hstring **) (void *) ( \
378 DUK_HOBJECT_GET_PROPS((heap), (h)) + \
379 DUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_propvalue) \
381#define DUK_HOBJECT_E_GET_VALUE_BASE(heap,h) \
382 ((duk_propvalue *) (void *) ( \
383 DUK_HOBJECT_GET_PROPS((heap), (h)) \
385#define DUK_HOBJECT_E_GET_FLAGS_BASE(heap,h) \
386 ((duk_uint8_t *) (void *) ( \
387 DUK_HOBJECT_GET_PROPS((heap), (h)) + DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue)) \
389#define DUK_HOBJECT_A_GET_BASE(heap,h) \
390 ((duk_tval *) (void *) ( \
391 DUK_HOBJECT_GET_PROPS((heap), (h)) + \
392 DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \
393 DUK_HOBJECT_E_FLAG_PADDING(DUK_HOBJECT_GET_ESIZE((h))) \
395#define DUK_HOBJECT_H_GET_BASE(heap,h) \
396 ((duk_uint32_t *) (void *) ( \
397 DUK_HOBJECT_GET_PROPS((heap), (h)) + \
398 DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \
399 DUK_HOBJECT_E_FLAG_PADDING(DUK_HOBJECT_GET_ESIZE((h))) + \
400 DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \
402#define DUK_HOBJECT_P_COMPUTE_SIZE(n_ent,n_arr,n_hash) \
404 (n_ent) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \
405 DUK_HOBJECT_E_FLAG_PADDING((n_ent)) + \
406 (n_arr) * sizeof(duk_tval) + \
407 (n_hash) * sizeof(duk_uint32_t) \
409#define DUK_HOBJECT_P_SET_REALLOC_PTRS(p_base,set_e_k,set_e_pv,set_e_f,set_a,set_h,n_ent,n_arr,n_hash) do { \
410 (set_e_pv) = (duk_propvalue *) (void *) (p_base); \
411 (set_e_k) = (duk_hstring **) (void *) ((set_e_pv) + (n_ent)); \
412 (set_e_f) = (duk_uint8_t *) (void *) ((set_e_k) + (n_ent)); \
413 (set_a) = (duk_tval *) (void *) (((duk_uint8_t *) (set_e_f)) + \
414 sizeof(duk_uint8_t) * (n_ent) + \
415 DUK_HOBJECT_E_FLAG_PADDING((n_ent))); \
416 (set_h) = (duk_uint32_t *) (void *) ((set_a) + (n_arr)); \
418#elif defined(DUK_USE_HOBJECT_LAYOUT_3)
420#define DUK_HOBJECT_E_GET_KEY_BASE(heap,h) \
421 ((duk_hstring **) (void *) ( \
422 DUK_HOBJECT_GET_PROPS((heap), (h)) + \
423 DUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_propvalue) + \
424 DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \
426#define DUK_HOBJECT_E_GET_VALUE_BASE(heap,h) \
427 ((duk_propvalue *) (void *) ( \
428 DUK_HOBJECT_GET_PROPS((heap), (h)) \
430#define DUK_HOBJECT_E_GET_FLAGS_BASE(heap,h) \
431 ((duk_uint8_t *) (void *) ( \
432 DUK_HOBJECT_GET_PROPS((heap), (h)) + \
433 DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_propvalue) + sizeof(duk_hstring *)) + \
434 DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) + \
435 DUK_HOBJECT_GET_HSIZE((h)) * sizeof(duk_uint32_t) \
437#define DUK_HOBJECT_A_GET_BASE(heap,h) \
438 ((duk_tval *) (void *) ( \
439 DUK_HOBJECT_GET_PROPS((heap), (h)) + \
440 DUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_propvalue) \
442#define DUK_HOBJECT_H_GET_BASE(heap,h) \
443 ((duk_uint32_t *) (void *) ( \
444 DUK_HOBJECT_GET_PROPS((heap), (h)) + \
445 DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_propvalue) + sizeof(duk_hstring *)) + \
446 DUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \
448#define DUK_HOBJECT_P_COMPUTE_SIZE(n_ent,n_arr,n_hash) \
450 (n_ent) * (sizeof(duk_propvalue) + sizeof(duk_hstring *) + sizeof(duk_uint8_t)) + \
451 (n_arr) * sizeof(duk_tval) + \
452 (n_hash) * sizeof(duk_uint32_t) \
454#define DUK_HOBJECT_P_SET_REALLOC_PTRS(p_base,set_e_k,set_e_pv,set_e_f,set_a,set_h,n_ent,n_arr,n_hash) do { \
455 (set_e_pv) = (duk_propvalue *) (void *) (p_base); \
456 (set_a) = (duk_tval *) (void *) ((set_e_pv) + (n_ent)); \
457 (set_e_k) = (duk_hstring **) (void *) ((set_a) + (n_arr)); \
458 (set_h) = (duk_uint32_t *) (void *) ((set_e_k) + (n_ent)); \
459 (set_e_f) = (duk_uint8_t *) (void *) ((set_h) + (n_hash)); \
462#error invalid hobject layout defines
465#define DUK_HOBJECT_P_ALLOC_SIZE(h) \
466 DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE((h)), DUK_HOBJECT_GET_ASIZE((h)), DUK_HOBJECT_GET_HSIZE((h)))
468#define DUK_HOBJECT_E_GET_KEY(heap,h,i) (DUK_HOBJECT_E_GET_KEY_BASE((heap), (h))[(i)])
469#define DUK_HOBJECT_E_GET_KEY_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_KEY_BASE((heap), (h))[(i)])
470#define DUK_HOBJECT_E_GET_VALUE(heap,h,i) (DUK_HOBJECT_E_GET_VALUE_BASE((heap), (h))[(i)])
471#define DUK_HOBJECT_E_GET_VALUE_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_VALUE_BASE((heap), (h))[(i)])
472#define DUK_HOBJECT_E_GET_VALUE_TVAL(heap,h,i) (DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).v)
473#define DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).v)
474#define DUK_HOBJECT_E_GET_VALUE_GETTER(heap,h,i) (DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.get)
475#define DUK_HOBJECT_E_GET_VALUE_GETTER_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.get)
476#define DUK_HOBJECT_E_GET_VALUE_SETTER(heap,h,i) (DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.set)
477#define DUK_HOBJECT_E_GET_VALUE_SETTER_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.set)
478#define DUK_HOBJECT_E_GET_FLAGS(heap,h,i) (DUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)])
479#define DUK_HOBJECT_E_GET_FLAGS_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)])
480#define DUK_HOBJECT_A_GET_VALUE(heap,h,i) (DUK_HOBJECT_A_GET_BASE((heap), (h))[(i)])
481#define DUK_HOBJECT_A_GET_VALUE_PTR(heap,h,i) (&DUK_HOBJECT_A_GET_BASE((heap), (h))[(i)])
482#define DUK_HOBJECT_H_GET_INDEX(heap,h,i) (DUK_HOBJECT_H_GET_BASE((heap), (h))[(i)])
483#define DUK_HOBJECT_H_GET_INDEX_PTR(heap,h,i) (&DUK_HOBJECT_H_GET_BASE((heap), (h))[(i)])
485#define DUK_HOBJECT_E_SET_KEY(heap,h,i,k) do { \
486 DUK_HOBJECT_E_GET_KEY((heap), (h), (i)) = (k); \
488#define DUK_HOBJECT_E_SET_VALUE(heap,h,i,v) do { \
489 DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)) = (v); \
491#define DUK_HOBJECT_E_SET_VALUE_TVAL(heap,h,i,v) do { \
492 DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).v = (v); \
494#define DUK_HOBJECT_E_SET_VALUE_GETTER(heap,h,i,v) do { \
495 DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.get = (v); \
497#define DUK_HOBJECT_E_SET_VALUE_SETTER(heap,h,i,v) do { \
498 DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.set = (v); \
500#define DUK_HOBJECT_E_SET_FLAGS(heap,h,i,f) do { \
501 DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) = (duk_uint8_t) (f); \
503#define DUK_HOBJECT_A_SET_VALUE(heap,h,i,v) do { \
504 DUK_HOBJECT_A_GET_VALUE((heap), (h), (i)) = (v); \
506#define DUK_HOBJECT_A_SET_VALUE_TVAL(heap,h,i,v) \
507 DUK_HOBJECT_A_SET_VALUE((heap), (h), (i), (v))
508#define DUK_HOBJECT_H_SET_INDEX(heap,h,i,v) do { \
509 DUK_HOBJECT_H_GET_INDEX((heap), (h), (i)) = (v); \
512#define DUK_HOBJECT_E_SET_FLAG_BITS(heap,h,i,mask) do { \
513 DUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)] |= (mask); \
516#define DUK_HOBJECT_E_CLEAR_FLAG_BITS(heap,h,i,mask) do { \
517 DUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)] &= ~(mask); \
520#define DUK_HOBJECT_E_SLOT_IS_WRITABLE(heap,h,i) ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_WRITABLE) != 0)
521#define DUK_HOBJECT_E_SLOT_IS_ENUMERABLE(heap,h,i) ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_ENUMERABLE) != 0)
522#define DUK_HOBJECT_E_SLOT_IS_CONFIGURABLE(heap,h,i) ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_CONFIGURABLE) != 0)
523#define DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap,h,i) ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_ACCESSOR) != 0)
525#define DUK_HOBJECT_E_SLOT_SET_WRITABLE(heap,h,i) DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_WRITABLE)
526#define DUK_HOBJECT_E_SLOT_SET_ENUMERABLE(heap,h,i) DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ENUMERABLE)
527#define DUK_HOBJECT_E_SLOT_SET_CONFIGURABLE(heap,h,i) DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_CONFIGURABLE)
528#define DUK_HOBJECT_E_SLOT_SET_ACCESSOR(heap,h,i) DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ACCESSOR)
530#define DUK_HOBJECT_E_SLOT_CLEAR_WRITABLE(heap,h,i) DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_WRITABLE)
531#define DUK_HOBJECT_E_SLOT_CLEAR_ENUMERABLE(heap,h,i) DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ENUMERABLE)
532#define DUK_HOBJECT_E_SLOT_CLEAR_CONFIGURABLE(heap,h,i) DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_CONFIGURABLE)
533#define DUK_HOBJECT_E_SLOT_CLEAR_ACCESSOR(heap,h,i) DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ACCESSOR)
535#define DUK_PROPDESC_IS_WRITABLE(p) (((p)->flags & DUK_PROPDESC_FLAG_WRITABLE) != 0)
536#define DUK_PROPDESC_IS_ENUMERABLE(p) (((p)->flags & DUK_PROPDESC_FLAG_ENUMERABLE) != 0)
537#define DUK_PROPDESC_IS_CONFIGURABLE(p) (((p)->flags & DUK_PROPDESC_FLAG_CONFIGURABLE) != 0)
538#define DUK_PROPDESC_IS_ACCESSOR(p) (((p)->flags & DUK_PROPDESC_FLAG_ACCESSOR) != 0)
540#define DUK_HOBJECT_HASHIDX_UNUSED 0xffffffffUL
541#define DUK_HOBJECT_HASHIDX_DELETED 0xfffffffeUL
547#if defined(DUK_USE_OBJSIZES16)
548#define DUK_HOBJECT_GET_ESIZE(h) ((h)->e_size16)
549#define DUK_HOBJECT_SET_ESIZE(h,v) do { (h)->e_size16 = (v); } while (0)
550#define DUK_HOBJECT_GET_ENEXT(h) ((h)->e_next16)
551#define DUK_HOBJECT_SET_ENEXT(h,v) do { (h)->e_next16 = (v); } while (0)
552#define DUK_HOBJECT_POSTINC_ENEXT(h) ((h)->e_next16++)
553#define DUK_HOBJECT_GET_ASIZE(h) ((h)->a_size16)
554#define DUK_HOBJECT_SET_ASIZE(h,v) do { (h)->a_size16 = (v); } while (0)
555#if defined(DUK_USE_HOBJECT_HASH_PART)
556#define DUK_HOBJECT_GET_HSIZE(h) ((h)->h_size16)
557#define DUK_HOBJECT_SET_HSIZE(h,v) do { (h)->h_size16 = (v); } while (0)
559#define DUK_HOBJECT_GET_HSIZE(h) 0
560#define DUK_HOBJECT_SET_HSIZE(h,v) do { DUK_ASSERT((v) == 0); } while (0)
563#define DUK_HOBJECT_GET_ESIZE(h) ((h)->e_size)
564#define DUK_HOBJECT_SET_ESIZE(h,v) do { (h)->e_size = (v); } while (0)
565#define DUK_HOBJECT_GET_ENEXT(h) ((h)->e_next)
566#define DUK_HOBJECT_SET_ENEXT(h,v) do { (h)->e_next = (v); } while (0)
567#define DUK_HOBJECT_POSTINC_ENEXT(h) ((h)->e_next++)
568#define DUK_HOBJECT_GET_ASIZE(h) ((h)->a_size)
569#define DUK_HOBJECT_SET_ASIZE(h,v) do { (h)->a_size = (v); } while (0)
570#if defined(DUK_USE_HOBJECT_HASH_PART)
571#define DUK_HOBJECT_GET_HSIZE(h) ((h)->h_size)
572#define DUK_HOBJECT_SET_HSIZE(h,v) do { (h)->h_size = (v); } while (0)
574#define DUK_HOBJECT_GET_HSIZE(h) 0
575#define DUK_HOBJECT_SET_HSIZE(h,v) do { DUK_ASSERT((v) == 0); } while (0)
586#define DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY 10000L
589#define DUK_HOBJECT_BOUND_CHAIN_SANITY 10000L
596#define DUK_HOBJECT_CLASS_NUMBER_TO_STRIDX(n) duk_class_number_to_stridx[(n)]
598#define DUK_HOBJECT_GET_CLASS_STRING(heap,h) \
599 DUK_HEAP_GET_STRING( \
601 DUK_HOBJECT_CLASS_NUMBER_TO_STRIDX(DUK_HOBJECT_GET_CLASS_NUMBER((h))) \
608#if defined(DUK_USE_HEAPPTR16)
609#define DUK_HOBJECT_GET_PROTOTYPE(heap,h) \
610 ((duk_hobject *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->prototype16))
611#define DUK_HOBJECT_SET_PROTOTYPE(heap,h,x) do { \
612 (h)->prototype16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (x)); \
615#define DUK_HOBJECT_GET_PROTOTYPE(heap,h) \
617#define DUK_HOBJECT_SET_PROTOTYPE(heap,h,x) do { \
618 (h)->prototype = (x); \
623#define DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr,h,p) duk_hobject_set_prototype_updref((thr), (h), (p))
635#if defined(DUK_USE_OBJSIZES16)
636#define DUK_HOBJECT_MAX_PROPERTIES 0x0000ffffUL
638#define DUK_HOBJECT_MAX_PROPERTIES 0x7fffffffUL
642#define DUK_HOBJECT_E_USE_HASH_LIMIT 32
645#define DUK_HOBJECT_H_SIZE_DIVISOR 4
648#define DUK_HOBJECT_A_FAST_RESIZE_LIMIT 9
652#define DUK_HOBJECT_A_ABANDON_LIMIT 2
655#if (DUK_USE_ALIGN_BY == 4)
656#define DUK_HOBJECT_ALIGN_TARGET 4
657#elif (DUK_USE_ALIGN_BY == 8)
658#define DUK_HOBJECT_ALIGN_TARGET 8
659#elif (DUK_USE_ALIGN_BY == 1)
660#define DUK_HOBJECT_ALIGN_TARGET 1
662#error invalid DUK_USE_ALIGN_BY
666#define DUK_HOBJECT_E_MIN_GROW_ADD 16
667#define DUK_HOBJECT_E_MIN_GROW_DIVISOR 8
670#define DUK_HOBJECT_A_MIN_GROW_ADD 16
671#define DUK_HOBJECT_A_MIN_GROW_DIVISOR 8
674#define DUK_HOBJECT_HASH_INITIAL(hash,h_size) ((hash) % (h_size))
675#define DUK_HOBJECT_HASH_PROBE_STEP(hash) DUK_UTIL_GET_HASH_PROBE_STEP((hash))
681#define DUK_PC2LINE_SKIP 64
684#define DUK_PC2LINE_MAX_DIFF_LENGTH (((DUK_PC2LINE_SKIP - 1) * 35 + 7) / 8)
785#if defined(DUK_USE_HEAPPTR16)
794#if defined(DUK_USE_HEAPPTR16)
795 duk_uint16_t prototype16;
800#if defined(DUK_USE_OBJSIZES16)
801 duk_uint16_t e_size16;
802 duk_uint16_t e_next16;
803 duk_uint16_t a_size16;
804#if defined(DUK_USE_HOBJECT_HASH_PART)
805 duk_uint16_t h_size16;
811#if defined(DUK_USE_HOBJECT_HASH_PART)
821#if !defined(DUK_SINGLE_FILE)
849#define duk_hobject_get_internal_value_tval_ptr(heap,obj) \
850 duk_hobject_find_existing_entry_tval_ptr((heap), (obj), DUK_HEAP_STRING_INT_VALUE((heap)))
859#define DUK_DELPROP_FLAG_THROW (1 << 0)
860#define DUK_DELPROP_FLAG_FORCE (1 << 1)
901#if defined(DUK_USE_ES6_PROXY)
918#if defined(DUK_USE_PC2LINE)
unsigned int duk_small_uint_t
duk_small_int_t duk_ret_t
#define DUK_INTERNAL_DECL
duk_int_fast32_t duk_int_t
duk_uint_fast32_t duk_uint_t
duk_small_int_t duk_bool_t
duk_uint32_t duk_uint_fast32_t
DUK_INTERNAL_DECL void duk_hobject_pc2line_pack(duk_hthread *thr, duk_compiler_instr *instrs, duk_uint_fast32_t length)
DUK_INTERNAL_DECL duk_hobject * duk_hobject_resolve_proxy_target(duk_hthread *thr, duk_hobject *obj)
DUK_INTERNAL_DECL duk_uint_fast32_t duk_hobject_pc2line_query(duk_context *ctx, duk_idx_t idx_func, duk_uint_fast32_t pc)
DUK_INTERNAL_DECL duk_bool_t duk_hobject_proxy_check(duk_hthread *thr, duk_hobject *obj, duk_hobject **out_target, duk_hobject **out_handler)
DUK_INTERNAL_DECL duk_hobject * duk_hobject_alloc(duk_heap *heap, duk_uint_t hobject_flags)
DUK_INTERNAL_DECL duk_bool_t duk_hobject_object_ownprop_helper(duk_context *ctx, duk_small_uint_t required_desc_flags)
DUK_INTERNAL_DECL duk_ret_t duk_hobject_object_get_own_property_descriptor(duk_context *ctx)
DUK_INTERNAL duk_hbufferobject * duk_hbufferobject_alloc(duk_heap *heap, duk_uint_t hobject_flags)
DUK_INTERNAL_DECL duk_bool_t duk_hobject_enumerator_next(duk_context *ctx, duk_bool_t get_value)
DUK_INTERNAL_DECL void duk_hobject_set_length_zero(duk_hthread *thr, duk_hobject *obj)
DUK_INTERNAL_DECL void duk_hobject_define_property_internal_arridx(duk_hthread *thr, duk_hobject *obj, duk_uarridx_t arr_idx, duk_small_uint_t flags)
DUK_INTERNAL_DECL duk_hcompiledfunction * duk_hcompiledfunction_alloc(duk_heap *heap, duk_uint_t hobject_flags)
DUK_INTERNAL_DECL void duk_hobject_set_prototype_updref(duk_hthread *thr, duk_hobject *h, duk_hobject *p)
DUK_INTERNAL_DECL void duk_hobject_define_accessor_internal(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_hobject *getter, duk_hobject *setter, duk_small_uint_t propflags)
DUK_INTERNAL_DECL duk_uint8_t duk_class_number_to_stridx[32]
DUK_INTERNAL_DECL duk_ret_t duk_hobject_get_enumerated_keys(duk_context *ctx, duk_small_uint_t enum_flags)
DUK_INTERNAL_DECL void duk_hobject_define_property_internal(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags)
DUK_INTERNAL_DECL void duk_hobject_object_seal_freeze_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_freeze)
DUK_INTERNAL_DECL void duk_hobject_set_length(duk_hthread *thr, duk_hobject *obj, duk_uint32_t length)
DUK_INTERNAL_DECL duk_tval * duk_hobject_find_existing_entry_tval_ptr_and_attrs(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_int_t *out_attrs)
DUK_INTERNAL_DECL duk_hstring * duk_hobject_get_internal_value_string(duk_heap *heap, duk_hobject *obj)
DUK_INTERNAL_DECL duk_bool_t duk_hobject_getprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key)
DUK_INTERNAL_DECL duk_uint32_t duk_hobject_get_length(duk_hthread *thr, duk_hobject *obj)
DUK_INTERNAL_DECL duk_bool_t duk_hobject_get_own_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags)
DUK_INTERNAL_DECL duk_hthread * duk_hthread_alloc(duk_heap *heap, duk_uint_t hobject_flags)
DUK_INTERNAL_DECL duk_hnativefunction * duk_hnativefunction_alloc(duk_heap *heap, duk_uint_t hobject_flags)
DUK_INTERNAL_DECL void duk_hobject_run_finalizer(duk_hthread *thr, duk_hobject *obj)
DUK_INTERNAL_DECL void duk_hobject_enumerator_create(duk_context *ctx, duk_small_uint_t enum_flags)
DUK_INTERNAL_DECL duk_bool_t duk_hobject_putprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_tval *tv_val, duk_bool_t throw_flag)
DUK_INTERNAL_DECL duk_tval * duk_hobject_find_existing_array_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_uarridx_t i)
DUK_INTERNAL_DECL void duk_hobject_prepare_property_descriptor(duk_context *ctx, duk_idx_t idx_in, duk_uint_t *out_defprop_flags, duk_idx_t *out_idx_value, duk_hobject **out_getter, duk_hobject **out_setter)
DUK_INTERNAL_DECL duk_bool_t duk_hobject_hasprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key)
DUK_INTERNAL_DECL void duk_hobject_define_property_helper(duk_context *ctx, duk_uint_t defprop_flags, duk_hobject *obj, duk_hstring *key, duk_idx_t idx_value, duk_hobject *get, duk_hobject *set)
DUK_INTERNAL_DECL void duk_hobject_compact_props(duk_hthread *thr, duk_hobject *obj)
DUK_INTERNAL_DECL void duk_hobject_find_existing_entry(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_int_t *e_idx, duk_int_t *h_idx)
DUK_INTERNAL_DECL duk_bool_t duk_hobject_prototype_chain_contains(duk_hthread *thr, duk_hobject *h, duk_hobject *p, duk_bool_t ignore_loop)
DUK_INTERNAL_DECL duk_bool_t duk_hobject_delprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags)
DUK_INTERNAL_DECL duk_bool_t duk_hobject_hasprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key)
DUK_INTERNAL_DECL duk_tval * duk_hobject_find_existing_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_hstring *key)
DUK_INTERNAL_DECL duk_bool_t duk_hobject_get_internal_value(duk_heap *heap, duk_hobject *obj, duk_tval *tv)
DUK_INTERNAL_DECL duk_bool_t duk_hobject_object_is_sealed_frozen_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_frozen)
DUK_INTERNAL_DECL duk_bool_t duk_hobject_delprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_bool_t throw_flag)