| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
/* |
|
2
|
|
|
|
|
|
|
* QuickJS Javascript Engine |
|
3
|
|
|
|
|
|
|
* |
|
4
|
|
|
|
|
|
|
* Copyright (c) 2017-2021 Fabrice Bellard |
|
5
|
|
|
|
|
|
|
* Copyright (c) 2017-2021 Charlie Gordon |
|
6
|
|
|
|
|
|
|
* |
|
7
|
|
|
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy |
|
8
|
|
|
|
|
|
|
* of this software and associated documentation files (the "Software"), to deal |
|
9
|
|
|
|
|
|
|
* in the Software without restriction, including without limitation the rights |
|
10
|
|
|
|
|
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|
11
|
|
|
|
|
|
|
* copies of the Software, and to permit persons to whom the Software is |
|
12
|
|
|
|
|
|
|
* furnished to do so, subject to the following conditions: |
|
13
|
|
|
|
|
|
|
* |
|
14
|
|
|
|
|
|
|
* The above copyright notice and this permission notice shall be included in |
|
15
|
|
|
|
|
|
|
* all copies or substantial portions of the Software. |
|
16
|
|
|
|
|
|
|
* |
|
17
|
|
|
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
18
|
|
|
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
19
|
|
|
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
|
20
|
|
|
|
|
|
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
21
|
|
|
|
|
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
22
|
|
|
|
|
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|
23
|
|
|
|
|
|
|
* THE SOFTWARE. |
|
24
|
|
|
|
|
|
|
*/ |
|
25
|
|
|
|
|
|
|
#ifndef QUICKJS_H |
|
26
|
|
|
|
|
|
|
#define QUICKJS_H |
|
27
|
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
#include |
|
29
|
|
|
|
|
|
|
#include |
|
30
|
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
32
|
|
|
|
|
|
|
extern "C" { |
|
33
|
|
|
|
|
|
|
#endif |
|
34
|
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
#if defined(__GNUC__) || defined(__clang__) |
|
36
|
|
|
|
|
|
|
#define js_likely(x) __builtin_expect(!!(x), 1) |
|
37
|
|
|
|
|
|
|
#define js_unlikely(x) __builtin_expect(!!(x), 0) |
|
38
|
|
|
|
|
|
|
#define js_force_inline inline __attribute__((always_inline)) |
|
39
|
|
|
|
|
|
|
#define __js_printf_like(f, a) __attribute__((format(printf, f, a))) |
|
40
|
|
|
|
|
|
|
#else |
|
41
|
|
|
|
|
|
|
#define js_likely(x) (x) |
|
42
|
|
|
|
|
|
|
#define js_unlikely(x) (x) |
|
43
|
|
|
|
|
|
|
#define js_force_inline inline |
|
44
|
|
|
|
|
|
|
#define __js_printf_like(a, b) |
|
45
|
|
|
|
|
|
|
#endif |
|
46
|
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
#define JS_BOOL int |
|
48
|
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
typedef struct JSRuntime JSRuntime; |
|
50
|
|
|
|
|
|
|
typedef struct JSContext JSContext; |
|
51
|
|
|
|
|
|
|
typedef struct JSObject JSObject; |
|
52
|
|
|
|
|
|
|
typedef struct JSClass JSClass; |
|
53
|
|
|
|
|
|
|
typedef uint32_t JSClassID; |
|
54
|
|
|
|
|
|
|
typedef uint32_t JSAtom; |
|
55
|
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
#if INTPTR_MAX >= INT64_MAX |
|
57
|
|
|
|
|
|
|
#define JS_PTR64 |
|
58
|
|
|
|
|
|
|
#define JS_PTR64_DEF(a) a |
|
59
|
|
|
|
|
|
|
#else |
|
60
|
|
|
|
|
|
|
#define JS_PTR64_DEF(a) |
|
61
|
|
|
|
|
|
|
#endif |
|
62
|
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
#ifndef JS_PTR64 |
|
64
|
|
|
|
|
|
|
#define JS_NAN_BOXING |
|
65
|
|
|
|
|
|
|
#endif |
|
66
|
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
enum { |
|
68
|
|
|
|
|
|
|
/* all tags with a reference count are negative */ |
|
69
|
|
|
|
|
|
|
JS_TAG_FIRST = -11, /* first negative tag */ |
|
70
|
|
|
|
|
|
|
JS_TAG_BIG_DECIMAL = -11, |
|
71
|
|
|
|
|
|
|
JS_TAG_BIG_INT = -10, |
|
72
|
|
|
|
|
|
|
JS_TAG_BIG_FLOAT = -9, |
|
73
|
|
|
|
|
|
|
JS_TAG_SYMBOL = -8, |
|
74
|
|
|
|
|
|
|
JS_TAG_STRING = -7, |
|
75
|
|
|
|
|
|
|
JS_TAG_MODULE = -3, /* used internally */ |
|
76
|
|
|
|
|
|
|
JS_TAG_FUNCTION_BYTECODE = -2, /* used internally */ |
|
77
|
|
|
|
|
|
|
JS_TAG_OBJECT = -1, |
|
78
|
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
JS_TAG_INT = 0, |
|
80
|
|
|
|
|
|
|
JS_TAG_BOOL = 1, |
|
81
|
|
|
|
|
|
|
JS_TAG_NULL = 2, |
|
82
|
|
|
|
|
|
|
JS_TAG_UNDEFINED = 3, |
|
83
|
|
|
|
|
|
|
JS_TAG_UNINITIALIZED = 4, |
|
84
|
|
|
|
|
|
|
JS_TAG_CATCH_OFFSET = 5, |
|
85
|
|
|
|
|
|
|
JS_TAG_EXCEPTION = 6, |
|
86
|
|
|
|
|
|
|
JS_TAG_FLOAT64 = 7, |
|
87
|
|
|
|
|
|
|
/* any larger tag is FLOAT64 if JS_NAN_BOXING */ |
|
88
|
|
|
|
|
|
|
}; |
|
89
|
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
typedef struct JSRefCountHeader { |
|
91
|
|
|
|
|
|
|
int ref_count; |
|
92
|
|
|
|
|
|
|
} JSRefCountHeader; |
|
93
|
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
#define JS_FLOAT64_NAN NAN |
|
95
|
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
#ifdef CONFIG_CHECK_JSVALUE |
|
97
|
|
|
|
|
|
|
/* JSValue consistency : it is not possible to run the code in this |
|
98
|
|
|
|
|
|
|
mode, but it is useful to detect simple reference counting |
|
99
|
|
|
|
|
|
|
errors. It would be interesting to modify a static C analyzer to |
|
100
|
|
|
|
|
|
|
handle specific annotations (clang has such annotations but only |
|
101
|
|
|
|
|
|
|
for objective C) */ |
|
102
|
|
|
|
|
|
|
typedef struct __JSValue *JSValue; |
|
103
|
|
|
|
|
|
|
typedef const struct __JSValue *JSValueConst; |
|
104
|
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
#define JS_VALUE_GET_TAG(v) (int)((uintptr_t)(v) & 0xf) |
|
106
|
|
|
|
|
|
|
/* same as JS_VALUE_GET_TAG, but return JS_TAG_FLOAT64 with NaN boxing */ |
|
107
|
|
|
|
|
|
|
#define JS_VALUE_GET_NORM_TAG(v) JS_VALUE_GET_TAG(v) |
|
108
|
|
|
|
|
|
|
#define JS_VALUE_GET_INT(v) (int)((intptr_t)(v) >> 4) |
|
109
|
|
|
|
|
|
|
#define JS_VALUE_GET_BOOL(v) JS_VALUE_GET_INT(v) |
|
110
|
|
|
|
|
|
|
#define JS_VALUE_GET_FLOAT64(v) (double)JS_VALUE_GET_INT(v) |
|
111
|
|
|
|
|
|
|
#define JS_VALUE_GET_PTR(v) (void *)((intptr_t)(v) & ~0xf) |
|
112
|
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
#define JS_MKVAL(tag, val) (JSValue)(intptr_t)(((val) << 4) | (tag)) |
|
114
|
|
|
|
|
|
|
#define JS_MKPTR(tag, p) (JSValue)((intptr_t)(p) | (tag)) |
|
115
|
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
#define JS_TAG_IS_FLOAT64(tag) ((unsigned)(tag) == JS_TAG_FLOAT64) |
|
117
|
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
#define JS_NAN JS_MKVAL(JS_TAG_FLOAT64, 1) |
|
119
|
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
static inline JSValue __JS_NewFloat64(JSContext *ctx, double d) |
|
121
|
|
|
|
|
|
|
{ |
|
122
|
|
|
|
|
|
|
return JS_MKVAL(JS_TAG_FLOAT64, (int)d); |
|
123
|
|
|
|
|
|
|
} |
|
124
|
|
|
|
|
|
|
|
|
125
|
|
|
|
|
|
|
static inline JS_BOOL JS_VALUE_IS_NAN(JSValue v) |
|
126
|
|
|
|
|
|
|
{ |
|
127
|
|
|
|
|
|
|
return 0; |
|
128
|
|
|
|
|
|
|
} |
|
129
|
|
|
|
|
|
|
|
|
130
|
|
|
|
|
|
|
#elif defined(JS_NAN_BOXING) |
|
131
|
|
|
|
|
|
|
|
|
132
|
|
|
|
|
|
|
typedef uint64_t JSValue; |
|
133
|
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
#define JSValueConst JSValue |
|
135
|
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
#define JS_VALUE_GET_TAG(v) (int)((v) >> 32) |
|
137
|
|
|
|
|
|
|
#define JS_VALUE_GET_INT(v) (int)(v) |
|
138
|
|
|
|
|
|
|
#define JS_VALUE_GET_BOOL(v) (int)(v) |
|
139
|
|
|
|
|
|
|
#define JS_VALUE_GET_PTR(v) (void *)(intptr_t)(v) |
|
140
|
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
#define JS_MKVAL(tag, val) (((uint64_t)(tag) << 32) | (uint32_t)(val)) |
|
142
|
|
|
|
|
|
|
#define JS_MKPTR(tag, ptr) (((uint64_t)(tag) << 32) | (uintptr_t)(ptr)) |
|
143
|
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
#define JS_FLOAT64_TAG_ADDEND (0x7ff80000 - JS_TAG_FIRST + 1) /* quiet NaN encoding */ |
|
145
|
|
|
|
|
|
|
|
|
146
|
|
|
|
|
|
|
static inline double JS_VALUE_GET_FLOAT64(JSValue v) |
|
147
|
|
|
|
|
|
|
{ |
|
148
|
|
|
|
|
|
|
union { |
|
149
|
|
|
|
|
|
|
JSValue v; |
|
150
|
|
|
|
|
|
|
double d; |
|
151
|
|
|
|
|
|
|
} u; |
|
152
|
|
|
|
|
|
|
u.v = v; |
|
153
|
|
|
|
|
|
|
u.v += (uint64_t)JS_FLOAT64_TAG_ADDEND << 32; |
|
154
|
|
|
|
|
|
|
return u.d; |
|
155
|
|
|
|
|
|
|
} |
|
156
|
|
|
|
|
|
|
|
|
157
|
|
|
|
|
|
|
#define JS_NAN (0x7ff8000000000000 - ((uint64_t)JS_FLOAT64_TAG_ADDEND << 32)) |
|
158
|
|
|
|
|
|
|
|
|
159
|
|
|
|
|
|
|
static inline JSValue __JS_NewFloat64(JSContext *ctx, double d) |
|
160
|
|
|
|
|
|
|
{ |
|
161
|
|
|
|
|
|
|
union { |
|
162
|
|
|
|
|
|
|
double d; |
|
163
|
|
|
|
|
|
|
uint64_t u64; |
|
164
|
|
|
|
|
|
|
} u; |
|
165
|
|
|
|
|
|
|
JSValue v; |
|
166
|
|
|
|
|
|
|
u.d = d; |
|
167
|
|
|
|
|
|
|
/* normalize NaN */ |
|
168
|
|
|
|
|
|
|
if (js_unlikely((u.u64 & 0x7fffffffffffffff) > 0x7ff0000000000000)) |
|
169
|
|
|
|
|
|
|
v = JS_NAN; |
|
170
|
|
|
|
|
|
|
else |
|
171
|
|
|
|
|
|
|
v = u.u64 - ((uint64_t)JS_FLOAT64_TAG_ADDEND << 32); |
|
172
|
|
|
|
|
|
|
return v; |
|
173
|
|
|
|
|
|
|
} |
|
174
|
|
|
|
|
|
|
|
|
175
|
|
|
|
|
|
|
#define JS_TAG_IS_FLOAT64(tag) ((unsigned)((tag) - JS_TAG_FIRST) >= (JS_TAG_FLOAT64 - JS_TAG_FIRST)) |
|
176
|
|
|
|
|
|
|
|
|
177
|
|
|
|
|
|
|
/* same as JS_VALUE_GET_TAG, but return JS_TAG_FLOAT64 with NaN boxing */ |
|
178
|
|
|
|
|
|
|
static inline int JS_VALUE_GET_NORM_TAG(JSValue v) |
|
179
|
|
|
|
|
|
|
{ |
|
180
|
|
|
|
|
|
|
uint32_t tag; |
|
181
|
|
|
|
|
|
|
tag = JS_VALUE_GET_TAG(v); |
|
182
|
|
|
|
|
|
|
if (JS_TAG_IS_FLOAT64(tag)) |
|
183
|
|
|
|
|
|
|
return JS_TAG_FLOAT64; |
|
184
|
|
|
|
|
|
|
else |
|
185
|
|
|
|
|
|
|
return tag; |
|
186
|
|
|
|
|
|
|
} |
|
187
|
|
|
|
|
|
|
|
|
188
|
|
|
|
|
|
|
static inline JS_BOOL JS_VALUE_IS_NAN(JSValue v) |
|
189
|
|
|
|
|
|
|
{ |
|
190
|
|
|
|
|
|
|
uint32_t tag; |
|
191
|
|
|
|
|
|
|
tag = JS_VALUE_GET_TAG(v); |
|
192
|
|
|
|
|
|
|
return tag == (JS_NAN >> 32); |
|
193
|
|
|
|
|
|
|
} |
|
194
|
|
|
|
|
|
|
|
|
195
|
|
|
|
|
|
|
#else /* !JS_NAN_BOXING */ |
|
196
|
|
|
|
|
|
|
|
|
197
|
|
|
|
|
|
|
typedef union JSValueUnion { |
|
198
|
|
|
|
|
|
|
int32_t int32; |
|
199
|
|
|
|
|
|
|
double float64; |
|
200
|
|
|
|
|
|
|
void *ptr; |
|
201
|
|
|
|
|
|
|
} JSValueUnion; |
|
202
|
|
|
|
|
|
|
|
|
203
|
|
|
|
|
|
|
typedef struct JSValue { |
|
204
|
|
|
|
|
|
|
JSValueUnion u; |
|
205
|
|
|
|
|
|
|
int64_t tag; |
|
206
|
|
|
|
|
|
|
} JSValue; |
|
207
|
|
|
|
|
|
|
|
|
208
|
|
|
|
|
|
|
#define JSValueConst JSValue |
|
209
|
|
|
|
|
|
|
|
|
210
|
|
|
|
|
|
|
#define JS_VALUE_GET_TAG(v) ((int32_t)(v).tag) |
|
211
|
|
|
|
|
|
|
/* same as JS_VALUE_GET_TAG, but return JS_TAG_FLOAT64 with NaN boxing */ |
|
212
|
|
|
|
|
|
|
#define JS_VALUE_GET_NORM_TAG(v) JS_VALUE_GET_TAG(v) |
|
213
|
|
|
|
|
|
|
#define JS_VALUE_GET_INT(v) ((v).u.int32) |
|
214
|
|
|
|
|
|
|
#define JS_VALUE_GET_BOOL(v) ((v).u.int32) |
|
215
|
|
|
|
|
|
|
#define JS_VALUE_GET_FLOAT64(v) ((v).u.float64) |
|
216
|
|
|
|
|
|
|
#define JS_VALUE_GET_PTR(v) ((v).u.ptr) |
|
217
|
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
#define JS_MKVAL(tag, val) (JSValue){ (JSValueUnion){ .int32 = val }, tag } |
|
219
|
|
|
|
|
|
|
#define JS_MKPTR(tag, p) (JSValue){ (JSValueUnion){ .ptr = p }, tag } |
|
220
|
|
|
|
|
|
|
|
|
221
|
|
|
|
|
|
|
#define JS_TAG_IS_FLOAT64(tag) ((unsigned)(tag) == JS_TAG_FLOAT64) |
|
222
|
|
|
|
|
|
|
|
|
223
|
|
|
|
|
|
|
#define JS_NAN (JSValue){ .u.float64 = JS_FLOAT64_NAN, JS_TAG_FLOAT64 } |
|
224
|
|
|
|
|
|
|
|
|
225
|
7
|
|
|
|
|
|
static inline JSValue __JS_NewFloat64(JSContext *ctx, double d) |
|
226
|
|
|
|
|
|
|
{ |
|
227
|
|
|
|
|
|
|
JSValue v; |
|
228
|
7
|
|
|
|
|
|
v.tag = JS_TAG_FLOAT64; |
|
229
|
7
|
|
|
|
|
|
v.u.float64 = d; |
|
230
|
7
|
|
|
|
|
|
return v; |
|
231
|
|
|
|
|
|
|
} |
|
232
|
|
|
|
|
|
|
|
|
233
|
|
|
|
|
|
|
static inline JS_BOOL JS_VALUE_IS_NAN(JSValue v) |
|
234
|
|
|
|
|
|
|
{ |
|
235
|
|
|
|
|
|
|
union { |
|
236
|
|
|
|
|
|
|
double d; |
|
237
|
|
|
|
|
|
|
uint64_t u64; |
|
238
|
|
|
|
|
|
|
} u; |
|
239
|
|
|
|
|
|
|
if (v.tag != JS_TAG_FLOAT64) |
|
240
|
|
|
|
|
|
|
return 0; |
|
241
|
|
|
|
|
|
|
u.d = v.u.float64; |
|
242
|
|
|
|
|
|
|
return (u.u64 & 0x7fffffffffffffff) > 0x7ff0000000000000; |
|
243
|
|
|
|
|
|
|
} |
|
244
|
|
|
|
|
|
|
|
|
245
|
|
|
|
|
|
|
#endif /* !JS_NAN_BOXING */ |
|
246
|
|
|
|
|
|
|
|
|
247
|
|
|
|
|
|
|
#define JS_VALUE_IS_BOTH_INT(v1, v2) ((JS_VALUE_GET_TAG(v1) | JS_VALUE_GET_TAG(v2)) == 0) |
|
248
|
|
|
|
|
|
|
#define JS_VALUE_IS_BOTH_FLOAT(v1, v2) (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(v1)) && JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(v2))) |
|
249
|
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
#define JS_VALUE_GET_OBJ(v) ((JSObject *)JS_VALUE_GET_PTR(v)) |
|
251
|
|
|
|
|
|
|
#define JS_VALUE_GET_STRING(v) ((JSString *)JS_VALUE_GET_PTR(v)) |
|
252
|
|
|
|
|
|
|
#define JS_VALUE_HAS_REF_COUNT(v) ((unsigned)JS_VALUE_GET_TAG(v) >= (unsigned)JS_TAG_FIRST) |
|
253
|
|
|
|
|
|
|
|
|
254
|
|
|
|
|
|
|
/* special values */ |
|
255
|
|
|
|
|
|
|
#define JS_NULL JS_MKVAL(JS_TAG_NULL, 0) |
|
256
|
|
|
|
|
|
|
#define JS_UNDEFINED JS_MKVAL(JS_TAG_UNDEFINED, 0) |
|
257
|
|
|
|
|
|
|
#define JS_FALSE JS_MKVAL(JS_TAG_BOOL, 0) |
|
258
|
|
|
|
|
|
|
#define JS_TRUE JS_MKVAL(JS_TAG_BOOL, 1) |
|
259
|
|
|
|
|
|
|
#define JS_EXCEPTION JS_MKVAL(JS_TAG_EXCEPTION, 0) |
|
260
|
|
|
|
|
|
|
#define JS_UNINITIALIZED JS_MKVAL(JS_TAG_UNINITIALIZED, 0) |
|
261
|
|
|
|
|
|
|
|
|
262
|
|
|
|
|
|
|
/* flags for object properties */ |
|
263
|
|
|
|
|
|
|
#define JS_PROP_CONFIGURABLE (1 << 0) |
|
264
|
|
|
|
|
|
|
#define JS_PROP_WRITABLE (1 << 1) |
|
265
|
|
|
|
|
|
|
#define JS_PROP_ENUMERABLE (1 << 2) |
|
266
|
|
|
|
|
|
|
#define JS_PROP_C_W_E (JS_PROP_CONFIGURABLE | JS_PROP_WRITABLE | JS_PROP_ENUMERABLE) |
|
267
|
|
|
|
|
|
|
#define JS_PROP_LENGTH (1 << 3) /* used internally in Arrays */ |
|
268
|
|
|
|
|
|
|
#define JS_PROP_TMASK (3 << 4) /* mask for NORMAL, GETSET, VARREF, AUTOINIT */ |
|
269
|
|
|
|
|
|
|
#define JS_PROP_NORMAL (0 << 4) |
|
270
|
|
|
|
|
|
|
#define JS_PROP_GETSET (1 << 4) |
|
271
|
|
|
|
|
|
|
#define JS_PROP_VARREF (2 << 4) /* used internally */ |
|
272
|
|
|
|
|
|
|
#define JS_PROP_AUTOINIT (3 << 4) /* used internally */ |
|
273
|
|
|
|
|
|
|
|
|
274
|
|
|
|
|
|
|
/* flags for JS_DefineProperty */ |
|
275
|
|
|
|
|
|
|
#define JS_PROP_HAS_SHIFT 8 |
|
276
|
|
|
|
|
|
|
#define JS_PROP_HAS_CONFIGURABLE (1 << 8) |
|
277
|
|
|
|
|
|
|
#define JS_PROP_HAS_WRITABLE (1 << 9) |
|
278
|
|
|
|
|
|
|
#define JS_PROP_HAS_ENUMERABLE (1 << 10) |
|
279
|
|
|
|
|
|
|
#define JS_PROP_HAS_GET (1 << 11) |
|
280
|
|
|
|
|
|
|
#define JS_PROP_HAS_SET (1 << 12) |
|
281
|
|
|
|
|
|
|
#define JS_PROP_HAS_VALUE (1 << 13) |
|
282
|
|
|
|
|
|
|
|
|
283
|
|
|
|
|
|
|
/* throw an exception if false would be returned |
|
284
|
|
|
|
|
|
|
(JS_DefineProperty/JS_SetProperty) */ |
|
285
|
|
|
|
|
|
|
#define JS_PROP_THROW (1 << 14) |
|
286
|
|
|
|
|
|
|
/* throw an exception if false would be returned in strict mode |
|
287
|
|
|
|
|
|
|
(JS_SetProperty) */ |
|
288
|
|
|
|
|
|
|
#define JS_PROP_THROW_STRICT (1 << 15) |
|
289
|
|
|
|
|
|
|
|
|
290
|
|
|
|
|
|
|
#define JS_PROP_NO_ADD (1 << 16) /* internal use */ |
|
291
|
|
|
|
|
|
|
#define JS_PROP_NO_EXOTIC (1 << 17) /* internal use */ |
|
292
|
|
|
|
|
|
|
|
|
293
|
|
|
|
|
|
|
#define JS_DEFAULT_STACK_SIZE (256 * 1024) |
|
294
|
|
|
|
|
|
|
|
|
295
|
|
|
|
|
|
|
/* JS_Eval() flags */ |
|
296
|
|
|
|
|
|
|
#define JS_EVAL_TYPE_GLOBAL (0 << 0) /* global code (default) */ |
|
297
|
|
|
|
|
|
|
#define JS_EVAL_TYPE_MODULE (1 << 0) /* module code */ |
|
298
|
|
|
|
|
|
|
#define JS_EVAL_TYPE_DIRECT (2 << 0) /* direct call (internal use) */ |
|
299
|
|
|
|
|
|
|
#define JS_EVAL_TYPE_INDIRECT (3 << 0) /* indirect call (internal use) */ |
|
300
|
|
|
|
|
|
|
#define JS_EVAL_TYPE_MASK (3 << 0) |
|
301
|
|
|
|
|
|
|
|
|
302
|
|
|
|
|
|
|
#define JS_EVAL_FLAG_STRICT (1 << 3) /* force 'strict' mode */ |
|
303
|
|
|
|
|
|
|
#define JS_EVAL_FLAG_STRIP (1 << 4) /* force 'strip' mode */ |
|
304
|
|
|
|
|
|
|
/* compile but do not run. The result is an object with a |
|
305
|
|
|
|
|
|
|
JS_TAG_FUNCTION_BYTECODE or JS_TAG_MODULE tag. It can be executed |
|
306
|
|
|
|
|
|
|
with JS_EvalFunction(). */ |
|
307
|
|
|
|
|
|
|
#define JS_EVAL_FLAG_COMPILE_ONLY (1 << 5) |
|
308
|
|
|
|
|
|
|
/* don't include the stack frames before this eval in the Error() backtraces */ |
|
309
|
|
|
|
|
|
|
#define JS_EVAL_FLAG_BACKTRACE_BARRIER (1 << 6) |
|
310
|
|
|
|
|
|
|
|
|
311
|
|
|
|
|
|
|
typedef JSValue JSCFunction(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv); |
|
312
|
|
|
|
|
|
|
typedef JSValue JSCFunctionMagic(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv, int magic); |
|
313
|
|
|
|
|
|
|
typedef JSValue JSCFunctionData(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv, int magic, JSValue *func_data); |
|
314
|
|
|
|
|
|
|
|
|
315
|
|
|
|
|
|
|
typedef struct JSMallocState { |
|
316
|
|
|
|
|
|
|
size_t malloc_count; |
|
317
|
|
|
|
|
|
|
size_t malloc_size; |
|
318
|
|
|
|
|
|
|
size_t malloc_limit; |
|
319
|
|
|
|
|
|
|
void *opaque; /* user opaque */ |
|
320
|
|
|
|
|
|
|
} JSMallocState; |
|
321
|
|
|
|
|
|
|
|
|
322
|
|
|
|
|
|
|
typedef struct JSMallocFunctions { |
|
323
|
|
|
|
|
|
|
void *(*js_malloc)(JSMallocState *s, size_t size); |
|
324
|
|
|
|
|
|
|
void (*js_free)(JSMallocState *s, void *ptr); |
|
325
|
|
|
|
|
|
|
void *(*js_realloc)(JSMallocState *s, void *ptr, size_t size); |
|
326
|
|
|
|
|
|
|
size_t (*js_malloc_usable_size)(const void *ptr); |
|
327
|
|
|
|
|
|
|
} JSMallocFunctions; |
|
328
|
|
|
|
|
|
|
|
|
329
|
|
|
|
|
|
|
typedef struct JSGCObjectHeader JSGCObjectHeader; |
|
330
|
|
|
|
|
|
|
|
|
331
|
|
|
|
|
|
|
JSRuntime *JS_NewRuntime(void); |
|
332
|
|
|
|
|
|
|
/* info lifetime must exceed that of rt */ |
|
333
|
|
|
|
|
|
|
void JS_SetRuntimeInfo(JSRuntime *rt, const char *info); |
|
334
|
|
|
|
|
|
|
void JS_SetMemoryLimit(JSRuntime *rt, size_t limit); |
|
335
|
|
|
|
|
|
|
void JS_SetGCThreshold(JSRuntime *rt, size_t gc_threshold); |
|
336
|
|
|
|
|
|
|
/* use 0 to disable maximum stack size check */ |
|
337
|
|
|
|
|
|
|
void JS_SetMaxStackSize(JSRuntime *rt, size_t stack_size); |
|
338
|
|
|
|
|
|
|
/* should be called when changing thread to update the stack top value |
|
339
|
|
|
|
|
|
|
used to check stack overflow. */ |
|
340
|
|
|
|
|
|
|
void JS_UpdateStackTop(JSRuntime *rt); |
|
341
|
|
|
|
|
|
|
JSRuntime *JS_NewRuntime2(const JSMallocFunctions *mf, void *opaque); |
|
342
|
|
|
|
|
|
|
void JS_FreeRuntime(JSRuntime *rt); |
|
343
|
|
|
|
|
|
|
void *JS_GetRuntimeOpaque(JSRuntime *rt); |
|
344
|
|
|
|
|
|
|
void JS_SetRuntimeOpaque(JSRuntime *rt, void *opaque); |
|
345
|
|
|
|
|
|
|
typedef void JS_MarkFunc(JSRuntime *rt, JSGCObjectHeader *gp); |
|
346
|
|
|
|
|
|
|
void JS_MarkValue(JSRuntime *rt, JSValueConst val, JS_MarkFunc *mark_func); |
|
347
|
|
|
|
|
|
|
void JS_RunGC(JSRuntime *rt); |
|
348
|
|
|
|
|
|
|
JS_BOOL JS_IsLiveObject(JSRuntime *rt, JSValueConst obj); |
|
349
|
|
|
|
|
|
|
|
|
350
|
|
|
|
|
|
|
JSContext *JS_NewContext(JSRuntime *rt); |
|
351
|
|
|
|
|
|
|
void JS_FreeContext(JSContext *s); |
|
352
|
|
|
|
|
|
|
JSContext *JS_DupContext(JSContext *ctx); |
|
353
|
|
|
|
|
|
|
void *JS_GetContextOpaque(JSContext *ctx); |
|
354
|
|
|
|
|
|
|
void JS_SetContextOpaque(JSContext *ctx, void *opaque); |
|
355
|
|
|
|
|
|
|
JSRuntime *JS_GetRuntime(JSContext *ctx); |
|
356
|
|
|
|
|
|
|
void JS_SetClassProto(JSContext *ctx, JSClassID class_id, JSValue obj); |
|
357
|
|
|
|
|
|
|
JSValue JS_GetClassProto(JSContext *ctx, JSClassID class_id); |
|
358
|
|
|
|
|
|
|
|
|
359
|
|
|
|
|
|
|
/* the following functions are used to select the intrinsic object to |
|
360
|
|
|
|
|
|
|
save memory */ |
|
361
|
|
|
|
|
|
|
JSContext *JS_NewContextRaw(JSRuntime *rt); |
|
362
|
|
|
|
|
|
|
void JS_AddIntrinsicBaseObjects(JSContext *ctx); |
|
363
|
|
|
|
|
|
|
void JS_AddIntrinsicDate(JSContext *ctx); |
|
364
|
|
|
|
|
|
|
void JS_AddIntrinsicEval(JSContext *ctx); |
|
365
|
|
|
|
|
|
|
void JS_AddIntrinsicStringNormalize(JSContext *ctx); |
|
366
|
|
|
|
|
|
|
void JS_AddIntrinsicRegExpCompiler(JSContext *ctx); |
|
367
|
|
|
|
|
|
|
void JS_AddIntrinsicRegExp(JSContext *ctx); |
|
368
|
|
|
|
|
|
|
void JS_AddIntrinsicJSON(JSContext *ctx); |
|
369
|
|
|
|
|
|
|
void JS_AddIntrinsicProxy(JSContext *ctx); |
|
370
|
|
|
|
|
|
|
void JS_AddIntrinsicMapSet(JSContext *ctx); |
|
371
|
|
|
|
|
|
|
void JS_AddIntrinsicTypedArrays(JSContext *ctx); |
|
372
|
|
|
|
|
|
|
void JS_AddIntrinsicPromise(JSContext *ctx); |
|
373
|
|
|
|
|
|
|
void JS_AddIntrinsicBigInt(JSContext *ctx); |
|
374
|
|
|
|
|
|
|
void JS_AddIntrinsicBigFloat(JSContext *ctx); |
|
375
|
|
|
|
|
|
|
void JS_AddIntrinsicBigDecimal(JSContext *ctx); |
|
376
|
|
|
|
|
|
|
/* enable operator overloading */ |
|
377
|
|
|
|
|
|
|
void JS_AddIntrinsicOperators(JSContext *ctx); |
|
378
|
|
|
|
|
|
|
/* enable "use math" */ |
|
379
|
|
|
|
|
|
|
void JS_EnableBignumExt(JSContext *ctx, JS_BOOL enable); |
|
380
|
|
|
|
|
|
|
|
|
381
|
|
|
|
|
|
|
JSValue js_string_codePointRange(JSContext *ctx, JSValueConst this_val, |
|
382
|
|
|
|
|
|
|
int argc, JSValueConst *argv); |
|
383
|
|
|
|
|
|
|
|
|
384
|
|
|
|
|
|
|
void *js_malloc_rt(JSRuntime *rt, size_t size); |
|
385
|
|
|
|
|
|
|
void js_free_rt(JSRuntime *rt, void *ptr); |
|
386
|
|
|
|
|
|
|
void *js_realloc_rt(JSRuntime *rt, void *ptr, size_t size); |
|
387
|
|
|
|
|
|
|
size_t js_malloc_usable_size_rt(JSRuntime *rt, const void *ptr); |
|
388
|
|
|
|
|
|
|
void *js_mallocz_rt(JSRuntime *rt, size_t size); |
|
389
|
|
|
|
|
|
|
|
|
390
|
|
|
|
|
|
|
void *js_malloc(JSContext *ctx, size_t size); |
|
391
|
|
|
|
|
|
|
void js_free(JSContext *ctx, void *ptr); |
|
392
|
|
|
|
|
|
|
void *js_realloc(JSContext *ctx, void *ptr, size_t size); |
|
393
|
|
|
|
|
|
|
size_t js_malloc_usable_size(JSContext *ctx, const void *ptr); |
|
394
|
|
|
|
|
|
|
void *js_realloc2(JSContext *ctx, void *ptr, size_t size, size_t *pslack); |
|
395
|
|
|
|
|
|
|
void *js_mallocz(JSContext *ctx, size_t size); |
|
396
|
|
|
|
|
|
|
char *js_strdup(JSContext *ctx, const char *str); |
|
397
|
|
|
|
|
|
|
char *js_strndup(JSContext *ctx, const char *s, size_t n); |
|
398
|
|
|
|
|
|
|
|
|
399
|
|
|
|
|
|
|
typedef struct JSMemoryUsage { |
|
400
|
|
|
|
|
|
|
int64_t malloc_size, malloc_limit, memory_used_size; |
|
401
|
|
|
|
|
|
|
int64_t malloc_count; |
|
402
|
|
|
|
|
|
|
int64_t memory_used_count; |
|
403
|
|
|
|
|
|
|
int64_t atom_count, atom_size; |
|
404
|
|
|
|
|
|
|
int64_t str_count, str_size; |
|
405
|
|
|
|
|
|
|
int64_t obj_count, obj_size; |
|
406
|
|
|
|
|
|
|
int64_t prop_count, prop_size; |
|
407
|
|
|
|
|
|
|
int64_t shape_count, shape_size; |
|
408
|
|
|
|
|
|
|
int64_t js_func_count, js_func_size, js_func_code_size; |
|
409
|
|
|
|
|
|
|
int64_t js_func_pc2line_count, js_func_pc2line_size; |
|
410
|
|
|
|
|
|
|
int64_t c_func_count, array_count; |
|
411
|
|
|
|
|
|
|
int64_t fast_array_count, fast_array_elements; |
|
412
|
|
|
|
|
|
|
int64_t binary_object_count, binary_object_size; |
|
413
|
|
|
|
|
|
|
} JSMemoryUsage; |
|
414
|
|
|
|
|
|
|
|
|
415
|
|
|
|
|
|
|
void JS_ComputeMemoryUsage(JSRuntime *rt, JSMemoryUsage *s); |
|
416
|
|
|
|
|
|
|
void JS_DumpMemoryUsage(FILE *fp, const JSMemoryUsage *s, JSRuntime *rt); |
|
417
|
|
|
|
|
|
|
|
|
418
|
|
|
|
|
|
|
/* atom support */ |
|
419
|
|
|
|
|
|
|
#define JS_ATOM_NULL 0 |
|
420
|
|
|
|
|
|
|
|
|
421
|
|
|
|
|
|
|
JSAtom JS_NewAtomLen(JSContext *ctx, const char *str, size_t len); |
|
422
|
|
|
|
|
|
|
JSAtom JS_NewAtom(JSContext *ctx, const char *str); |
|
423
|
|
|
|
|
|
|
JSAtom JS_NewAtomUInt32(JSContext *ctx, uint32_t n); |
|
424
|
|
|
|
|
|
|
JSAtom JS_DupAtom(JSContext *ctx, JSAtom v); |
|
425
|
|
|
|
|
|
|
void JS_FreeAtom(JSContext *ctx, JSAtom v); |
|
426
|
|
|
|
|
|
|
void JS_FreeAtomRT(JSRuntime *rt, JSAtom v); |
|
427
|
|
|
|
|
|
|
JSValue JS_AtomToValue(JSContext *ctx, JSAtom atom); |
|
428
|
|
|
|
|
|
|
JSValue JS_AtomToString(JSContext *ctx, JSAtom atom); |
|
429
|
|
|
|
|
|
|
const char *JS_AtomToCString(JSContext *ctx, JSAtom atom); |
|
430
|
|
|
|
|
|
|
JSAtom JS_ValueToAtom(JSContext *ctx, JSValueConst val); |
|
431
|
|
|
|
|
|
|
|
|
432
|
|
|
|
|
|
|
/* object class support */ |
|
433
|
|
|
|
|
|
|
|
|
434
|
|
|
|
|
|
|
typedef struct JSPropertyEnum { |
|
435
|
|
|
|
|
|
|
JS_BOOL is_enumerable; |
|
436
|
|
|
|
|
|
|
JSAtom atom; |
|
437
|
|
|
|
|
|
|
} JSPropertyEnum; |
|
438
|
|
|
|
|
|
|
|
|
439
|
|
|
|
|
|
|
typedef struct JSPropertyDescriptor { |
|
440
|
|
|
|
|
|
|
int flags; |
|
441
|
|
|
|
|
|
|
JSValue value; |
|
442
|
|
|
|
|
|
|
JSValue getter; |
|
443
|
|
|
|
|
|
|
JSValue setter; |
|
444
|
|
|
|
|
|
|
} JSPropertyDescriptor; |
|
445
|
|
|
|
|
|
|
|
|
446
|
|
|
|
|
|
|
typedef struct JSClassExoticMethods { |
|
447
|
|
|
|
|
|
|
/* Return -1 if exception (can only happen in case of Proxy object), |
|
448
|
|
|
|
|
|
|
FALSE if the property does not exists, TRUE if it exists. If 1 is |
|
449
|
|
|
|
|
|
|
returned, the property descriptor 'desc' is filled if != NULL. */ |
|
450
|
|
|
|
|
|
|
int (*get_own_property)(JSContext *ctx, JSPropertyDescriptor *desc, |
|
451
|
|
|
|
|
|
|
JSValueConst obj, JSAtom prop); |
|
452
|
|
|
|
|
|
|
/* '*ptab' should hold the '*plen' property keys. Return 0 if OK, |
|
453
|
|
|
|
|
|
|
-1 if exception. The 'is_enumerable' field is ignored. |
|
454
|
|
|
|
|
|
|
*/ |
|
455
|
|
|
|
|
|
|
int (*get_own_property_names)(JSContext *ctx, JSPropertyEnum **ptab, |
|
456
|
|
|
|
|
|
|
uint32_t *plen, |
|
457
|
|
|
|
|
|
|
JSValueConst obj); |
|
458
|
|
|
|
|
|
|
/* return < 0 if exception, or TRUE/FALSE */ |
|
459
|
|
|
|
|
|
|
int (*delete_property)(JSContext *ctx, JSValueConst obj, JSAtom prop); |
|
460
|
|
|
|
|
|
|
/* return < 0 if exception or TRUE/FALSE */ |
|
461
|
|
|
|
|
|
|
int (*define_own_property)(JSContext *ctx, JSValueConst this_obj, |
|
462
|
|
|
|
|
|
|
JSAtom prop, JSValueConst val, |
|
463
|
|
|
|
|
|
|
JSValueConst getter, JSValueConst setter, |
|
464
|
|
|
|
|
|
|
int flags); |
|
465
|
|
|
|
|
|
|
/* The following methods can be emulated with the previous ones, |
|
466
|
|
|
|
|
|
|
so they are usually not needed */ |
|
467
|
|
|
|
|
|
|
/* return < 0 if exception or TRUE/FALSE */ |
|
468
|
|
|
|
|
|
|
int (*has_property)(JSContext *ctx, JSValueConst obj, JSAtom atom); |
|
469
|
|
|
|
|
|
|
JSValue (*get_property)(JSContext *ctx, JSValueConst obj, JSAtom atom, |
|
470
|
|
|
|
|
|
|
JSValueConst receiver); |
|
471
|
|
|
|
|
|
|
/* return < 0 if exception or TRUE/FALSE */ |
|
472
|
|
|
|
|
|
|
int (*set_property)(JSContext *ctx, JSValueConst obj, JSAtom atom, |
|
473
|
|
|
|
|
|
|
JSValueConst value, JSValueConst receiver, int flags); |
|
474
|
|
|
|
|
|
|
} JSClassExoticMethods; |
|
475
|
|
|
|
|
|
|
|
|
476
|
|
|
|
|
|
|
typedef void JSClassFinalizer(JSRuntime *rt, JSValue val); |
|
477
|
|
|
|
|
|
|
typedef void JSClassGCMark(JSRuntime *rt, JSValueConst val, |
|
478
|
|
|
|
|
|
|
JS_MarkFunc *mark_func); |
|
479
|
|
|
|
|
|
|
#define JS_CALL_FLAG_CONSTRUCTOR (1 << 0) |
|
480
|
|
|
|
|
|
|
typedef JSValue JSClassCall(JSContext *ctx, JSValueConst func_obj, |
|
481
|
|
|
|
|
|
|
JSValueConst this_val, int argc, JSValueConst *argv, |
|
482
|
|
|
|
|
|
|
int flags); |
|
483
|
|
|
|
|
|
|
|
|
484
|
|
|
|
|
|
|
typedef struct JSClassDef { |
|
485
|
|
|
|
|
|
|
const char *class_name; |
|
486
|
|
|
|
|
|
|
JSClassFinalizer *finalizer; |
|
487
|
|
|
|
|
|
|
JSClassGCMark *gc_mark; |
|
488
|
|
|
|
|
|
|
/* if call != NULL, the object is a function. If (flags & |
|
489
|
|
|
|
|
|
|
JS_CALL_FLAG_CONSTRUCTOR) != 0, the function is called as a |
|
490
|
|
|
|
|
|
|
constructor. In this case, 'this_val' is new.target. A |
|
491
|
|
|
|
|
|
|
constructor call only happens if the object constructor bit is |
|
492
|
|
|
|
|
|
|
set (see JS_SetConstructorBit()). */ |
|
493
|
|
|
|
|
|
|
JSClassCall *call; |
|
494
|
|
|
|
|
|
|
/* XXX: suppress this indirection ? It is here only to save memory |
|
495
|
|
|
|
|
|
|
because only a few classes need these methods */ |
|
496
|
|
|
|
|
|
|
JSClassExoticMethods *exotic; |
|
497
|
|
|
|
|
|
|
} JSClassDef; |
|
498
|
|
|
|
|
|
|
|
|
499
|
|
|
|
|
|
|
JSClassID JS_NewClassID(JSClassID *pclass_id); |
|
500
|
|
|
|
|
|
|
int JS_NewClass(JSRuntime *rt, JSClassID class_id, const JSClassDef *class_def); |
|
501
|
|
|
|
|
|
|
int JS_IsRegisteredClass(JSRuntime *rt, JSClassID class_id); |
|
502
|
|
|
|
|
|
|
|
|
503
|
|
|
|
|
|
|
/* value handling */ |
|
504
|
|
|
|
|
|
|
|
|
505
|
|
|
|
|
|
|
static js_force_inline JSValue JS_NewBool(JSContext *ctx, JS_BOOL val) |
|
506
|
|
|
|
|
|
|
{ |
|
507
|
2
|
|
|
|
|
|
return JS_MKVAL(JS_TAG_BOOL, (val != 0)); |
|
508
|
|
|
|
|
|
|
} |
|
509
|
|
|
|
|
|
|
|
|
510
|
|
|
|
|
|
|
static js_force_inline JSValue JS_NewInt32(JSContext *ctx, int32_t val) |
|
511
|
|
|
|
|
|
|
{ |
|
512
|
53
|
|
|
|
|
|
return JS_MKVAL(JS_TAG_INT, val); |
|
513
|
|
|
|
|
|
|
} |
|
514
|
|
|
|
|
|
|
|
|
515
|
|
|
|
|
|
|
static js_force_inline JSValue JS_NewCatchOffset(JSContext *ctx, int32_t val) |
|
516
|
|
|
|
|
|
|
{ |
|
517
|
|
|
|
|
|
|
return JS_MKVAL(JS_TAG_CATCH_OFFSET, val); |
|
518
|
|
|
|
|
|
|
} |
|
519
|
|
|
|
|
|
|
|
|
520
|
|
|
|
|
|
|
static js_force_inline JSValue JS_NewInt64(JSContext *ctx, int64_t val) |
|
521
|
|
|
|
|
|
|
{ |
|
522
|
|
|
|
|
|
|
JSValue v; |
|
523
|
49
|
0
|
|
|
|
|
if (val == (int32_t)val) { |
|
|
|
100
|
|
|
|
|
|
|
524
|
46
|
|
|
|
|
|
v = JS_NewInt32(ctx, val); |
|
525
|
|
|
|
|
|
|
} else { |
|
526
|
3
|
|
|
|
|
|
v = __JS_NewFloat64(ctx, val); |
|
527
|
|
|
|
|
|
|
} |
|
528
|
49
|
|
|
|
|
|
return v; |
|
529
|
|
|
|
|
|
|
} |
|
530
|
|
|
|
|
|
|
|
|
531
|
|
|
|
|
|
|
static js_force_inline JSValue JS_NewUint32(JSContext *ctx, uint32_t val) |
|
532
|
|
|
|
|
|
|
{ |
|
533
|
|
|
|
|
|
|
JSValue v; |
|
534
|
7
|
50
|
|
|
|
|
if (val <= 0x7fffffff) { |
|
535
|
7
|
|
|
|
|
|
v = JS_NewInt32(ctx, val); |
|
536
|
|
|
|
|
|
|
} else { |
|
537
|
0
|
|
|
|
|
|
v = __JS_NewFloat64(ctx, val); |
|
538
|
|
|
|
|
|
|
} |
|
539
|
7
|
|
|
|
|
|
return v; |
|
540
|
|
|
|
|
|
|
} |
|
541
|
|
|
|
|
|
|
|
|
542
|
|
|
|
|
|
|
JSValue JS_NewBigInt64(JSContext *ctx, int64_t v); |
|
543
|
|
|
|
|
|
|
JSValue JS_NewBigUint64(JSContext *ctx, uint64_t v); |
|
544
|
|
|
|
|
|
|
|
|
545
|
|
|
|
|
|
|
static js_force_inline JSValue JS_NewFloat64(JSContext *ctx, double d) |
|
546
|
|
|
|
|
|
|
{ |
|
547
|
|
|
|
|
|
|
JSValue v; |
|
548
|
|
|
|
|
|
|
int32_t val; |
|
549
|
|
|
|
|
|
|
union { |
|
550
|
|
|
|
|
|
|
double d; |
|
551
|
|
|
|
|
|
|
uint64_t u; |
|
552
|
|
|
|
|
|
|
} u, t; |
|
553
|
4
|
|
|
|
|
|
u.d = d; |
|
554
|
4
|
|
|
|
|
|
val = (int32_t)d; |
|
555
|
4
|
|
|
|
|
|
t.d = val; |
|
556
|
|
|
|
|
|
|
/* -0 cannot be represented as integer, so we compare the bit |
|
557
|
|
|
|
|
|
|
representation */ |
|
558
|
4
|
0
|
|
|
|
|
if (u.u == t.u) { |
|
|
|
50
|
|
|
|
|
|
|
559
|
0
|
|
|
|
|
|
v = JS_MKVAL(JS_TAG_INT, val); |
|
560
|
|
|
|
|
|
|
} else { |
|
561
|
4
|
|
|
|
|
|
v = __JS_NewFloat64(ctx, d); |
|
562
|
|
|
|
|
|
|
} |
|
563
|
4
|
|
|
|
|
|
return v; |
|
564
|
|
|
|
|
|
|
} |
|
565
|
|
|
|
|
|
|
|
|
566
|
|
|
|
|
|
|
static inline JS_BOOL JS_IsNumber(JSValueConst v) |
|
567
|
|
|
|
|
|
|
{ |
|
568
|
|
|
|
|
|
|
int tag = JS_VALUE_GET_TAG(v); |
|
569
|
|
|
|
|
|
|
return tag == JS_TAG_INT || JS_TAG_IS_FLOAT64(tag); |
|
570
|
|
|
|
|
|
|
} |
|
571
|
|
|
|
|
|
|
|
|
572
|
|
|
|
|
|
|
static inline JS_BOOL JS_IsBigInt(JSContext *ctx, JSValueConst v) |
|
573
|
|
|
|
|
|
|
{ |
|
574
|
|
|
|
|
|
|
int tag = JS_VALUE_GET_TAG(v); |
|
575
|
|
|
|
|
|
|
return tag == JS_TAG_BIG_INT; |
|
576
|
|
|
|
|
|
|
} |
|
577
|
|
|
|
|
|
|
|
|
578
|
|
|
|
|
|
|
static inline JS_BOOL JS_IsBigFloat(JSValueConst v) |
|
579
|
|
|
|
|
|
|
{ |
|
580
|
|
|
|
|
|
|
int tag = JS_VALUE_GET_TAG(v); |
|
581
|
|
|
|
|
|
|
return tag == JS_TAG_BIG_FLOAT; |
|
582
|
|
|
|
|
|
|
} |
|
583
|
|
|
|
|
|
|
|
|
584
|
|
|
|
|
|
|
static inline JS_BOOL JS_IsBigDecimal(JSValueConst v) |
|
585
|
|
|
|
|
|
|
{ |
|
586
|
|
|
|
|
|
|
int tag = JS_VALUE_GET_TAG(v); |
|
587
|
|
|
|
|
|
|
return tag == JS_TAG_BIG_DECIMAL; |
|
588
|
|
|
|
|
|
|
} |
|
589
|
|
|
|
|
|
|
|
|
590
|
|
|
|
|
|
|
static inline JS_BOOL JS_IsBool(JSValueConst v) |
|
591
|
|
|
|
|
|
|
{ |
|
592
|
|
|
|
|
|
|
return JS_VALUE_GET_TAG(v) == JS_TAG_BOOL; |
|
593
|
|
|
|
|
|
|
} |
|
594
|
|
|
|
|
|
|
|
|
595
|
|
|
|
|
|
|
static inline JS_BOOL JS_IsNull(JSValueConst v) |
|
596
|
|
|
|
|
|
|
{ |
|
597
|
|
|
|
|
|
|
return JS_VALUE_GET_TAG(v) == JS_TAG_NULL; |
|
598
|
|
|
|
|
|
|
} |
|
599
|
|
|
|
|
|
|
|
|
600
|
|
|
|
|
|
|
static inline JS_BOOL JS_IsUndefined(JSValueConst v) |
|
601
|
|
|
|
|
|
|
{ |
|
602
|
|
|
|
|
|
|
return JS_VALUE_GET_TAG(v) == JS_TAG_UNDEFINED; |
|
603
|
|
|
|
|
|
|
} |
|
604
|
|
|
|
|
|
|
|
|
605
|
224
|
|
|
|
|
|
static inline JS_BOOL JS_IsException(JSValueConst v) |
|
606
|
|
|
|
|
|
|
{ |
|
607
|
224
|
|
|
|
|
|
return js_unlikely(JS_VALUE_GET_TAG(v) == JS_TAG_EXCEPTION); |
|
608
|
|
|
|
|
|
|
} |
|
609
|
|
|
|
|
|
|
|
|
610
|
|
|
|
|
|
|
static inline JS_BOOL JS_IsUninitialized(JSValueConst v) |
|
611
|
|
|
|
|
|
|
{ |
|
612
|
|
|
|
|
|
|
return js_unlikely(JS_VALUE_GET_TAG(v) == JS_TAG_UNINITIALIZED); |
|
613
|
|
|
|
|
|
|
} |
|
614
|
|
|
|
|
|
|
|
|
615
|
|
|
|
|
|
|
static inline JS_BOOL JS_IsString(JSValueConst v) |
|
616
|
|
|
|
|
|
|
{ |
|
617
|
|
|
|
|
|
|
return JS_VALUE_GET_TAG(v) == JS_TAG_STRING; |
|
618
|
|
|
|
|
|
|
} |
|
619
|
|
|
|
|
|
|
|
|
620
|
|
|
|
|
|
|
static inline JS_BOOL JS_IsSymbol(JSValueConst v) |
|
621
|
|
|
|
|
|
|
{ |
|
622
|
|
|
|
|
|
|
return JS_VALUE_GET_TAG(v) == JS_TAG_SYMBOL; |
|
623
|
|
|
|
|
|
|
} |
|
624
|
|
|
|
|
|
|
|
|
625
|
|
|
|
|
|
|
static inline JS_BOOL JS_IsObject(JSValueConst v) |
|
626
|
|
|
|
|
|
|
{ |
|
627
|
|
|
|
|
|
|
return JS_VALUE_GET_TAG(v) == JS_TAG_OBJECT; |
|
628
|
|
|
|
|
|
|
} |
|
629
|
|
|
|
|
|
|
|
|
630
|
|
|
|
|
|
|
JSValue JS_Throw(JSContext *ctx, JSValue obj); |
|
631
|
|
|
|
|
|
|
JSValue JS_GetException(JSContext *ctx); |
|
632
|
|
|
|
|
|
|
JS_BOOL JS_IsError(JSContext *ctx, JSValueConst val); |
|
633
|
|
|
|
|
|
|
void JS_ResetUncatchableError(JSContext *ctx); |
|
634
|
|
|
|
|
|
|
JSValue JS_NewError(JSContext *ctx); |
|
635
|
|
|
|
|
|
|
JSValue __js_printf_like(2, 3) JS_ThrowSyntaxError(JSContext *ctx, const char *fmt, ...); |
|
636
|
|
|
|
|
|
|
JSValue __js_printf_like(2, 3) JS_ThrowTypeError(JSContext *ctx, const char *fmt, ...); |
|
637
|
|
|
|
|
|
|
JSValue __js_printf_like(2, 3) JS_ThrowReferenceError(JSContext *ctx, const char *fmt, ...); |
|
638
|
|
|
|
|
|
|
JSValue __js_printf_like(2, 3) JS_ThrowRangeError(JSContext *ctx, const char *fmt, ...); |
|
639
|
|
|
|
|
|
|
JSValue __js_printf_like(2, 3) JS_ThrowInternalError(JSContext *ctx, const char *fmt, ...); |
|
640
|
|
|
|
|
|
|
JSValue JS_ThrowOutOfMemory(JSContext *ctx); |
|
641
|
|
|
|
|
|
|
|
|
642
|
|
|
|
|
|
|
void __JS_FreeValue(JSContext *ctx, JSValue v); |
|
643
|
2968
|
|
|
|
|
|
static inline void JS_FreeValue(JSContext *ctx, JSValue v) |
|
644
|
|
|
|
|
|
|
{ |
|
645
|
2968
|
100
|
|
|
|
|
if (JS_VALUE_HAS_REF_COUNT(v)) { |
|
646
|
2497
|
|
|
|
|
|
JSRefCountHeader *p = (JSRefCountHeader *)JS_VALUE_GET_PTR(v); |
|
647
|
2497
|
100
|
|
|
|
|
if (--p->ref_count <= 0) { |
|
648
|
62
|
|
|
|
|
|
__JS_FreeValue(ctx, v); |
|
649
|
|
|
|
|
|
|
} |
|
650
|
|
|
|
|
|
|
} |
|
651
|
2968
|
|
|
|
|
|
} |
|
652
|
|
|
|
|
|
|
void __JS_FreeValueRT(JSRuntime *rt, JSValue v); |
|
653
|
|
|
|
|
|
|
static inline void JS_FreeValueRT(JSRuntime *rt, JSValue v) |
|
654
|
|
|
|
|
|
|
{ |
|
655
|
|
|
|
|
|
|
if (JS_VALUE_HAS_REF_COUNT(v)) { |
|
656
|
|
|
|
|
|
|
JSRefCountHeader *p = (JSRefCountHeader *)JS_VALUE_GET_PTR(v); |
|
657
|
|
|
|
|
|
|
if (--p->ref_count <= 0) { |
|
658
|
|
|
|
|
|
|
__JS_FreeValueRT(rt, v); |
|
659
|
|
|
|
|
|
|
} |
|
660
|
|
|
|
|
|
|
} |
|
661
|
|
|
|
|
|
|
} |
|
662
|
|
|
|
|
|
|
|
|
663
|
14
|
|
|
|
|
|
static inline JSValue JS_DupValue(JSContext *ctx, JSValueConst v) |
|
664
|
|
|
|
|
|
|
{ |
|
665
|
14
|
50
|
|
|
|
|
if (JS_VALUE_HAS_REF_COUNT(v)) { |
|
666
|
14
|
|
|
|
|
|
JSRefCountHeader *p = (JSRefCountHeader *)JS_VALUE_GET_PTR(v); |
|
667
|
14
|
|
|
|
|
|
p->ref_count++; |
|
668
|
|
|
|
|
|
|
} |
|
669
|
14
|
|
|
|
|
|
return (JSValue)v; |
|
670
|
|
|
|
|
|
|
} |
|
671
|
|
|
|
|
|
|
|
|
672
|
|
|
|
|
|
|
static inline JSValue JS_DupValueRT(JSRuntime *rt, JSValueConst v) |
|
673
|
|
|
|
|
|
|
{ |
|
674
|
|
|
|
|
|
|
if (JS_VALUE_HAS_REF_COUNT(v)) { |
|
675
|
|
|
|
|
|
|
JSRefCountHeader *p = (JSRefCountHeader *)JS_VALUE_GET_PTR(v); |
|
676
|
|
|
|
|
|
|
p->ref_count++; |
|
677
|
|
|
|
|
|
|
} |
|
678
|
|
|
|
|
|
|
return (JSValue)v; |
|
679
|
|
|
|
|
|
|
} |
|
680
|
|
|
|
|
|
|
|
|
681
|
|
|
|
|
|
|
int JS_ToBool(JSContext *ctx, JSValueConst val); /* return -1 for JS_EXCEPTION */ |
|
682
|
|
|
|
|
|
|
int JS_ToInt32(JSContext *ctx, int32_t *pres, JSValueConst val); |
|
683
|
23
|
|
|
|
|
|
static inline int JS_ToUint32(JSContext *ctx, uint32_t *pres, JSValueConst val) |
|
684
|
|
|
|
|
|
|
{ |
|
685
|
23
|
|
|
|
|
|
return JS_ToInt32(ctx, (int32_t*)pres, val); |
|
686
|
|
|
|
|
|
|
} |
|
687
|
|
|
|
|
|
|
int JS_ToInt64(JSContext *ctx, int64_t *pres, JSValueConst val); |
|
688
|
|
|
|
|
|
|
int JS_ToIndex(JSContext *ctx, uint64_t *plen, JSValueConst val); |
|
689
|
|
|
|
|
|
|
int JS_ToFloat64(JSContext *ctx, double *pres, JSValueConst val); |
|
690
|
|
|
|
|
|
|
/* return an exception if 'val' is a Number */ |
|
691
|
|
|
|
|
|
|
int JS_ToBigInt64(JSContext *ctx, int64_t *pres, JSValueConst val); |
|
692
|
|
|
|
|
|
|
/* same as JS_ToInt64() but allow BigInt */ |
|
693
|
|
|
|
|
|
|
int JS_ToInt64Ext(JSContext *ctx, int64_t *pres, JSValueConst val); |
|
694
|
|
|
|
|
|
|
|
|
695
|
|
|
|
|
|
|
JSValue JS_NewStringLen(JSContext *ctx, const char *str1, size_t len1); |
|
696
|
|
|
|
|
|
|
JSValue JS_NewString(JSContext *ctx, const char *str); |
|
697
|
|
|
|
|
|
|
JSValue JS_NewAtomString(JSContext *ctx, const char *str); |
|
698
|
|
|
|
|
|
|
JSValue JS_ToString(JSContext *ctx, JSValueConst val); |
|
699
|
|
|
|
|
|
|
JSValue JS_ToPropertyKey(JSContext *ctx, JSValueConst val); |
|
700
|
|
|
|
|
|
|
const char *JS_ToCStringLen2(JSContext *ctx, size_t *plen, JSValueConst val1, JS_BOOL cesu8); |
|
701
|
2296
|
|
|
|
|
|
static inline const char *JS_ToCStringLen(JSContext *ctx, size_t *plen, JSValueConst val1) |
|
702
|
|
|
|
|
|
|
{ |
|
703
|
2296
|
|
|
|
|
|
return JS_ToCStringLen2(ctx, plen, val1, 0); |
|
704
|
|
|
|
|
|
|
} |
|
705
|
|
|
|
|
|
|
static inline const char *JS_ToCString(JSContext *ctx, JSValueConst val1) |
|
706
|
|
|
|
|
|
|
{ |
|
707
|
|
|
|
|
|
|
return JS_ToCStringLen2(ctx, NULL, val1, 0); |
|
708
|
|
|
|
|
|
|
} |
|
709
|
|
|
|
|
|
|
void JS_FreeCString(JSContext *ctx, const char *ptr); |
|
710
|
|
|
|
|
|
|
|
|
711
|
|
|
|
|
|
|
JSValue JS_NewObjectProtoClass(JSContext *ctx, JSValueConst proto, JSClassID class_id); |
|
712
|
|
|
|
|
|
|
JSValue JS_NewObjectClass(JSContext *ctx, int class_id); |
|
713
|
|
|
|
|
|
|
JSValue JS_NewObjectProto(JSContext *ctx, JSValueConst proto); |
|
714
|
|
|
|
|
|
|
JSValue JS_NewObject(JSContext *ctx); |
|
715
|
|
|
|
|
|
|
|
|
716
|
|
|
|
|
|
|
JS_BOOL JS_IsFunction(JSContext* ctx, JSValueConst val); |
|
717
|
|
|
|
|
|
|
JS_BOOL JS_IsConstructor(JSContext* ctx, JSValueConst val); |
|
718
|
|
|
|
|
|
|
JS_BOOL JS_SetConstructorBit(JSContext *ctx, JSValueConst func_obj, JS_BOOL val); |
|
719
|
|
|
|
|
|
|
|
|
720
|
|
|
|
|
|
|
JSValue JS_NewArray(JSContext *ctx); |
|
721
|
|
|
|
|
|
|
int JS_IsArray(JSContext *ctx, JSValueConst val); |
|
722
|
|
|
|
|
|
|
|
|
723
|
|
|
|
|
|
|
JSValue JS_GetPropertyInternal(JSContext *ctx, JSValueConst obj, |
|
724
|
|
|
|
|
|
|
JSAtom prop, JSValueConst receiver, |
|
725
|
|
|
|
|
|
|
JS_BOOL throw_ref_error); |
|
726
|
|
|
|
|
|
|
static js_force_inline JSValue JS_GetProperty(JSContext *ctx, JSValueConst this_obj, |
|
727
|
|
|
|
|
|
|
JSAtom prop) |
|
728
|
|
|
|
|
|
|
{ |
|
729
|
1236
|
|
|
|
|
|
return JS_GetPropertyInternal(ctx, this_obj, prop, this_obj, 0); |
|
730
|
|
|
|
|
|
|
} |
|
731
|
|
|
|
|
|
|
JSValue JS_GetPropertyStr(JSContext *ctx, JSValueConst this_obj, |
|
732
|
|
|
|
|
|
|
const char *prop); |
|
733
|
|
|
|
|
|
|
JSValue JS_GetPropertyUint32(JSContext *ctx, JSValueConst this_obj, |
|
734
|
|
|
|
|
|
|
uint32_t idx); |
|
735
|
|
|
|
|
|
|
|
|
736
|
|
|
|
|
|
|
int JS_SetPropertyInternal(JSContext *ctx, JSValueConst this_obj, |
|
737
|
|
|
|
|
|
|
JSAtom prop, JSValue val, |
|
738
|
|
|
|
|
|
|
int flags); |
|
739
|
|
|
|
|
|
|
static inline int JS_SetProperty(JSContext *ctx, JSValueConst this_obj, |
|
740
|
|
|
|
|
|
|
JSAtom prop, JSValue val) |
|
741
|
|
|
|
|
|
|
{ |
|
742
|
|
|
|
|
|
|
return JS_SetPropertyInternal(ctx, this_obj, prop, val, JS_PROP_THROW); |
|
743
|
|
|
|
|
|
|
} |
|
744
|
|
|
|
|
|
|
int JS_SetPropertyUint32(JSContext *ctx, JSValueConst this_obj, |
|
745
|
|
|
|
|
|
|
uint32_t idx, JSValue val); |
|
746
|
|
|
|
|
|
|
int JS_SetPropertyInt64(JSContext *ctx, JSValueConst this_obj, |
|
747
|
|
|
|
|
|
|
int64_t idx, JSValue val); |
|
748
|
|
|
|
|
|
|
int JS_SetPropertyStr(JSContext *ctx, JSValueConst this_obj, |
|
749
|
|
|
|
|
|
|
const char *prop, JSValue val); |
|
750
|
|
|
|
|
|
|
int JS_HasProperty(JSContext *ctx, JSValueConst this_obj, JSAtom prop); |
|
751
|
|
|
|
|
|
|
int JS_IsExtensible(JSContext *ctx, JSValueConst obj); |
|
752
|
|
|
|
|
|
|
int JS_PreventExtensions(JSContext *ctx, JSValueConst obj); |
|
753
|
|
|
|
|
|
|
int JS_DeleteProperty(JSContext *ctx, JSValueConst obj, JSAtom prop, int flags); |
|
754
|
|
|
|
|
|
|
int JS_SetPrototype(JSContext *ctx, JSValueConst obj, JSValueConst proto_val); |
|
755
|
|
|
|
|
|
|
JSValue JS_GetPrototype(JSContext *ctx, JSValueConst val); |
|
756
|
|
|
|
|
|
|
|
|
757
|
|
|
|
|
|
|
#define JS_GPN_STRING_MASK (1 << 0) |
|
758
|
|
|
|
|
|
|
#define JS_GPN_SYMBOL_MASK (1 << 1) |
|
759
|
|
|
|
|
|
|
#define JS_GPN_PRIVATE_MASK (1 << 2) |
|
760
|
|
|
|
|
|
|
/* only include the enumerable properties */ |
|
761
|
|
|
|
|
|
|
#define JS_GPN_ENUM_ONLY (1 << 4) |
|
762
|
|
|
|
|
|
|
/* set theJSPropertyEnum.is_enumerable field */ |
|
763
|
|
|
|
|
|
|
#define JS_GPN_SET_ENUM (1 << 5) |
|
764
|
|
|
|
|
|
|
|
|
765
|
|
|
|
|
|
|
int JS_GetOwnPropertyNames(JSContext *ctx, JSPropertyEnum **ptab, |
|
766
|
|
|
|
|
|
|
uint32_t *plen, JSValueConst obj, int flags); |
|
767
|
|
|
|
|
|
|
int JS_GetOwnProperty(JSContext *ctx, JSPropertyDescriptor *desc, |
|
768
|
|
|
|
|
|
|
JSValueConst obj, JSAtom prop); |
|
769
|
|
|
|
|
|
|
|
|
770
|
|
|
|
|
|
|
JSValue JS_Call(JSContext *ctx, JSValueConst func_obj, JSValueConst this_obj, |
|
771
|
|
|
|
|
|
|
int argc, JSValueConst *argv); |
|
772
|
|
|
|
|
|
|
JSValue JS_Invoke(JSContext *ctx, JSValueConst this_val, JSAtom atom, |
|
773
|
|
|
|
|
|
|
int argc, JSValueConst *argv); |
|
774
|
|
|
|
|
|
|
JSValue JS_CallConstructor(JSContext *ctx, JSValueConst func_obj, |
|
775
|
|
|
|
|
|
|
int argc, JSValueConst *argv); |
|
776
|
|
|
|
|
|
|
JSValue JS_CallConstructor2(JSContext *ctx, JSValueConst func_obj, |
|
777
|
|
|
|
|
|
|
JSValueConst new_target, |
|
778
|
|
|
|
|
|
|
int argc, JSValueConst *argv); |
|
779
|
|
|
|
|
|
|
JS_BOOL JS_DetectModule(const char *input, size_t input_len); |
|
780
|
|
|
|
|
|
|
/* 'input' must be zero terminated i.e. input[input_len] = '\0'. */ |
|
781
|
|
|
|
|
|
|
JSValue JS_Eval(JSContext *ctx, const char *input, size_t input_len, |
|
782
|
|
|
|
|
|
|
const char *filename, int eval_flags); |
|
783
|
|
|
|
|
|
|
/* same as JS_Eval() but with an explicit 'this_obj' parameter */ |
|
784
|
|
|
|
|
|
|
JSValue JS_EvalThis(JSContext *ctx, JSValueConst this_obj, |
|
785
|
|
|
|
|
|
|
const char *input, size_t input_len, |
|
786
|
|
|
|
|
|
|
const char *filename, int eval_flags); |
|
787
|
|
|
|
|
|
|
JSValue JS_GetGlobalObject(JSContext *ctx); |
|
788
|
|
|
|
|
|
|
int JS_IsInstanceOf(JSContext *ctx, JSValueConst val, JSValueConst obj); |
|
789
|
|
|
|
|
|
|
int JS_DefineProperty(JSContext *ctx, JSValueConst this_obj, |
|
790
|
|
|
|
|
|
|
JSAtom prop, JSValueConst val, |
|
791
|
|
|
|
|
|
|
JSValueConst getter, JSValueConst setter, int flags); |
|
792
|
|
|
|
|
|
|
int JS_DefinePropertyValue(JSContext *ctx, JSValueConst this_obj, |
|
793
|
|
|
|
|
|
|
JSAtom prop, JSValue val, int flags); |
|
794
|
|
|
|
|
|
|
int JS_DefinePropertyValueUint32(JSContext *ctx, JSValueConst this_obj, |
|
795
|
|
|
|
|
|
|
uint32_t idx, JSValue val, int flags); |
|
796
|
|
|
|
|
|
|
int JS_DefinePropertyValueStr(JSContext *ctx, JSValueConst this_obj, |
|
797
|
|
|
|
|
|
|
const char *prop, JSValue val, int flags); |
|
798
|
|
|
|
|
|
|
int JS_DefinePropertyGetSet(JSContext *ctx, JSValueConst this_obj, |
|
799
|
|
|
|
|
|
|
JSAtom prop, JSValue getter, JSValue setter, |
|
800
|
|
|
|
|
|
|
int flags); |
|
801
|
|
|
|
|
|
|
void JS_SetOpaque(JSValue obj, void *opaque); |
|
802
|
|
|
|
|
|
|
void *JS_GetOpaque(JSValueConst obj, JSClassID class_id); |
|
803
|
|
|
|
|
|
|
void *JS_GetOpaque2(JSContext *ctx, JSValueConst obj, JSClassID class_id); |
|
804
|
|
|
|
|
|
|
|
|
805
|
|
|
|
|
|
|
/* 'buf' must be zero terminated i.e. buf[buf_len] = '\0'. */ |
|
806
|
|
|
|
|
|
|
JSValue JS_ParseJSON(JSContext *ctx, const char *buf, size_t buf_len, |
|
807
|
|
|
|
|
|
|
const char *filename); |
|
808
|
|
|
|
|
|
|
#define JS_PARSE_JSON_EXT (1 << 0) /* allow extended JSON */ |
|
809
|
|
|
|
|
|
|
JSValue JS_ParseJSON2(JSContext *ctx, const char *buf, size_t buf_len, |
|
810
|
|
|
|
|
|
|
const char *filename, int flags); |
|
811
|
|
|
|
|
|
|
JSValue JS_JSONStringify(JSContext *ctx, JSValueConst obj, |
|
812
|
|
|
|
|
|
|
JSValueConst replacer, JSValueConst space0); |
|
813
|
|
|
|
|
|
|
|
|
814
|
|
|
|
|
|
|
typedef void JSFreeArrayBufferDataFunc(JSRuntime *rt, void *opaque, void *ptr); |
|
815
|
|
|
|
|
|
|
JSValue JS_NewArrayBuffer(JSContext *ctx, uint8_t *buf, size_t len, |
|
816
|
|
|
|
|
|
|
JSFreeArrayBufferDataFunc *free_func, void *opaque, |
|
817
|
|
|
|
|
|
|
JS_BOOL is_shared); |
|
818
|
|
|
|
|
|
|
JSValue JS_NewArrayBufferCopy(JSContext *ctx, const uint8_t *buf, size_t len); |
|
819
|
|
|
|
|
|
|
void JS_DetachArrayBuffer(JSContext *ctx, JSValueConst obj); |
|
820
|
|
|
|
|
|
|
uint8_t *JS_GetArrayBuffer(JSContext *ctx, size_t *psize, JSValueConst obj); |
|
821
|
|
|
|
|
|
|
JSValue JS_GetTypedArrayBuffer(JSContext *ctx, JSValueConst obj, |
|
822
|
|
|
|
|
|
|
size_t *pbyte_offset, |
|
823
|
|
|
|
|
|
|
size_t *pbyte_length, |
|
824
|
|
|
|
|
|
|
size_t *pbytes_per_element); |
|
825
|
|
|
|
|
|
|
typedef struct { |
|
826
|
|
|
|
|
|
|
void *(*sab_alloc)(void *opaque, size_t size); |
|
827
|
|
|
|
|
|
|
void (*sab_free)(void *opaque, void *ptr); |
|
828
|
|
|
|
|
|
|
void (*sab_dup)(void *opaque, void *ptr); |
|
829
|
|
|
|
|
|
|
void *sab_opaque; |
|
830
|
|
|
|
|
|
|
} JSSharedArrayBufferFunctions; |
|
831
|
|
|
|
|
|
|
void JS_SetSharedArrayBufferFunctions(JSRuntime *rt, |
|
832
|
|
|
|
|
|
|
const JSSharedArrayBufferFunctions *sf); |
|
833
|
|
|
|
|
|
|
|
|
834
|
|
|
|
|
|
|
JSValue JS_NewPromiseCapability(JSContext *ctx, JSValue *resolving_funcs); |
|
835
|
|
|
|
|
|
|
|
|
836
|
|
|
|
|
|
|
/* is_handled = TRUE means that the rejection is handled */ |
|
837
|
|
|
|
|
|
|
typedef void JSHostPromiseRejectionTracker(JSContext *ctx, JSValueConst promise, |
|
838
|
|
|
|
|
|
|
JSValueConst reason, |
|
839
|
|
|
|
|
|
|
JS_BOOL is_handled, void *opaque); |
|
840
|
|
|
|
|
|
|
void JS_SetHostPromiseRejectionTracker(JSRuntime *rt, JSHostPromiseRejectionTracker *cb, void *opaque); |
|
841
|
|
|
|
|
|
|
|
|
842
|
|
|
|
|
|
|
/* return != 0 if the JS code needs to be interrupted */ |
|
843
|
|
|
|
|
|
|
typedef int JSInterruptHandler(JSRuntime *rt, void *opaque); |
|
844
|
|
|
|
|
|
|
void JS_SetInterruptHandler(JSRuntime *rt, JSInterruptHandler *cb, void *opaque); |
|
845
|
|
|
|
|
|
|
/* if can_block is TRUE, Atomics.wait() can be used */ |
|
846
|
|
|
|
|
|
|
void JS_SetCanBlock(JSRuntime *rt, JS_BOOL can_block); |
|
847
|
|
|
|
|
|
|
/* set the [IsHTMLDDA] internal slot */ |
|
848
|
|
|
|
|
|
|
void JS_SetIsHTMLDDA(JSContext *ctx, JSValueConst obj); |
|
849
|
|
|
|
|
|
|
|
|
850
|
|
|
|
|
|
|
typedef struct JSModuleDef JSModuleDef; |
|
851
|
|
|
|
|
|
|
|
|
852
|
|
|
|
|
|
|
/* return the module specifier (allocated with js_malloc()) or NULL if |
|
853
|
|
|
|
|
|
|
exception */ |
|
854
|
|
|
|
|
|
|
typedef char *JSModuleNormalizeFunc(JSContext *ctx, |
|
855
|
|
|
|
|
|
|
const char *module_base_name, |
|
856
|
|
|
|
|
|
|
const char *module_name, void *opaque); |
|
857
|
|
|
|
|
|
|
typedef JSModuleDef *JSModuleLoaderFunc(JSContext *ctx, |
|
858
|
|
|
|
|
|
|
const char *module_name, void *opaque); |
|
859
|
|
|
|
|
|
|
|
|
860
|
|
|
|
|
|
|
/* module_normalize = NULL is allowed and invokes the default module |
|
861
|
|
|
|
|
|
|
filename normalizer */ |
|
862
|
|
|
|
|
|
|
void JS_SetModuleLoaderFunc(JSRuntime *rt, |
|
863
|
|
|
|
|
|
|
JSModuleNormalizeFunc *module_normalize, |
|
864
|
|
|
|
|
|
|
JSModuleLoaderFunc *module_loader, void *opaque); |
|
865
|
|
|
|
|
|
|
/* return the import.meta object of a module */ |
|
866
|
|
|
|
|
|
|
JSValue JS_GetImportMeta(JSContext *ctx, JSModuleDef *m); |
|
867
|
|
|
|
|
|
|
JSAtom JS_GetModuleName(JSContext *ctx, JSModuleDef *m); |
|
868
|
|
|
|
|
|
|
|
|
869
|
|
|
|
|
|
|
/* JS Job support */ |
|
870
|
|
|
|
|
|
|
|
|
871
|
|
|
|
|
|
|
typedef JSValue JSJobFunc(JSContext *ctx, int argc, JSValueConst *argv); |
|
872
|
|
|
|
|
|
|
int JS_EnqueueJob(JSContext *ctx, JSJobFunc *job_func, int argc, JSValueConst *argv); |
|
873
|
|
|
|
|
|
|
|
|
874
|
|
|
|
|
|
|
JS_BOOL JS_IsJobPending(JSRuntime *rt); |
|
875
|
|
|
|
|
|
|
int JS_ExecutePendingJob(JSRuntime *rt, JSContext **pctx); |
|
876
|
|
|
|
|
|
|
|
|
877
|
|
|
|
|
|
|
/* Object Writer/Reader (currently only used to handle precompiled code) */ |
|
878
|
|
|
|
|
|
|
#define JS_WRITE_OBJ_BYTECODE (1 << 0) /* allow function/module */ |
|
879
|
|
|
|
|
|
|
#define JS_WRITE_OBJ_BSWAP (1 << 1) /* byte swapped output */ |
|
880
|
|
|
|
|
|
|
#define JS_WRITE_OBJ_SAB (1 << 2) /* allow SharedArrayBuffer */ |
|
881
|
|
|
|
|
|
|
#define JS_WRITE_OBJ_REFERENCE (1 << 3) /* allow object references to |
|
882
|
|
|
|
|
|
|
encode arbitrary object |
|
883
|
|
|
|
|
|
|
graph */ |
|
884
|
|
|
|
|
|
|
uint8_t *JS_WriteObject(JSContext *ctx, size_t *psize, JSValueConst obj, |
|
885
|
|
|
|
|
|
|
int flags); |
|
886
|
|
|
|
|
|
|
uint8_t *JS_WriteObject2(JSContext *ctx, size_t *psize, JSValueConst obj, |
|
887
|
|
|
|
|
|
|
int flags, uint8_t ***psab_tab, size_t *psab_tab_len); |
|
888
|
|
|
|
|
|
|
|
|
889
|
|
|
|
|
|
|
#define JS_READ_OBJ_BYTECODE (1 << 0) /* allow function/module */ |
|
890
|
|
|
|
|
|
|
#define JS_READ_OBJ_ROM_DATA (1 << 1) /* avoid duplicating 'buf' data */ |
|
891
|
|
|
|
|
|
|
#define JS_READ_OBJ_SAB (1 << 2) /* allow SharedArrayBuffer */ |
|
892
|
|
|
|
|
|
|
#define JS_READ_OBJ_REFERENCE (1 << 3) /* allow object references */ |
|
893
|
|
|
|
|
|
|
JSValue JS_ReadObject(JSContext *ctx, const uint8_t *buf, size_t buf_len, |
|
894
|
|
|
|
|
|
|
int flags); |
|
895
|
|
|
|
|
|
|
/* instantiate and evaluate a bytecode function. Only used when |
|
896
|
|
|
|
|
|
|
reading a script or module with JS_ReadObject() */ |
|
897
|
|
|
|
|
|
|
JSValue JS_EvalFunction(JSContext *ctx, JSValue fun_obj); |
|
898
|
|
|
|
|
|
|
/* load the dependencies of the module 'obj'. Useful when JS_ReadObject() |
|
899
|
|
|
|
|
|
|
returns a module. */ |
|
900
|
|
|
|
|
|
|
int JS_ResolveModule(JSContext *ctx, JSValueConst obj); |
|
901
|
|
|
|
|
|
|
|
|
902
|
|
|
|
|
|
|
/* only exported for os.Worker() */ |
|
903
|
|
|
|
|
|
|
JSAtom JS_GetScriptOrModuleName(JSContext *ctx, int n_stack_levels); |
|
904
|
|
|
|
|
|
|
/* only exported for os.Worker() */ |
|
905
|
|
|
|
|
|
|
JSModuleDef *JS_RunModule(JSContext *ctx, const char *basename, |
|
906
|
|
|
|
|
|
|
const char *filename); |
|
907
|
|
|
|
|
|
|
|
|
908
|
|
|
|
|
|
|
/* C function definition */ |
|
909
|
|
|
|
|
|
|
typedef enum JSCFunctionEnum { /* XXX: should rename for namespace isolation */ |
|
910
|
|
|
|
|
|
|
JS_CFUNC_generic, |
|
911
|
|
|
|
|
|
|
JS_CFUNC_generic_magic, |
|
912
|
|
|
|
|
|
|
JS_CFUNC_constructor, |
|
913
|
|
|
|
|
|
|
JS_CFUNC_constructor_magic, |
|
914
|
|
|
|
|
|
|
JS_CFUNC_constructor_or_func, |
|
915
|
|
|
|
|
|
|
JS_CFUNC_constructor_or_func_magic, |
|
916
|
|
|
|
|
|
|
JS_CFUNC_f_f, |
|
917
|
|
|
|
|
|
|
JS_CFUNC_f_f_f, |
|
918
|
|
|
|
|
|
|
JS_CFUNC_getter, |
|
919
|
|
|
|
|
|
|
JS_CFUNC_setter, |
|
920
|
|
|
|
|
|
|
JS_CFUNC_getter_magic, |
|
921
|
|
|
|
|
|
|
JS_CFUNC_setter_magic, |
|
922
|
|
|
|
|
|
|
JS_CFUNC_iterator_next, |
|
923
|
|
|
|
|
|
|
} JSCFunctionEnum; |
|
924
|
|
|
|
|
|
|
|
|
925
|
|
|
|
|
|
|
typedef union JSCFunctionType { |
|
926
|
|
|
|
|
|
|
JSCFunction *generic; |
|
927
|
|
|
|
|
|
|
JSValue (*generic_magic)(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv, int magic); |
|
928
|
|
|
|
|
|
|
JSCFunction *constructor; |
|
929
|
|
|
|
|
|
|
JSValue (*constructor_magic)(JSContext *ctx, JSValueConst new_target, int argc, JSValueConst *argv, int magic); |
|
930
|
|
|
|
|
|
|
JSCFunction *constructor_or_func; |
|
931
|
|
|
|
|
|
|
double (*f_f)(double); |
|
932
|
|
|
|
|
|
|
double (*f_f_f)(double, double); |
|
933
|
|
|
|
|
|
|
JSValue (*getter)(JSContext *ctx, JSValueConst this_val); |
|
934
|
|
|
|
|
|
|
JSValue (*setter)(JSContext *ctx, JSValueConst this_val, JSValueConst val); |
|
935
|
|
|
|
|
|
|
JSValue (*getter_magic)(JSContext *ctx, JSValueConst this_val, int magic); |
|
936
|
|
|
|
|
|
|
JSValue (*setter_magic)(JSContext *ctx, JSValueConst this_val, JSValueConst val, int magic); |
|
937
|
|
|
|
|
|
|
JSValue (*iterator_next)(JSContext *ctx, JSValueConst this_val, |
|
938
|
|
|
|
|
|
|
int argc, JSValueConst *argv, int *pdone, int magic); |
|
939
|
|
|
|
|
|
|
} JSCFunctionType; |
|
940
|
|
|
|
|
|
|
|
|
941
|
|
|
|
|
|
|
JSValue JS_NewCFunction2(JSContext *ctx, JSCFunction *func, |
|
942
|
|
|
|
|
|
|
const char *name, |
|
943
|
|
|
|
|
|
|
int length, JSCFunctionEnum cproto, int magic); |
|
944
|
|
|
|
|
|
|
JSValue JS_NewCFunctionData(JSContext *ctx, JSCFunctionData *func, |
|
945
|
|
|
|
|
|
|
int length, int magic, int data_len, |
|
946
|
|
|
|
|
|
|
JSValueConst *data); |
|
947
|
|
|
|
|
|
|
|
|
948
|
|
|
|
|
|
|
static inline JSValue JS_NewCFunction(JSContext *ctx, JSCFunction *func, const char *name, |
|
949
|
|
|
|
|
|
|
int length) |
|
950
|
|
|
|
|
|
|
{ |
|
951
|
|
|
|
|
|
|
return JS_NewCFunction2(ctx, func, name, length, JS_CFUNC_generic, 0); |
|
952
|
|
|
|
|
|
|
} |
|
953
|
|
|
|
|
|
|
|
|
954
|
|
|
|
|
|
|
static inline JSValue JS_NewCFunctionMagic(JSContext *ctx, JSCFunctionMagic *func, |
|
955
|
|
|
|
|
|
|
const char *name, |
|
956
|
|
|
|
|
|
|
int length, JSCFunctionEnum cproto, int magic) |
|
957
|
|
|
|
|
|
|
{ |
|
958
|
|
|
|
|
|
|
return JS_NewCFunction2(ctx, (JSCFunction *)func, name, length, cproto, magic); |
|
959
|
|
|
|
|
|
|
} |
|
960
|
|
|
|
|
|
|
void JS_SetConstructor(JSContext *ctx, JSValueConst func_obj, |
|
961
|
|
|
|
|
|
|
JSValueConst proto); |
|
962
|
|
|
|
|
|
|
|
|
963
|
|
|
|
|
|
|
/* C property definition */ |
|
964
|
|
|
|
|
|
|
|
|
965
|
|
|
|
|
|
|
typedef struct JSCFunctionListEntry { |
|
966
|
|
|
|
|
|
|
const char *name; |
|
967
|
|
|
|
|
|
|
uint8_t prop_flags; |
|
968
|
|
|
|
|
|
|
uint8_t def_type; |
|
969
|
|
|
|
|
|
|
int16_t magic; |
|
970
|
|
|
|
|
|
|
union { |
|
971
|
|
|
|
|
|
|
struct { |
|
972
|
|
|
|
|
|
|
uint8_t length; /* XXX: should move outside union */ |
|
973
|
|
|
|
|
|
|
uint8_t cproto; /* XXX: should move outside union */ |
|
974
|
|
|
|
|
|
|
JSCFunctionType cfunc; |
|
975
|
|
|
|
|
|
|
} func; |
|
976
|
|
|
|
|
|
|
struct { |
|
977
|
|
|
|
|
|
|
JSCFunctionType get; |
|
978
|
|
|
|
|
|
|
JSCFunctionType set; |
|
979
|
|
|
|
|
|
|
} getset; |
|
980
|
|
|
|
|
|
|
struct { |
|
981
|
|
|
|
|
|
|
const char *name; |
|
982
|
|
|
|
|
|
|
int base; |
|
983
|
|
|
|
|
|
|
} alias; |
|
984
|
|
|
|
|
|
|
struct { |
|
985
|
|
|
|
|
|
|
const struct JSCFunctionListEntry *tab; |
|
986
|
|
|
|
|
|
|
int len; |
|
987
|
|
|
|
|
|
|
} prop_list; |
|
988
|
|
|
|
|
|
|
const char *str; |
|
989
|
|
|
|
|
|
|
int32_t i32; |
|
990
|
|
|
|
|
|
|
int64_t i64; |
|
991
|
|
|
|
|
|
|
double f64; |
|
992
|
|
|
|
|
|
|
} u; |
|
993
|
|
|
|
|
|
|
} JSCFunctionListEntry; |
|
994
|
|
|
|
|
|
|
|
|
995
|
|
|
|
|
|
|
#define JS_DEF_CFUNC 0 |
|
996
|
|
|
|
|
|
|
#define JS_DEF_CGETSET 1 |
|
997
|
|
|
|
|
|
|
#define JS_DEF_CGETSET_MAGIC 2 |
|
998
|
|
|
|
|
|
|
#define JS_DEF_PROP_STRING 3 |
|
999
|
|
|
|
|
|
|
#define JS_DEF_PROP_INT32 4 |
|
1000
|
|
|
|
|
|
|
#define JS_DEF_PROP_INT64 5 |
|
1001
|
|
|
|
|
|
|
#define JS_DEF_PROP_DOUBLE 6 |
|
1002
|
|
|
|
|
|
|
#define JS_DEF_PROP_UNDEFINED 7 |
|
1003
|
|
|
|
|
|
|
#define JS_DEF_OBJECT 8 |
|
1004
|
|
|
|
|
|
|
#define JS_DEF_ALIAS 9 |
|
1005
|
|
|
|
|
|
|
|
|
1006
|
|
|
|
|
|
|
/* Note: c++ does not like nested designators */ |
|
1007
|
|
|
|
|
|
|
#define JS_CFUNC_DEF(name, length, func1) { name, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE, JS_DEF_CFUNC, 0, .u = { .func = { length, JS_CFUNC_generic, { .generic = func1 } } } } |
|
1008
|
|
|
|
|
|
|
#define JS_CFUNC_MAGIC_DEF(name, length, func1, magic) { name, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE, JS_DEF_CFUNC, magic, .u = { .func = { length, JS_CFUNC_generic_magic, { .generic_magic = func1 } } } } |
|
1009
|
|
|
|
|
|
|
#define JS_CFUNC_SPECIAL_DEF(name, length, cproto, func1) { name, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE, JS_DEF_CFUNC, 0, .u = { .func = { length, JS_CFUNC_ ## cproto, { .cproto = func1 } } } } |
|
1010
|
|
|
|
|
|
|
#define JS_ITERATOR_NEXT_DEF(name, length, func1, magic) { name, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE, JS_DEF_CFUNC, magic, .u = { .func = { length, JS_CFUNC_iterator_next, { .iterator_next = func1 } } } } |
|
1011
|
|
|
|
|
|
|
#define JS_CGETSET_DEF(name, fgetter, fsetter) { name, JS_PROP_CONFIGURABLE, JS_DEF_CGETSET, 0, .u = { .getset = { .get = { .getter = fgetter }, .set = { .setter = fsetter } } } } |
|
1012
|
|
|
|
|
|
|
#define JS_CGETSET_MAGIC_DEF(name, fgetter, fsetter, magic) { name, JS_PROP_CONFIGURABLE, JS_DEF_CGETSET_MAGIC, magic, .u = { .getset = { .get = { .getter_magic = fgetter }, .set = { .setter_magic = fsetter } } } } |
|
1013
|
|
|
|
|
|
|
#define JS_PROP_STRING_DEF(name, cstr, prop_flags) { name, prop_flags, JS_DEF_PROP_STRING, 0, .u = { .str = cstr } } |
|
1014
|
|
|
|
|
|
|
#define JS_PROP_INT32_DEF(name, val, prop_flags) { name, prop_flags, JS_DEF_PROP_INT32, 0, .u = { .i32 = val } } |
|
1015
|
|
|
|
|
|
|
#define JS_PROP_INT64_DEF(name, val, prop_flags) { name, prop_flags, JS_DEF_PROP_INT64, 0, .u = { .i64 = val } } |
|
1016
|
|
|
|
|
|
|
#define JS_PROP_DOUBLE_DEF(name, val, prop_flags) { name, prop_flags, JS_DEF_PROP_DOUBLE, 0, .u = { .f64 = val } } |
|
1017
|
|
|
|
|
|
|
#define JS_PROP_UNDEFINED_DEF(name, prop_flags) { name, prop_flags, JS_DEF_PROP_UNDEFINED, 0, .u = { .i32 = 0 } } |
|
1018
|
|
|
|
|
|
|
#define JS_OBJECT_DEF(name, tab, len, prop_flags) { name, prop_flags, JS_DEF_OBJECT, 0, .u = { .prop_list = { tab, len } } } |
|
1019
|
|
|
|
|
|
|
#define JS_ALIAS_DEF(name, from) { name, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE, JS_DEF_ALIAS, 0, .u = { .alias = { from, -1 } } } |
|
1020
|
|
|
|
|
|
|
#define JS_ALIAS_BASE_DEF(name, from, base) { name, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE, JS_DEF_ALIAS, 0, .u = { .alias = { from, base } } } |
|
1021
|
|
|
|
|
|
|
|
|
1022
|
|
|
|
|
|
|
void JS_SetPropertyFunctionList(JSContext *ctx, JSValueConst obj, |
|
1023
|
|
|
|
|
|
|
const JSCFunctionListEntry *tab, |
|
1024
|
|
|
|
|
|
|
int len); |
|
1025
|
|
|
|
|
|
|
|
|
1026
|
|
|
|
|
|
|
/* C module definition */ |
|
1027
|
|
|
|
|
|
|
|
|
1028
|
|
|
|
|
|
|
typedef int JSModuleInitFunc(JSContext *ctx, JSModuleDef *m); |
|
1029
|
|
|
|
|
|
|
|
|
1030
|
|
|
|
|
|
|
JSModuleDef *JS_NewCModule(JSContext *ctx, const char *name_str, |
|
1031
|
|
|
|
|
|
|
JSModuleInitFunc *func); |
|
1032
|
|
|
|
|
|
|
/* can only be called before the module is instantiated */ |
|
1033
|
|
|
|
|
|
|
int JS_AddModuleExport(JSContext *ctx, JSModuleDef *m, const char *name_str); |
|
1034
|
|
|
|
|
|
|
int JS_AddModuleExportList(JSContext *ctx, JSModuleDef *m, |
|
1035
|
|
|
|
|
|
|
const JSCFunctionListEntry *tab, int len); |
|
1036
|
|
|
|
|
|
|
/* can only be called after the module is instantiated */ |
|
1037
|
|
|
|
|
|
|
int JS_SetModuleExport(JSContext *ctx, JSModuleDef *m, const char *export_name, |
|
1038
|
|
|
|
|
|
|
JSValue val); |
|
1039
|
|
|
|
|
|
|
int JS_SetModuleExportList(JSContext *ctx, JSModuleDef *m, |
|
1040
|
|
|
|
|
|
|
const JSCFunctionListEntry *tab, int len); |
|
1041
|
|
|
|
|
|
|
|
|
1042
|
|
|
|
|
|
|
#undef js_unlikely |
|
1043
|
|
|
|
|
|
|
#undef js_force_inline |
|
1044
|
|
|
|
|
|
|
|
|
1045
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
1046
|
|
|
|
|
|
|
} /* extern "C" { */ |
|
1047
|
|
|
|
|
|
|
#endif |
|
1048
|
|
|
|
|
|
|
|
|
1049
|
|
|
|
|
|
|
#endif /* QUICKJS_H */ |