xbintsc 0.3.3 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/ast/expressions.d.ts +8 -0
- package/dist/src/binder/binder.js +1 -0
- package/dist/src/binder/binder.js.map +1 -1
- package/dist/src/binder/references.d.ts +1 -1
- package/dist/src/binder/references.js +34 -5
- package/dist/src/binder/references.js.map +1 -1
- package/dist/src/binder/types.d.ts +4 -0
- package/dist/src/binder/types.js.map +1 -1
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/codegen/generator/calls/access.d.ts +9 -1
- package/dist/src/codegen/generator/calls/access.js +146 -13
- package/dist/src/codegen/generator/calls/access.js.map +1 -1
- package/dist/src/codegen/generator/calls/closures.d.ts +1 -0
- package/dist/src/codegen/generator/calls/closures.js +25 -0
- package/dist/src/codegen/generator/calls/closures.js.map +1 -1
- package/dist/src/codegen/generator/calls/invocation.js +12 -1
- package/dist/src/codegen/generator/calls/invocation.js.map +1 -1
- package/dist/src/codegen/generator/calls/literals.js +12 -4
- package/dist/src/codegen/generator/calls/literals.js.map +1 -1
- package/dist/src/codegen/generator/calls/super.js +4 -7
- package/dist/src/codegen/generator/calls/super.js.map +1 -1
- package/dist/src/codegen/generator/context.d.ts +21 -2
- package/dist/src/codegen/generator/context.js +42 -5
- package/dist/src/codegen/generator/context.js.map +1 -1
- package/dist/src/codegen/generator/expressions/assignment.js +1 -3
- package/dist/src/codegen/generator/expressions/assignment.js.map +1 -1
- package/dist/src/codegen/generator/expressions/primary.d.ts +3 -1
- package/dist/src/codegen/generator/expressions/primary.js +99 -1
- package/dist/src/codegen/generator/expressions/primary.js.map +1 -1
- package/dist/src/codegen/generator/generator.js.map +1 -1
- package/dist/src/codegen/generator/module.js +25 -15
- package/dist/src/codegen/generator/module.js.map +1 -1
- package/dist/src/codegen/generator/state.d.ts +15 -0
- package/dist/src/codegen/generator/state.js +28 -1
- package/dist/src/codegen/generator/state.js.map +1 -1
- package/dist/src/codegen/generator/statements/control-flow.d.ts +3 -1
- package/dist/src/codegen/generator/statements/control-flow.js +85 -0
- package/dist/src/codegen/generator/statements/control-flow.js.map +1 -1
- package/dist/src/codegen/generator/statements/dispatch.js +15 -6
- package/dist/src/codegen/generator/statements/dispatch.js.map +1 -1
- package/dist/src/codegen/generator/statements/loops.d.ts +3 -0
- package/dist/src/codegen/generator/statements/loops.js +25 -11
- package/dist/src/codegen/generator/statements/loops.js.map +1 -1
- package/dist/src/codegen/generator/tables.d.ts +7 -0
- package/dist/src/codegen/generator/tables.js +41 -1
- package/dist/src/codegen/generator/tables.js.map +1 -1
- package/dist/src/driver/compiler.d.ts +1 -1
- package/dist/src/driver/compiler.js +33 -1
- package/dist/src/driver/compiler.js.map +1 -1
- package/dist/src/driver/modules.d.ts +4 -3
- package/dist/src/driver/modules.js +61 -4
- package/dist/src/driver/modules.js.map +1 -1
- package/dist/src/driver/toolchain.js +1 -1
- package/dist/src/driver/toolchain.js.map +1 -1
- package/dist/src/lexer/scanner.js.map +1 -1
- package/dist/src/parser/declarations/classes.js +4 -0
- package/dist/src/parser/declarations/classes.js.map +1 -1
- package/dist/src/parser/declarations/type-members.js.map +1 -1
- package/dist/src/parser/expressions.d.ts +2 -1
- package/dist/src/parser/expressions.js +10 -1
- package/dist/src/parser/expressions.js.map +1 -1
- package/dist/src/parser/helpers.js +2 -2
- package/dist/src/parser/helpers.js.map +1 -1
- package/dist/src/parser/literals.js +79 -6
- package/dist/src/parser/literals.js.map +1 -1
- package/dist/src/parser/modules.js.map +1 -1
- package/dist/src/parser/parser.js +0 -1
- package/dist/src/parser/parser.js.map +1 -1
- package/dist/src/parser/statements.d.ts +1 -0
- package/dist/src/parser/statements.js +13 -1
- package/dist/src/parser/statements.js.map +1 -1
- package/dist/src/parser/types.js +2 -2
- package/dist/src/parser/types.js.map +1 -1
- package/dist/tests/ast/factory.test.d.ts +1 -0
- package/dist/tests/ast/factory.test.js +35 -0
- package/dist/tests/ast/factory.test.js.map +1 -0
- package/dist/tests/ast/visitor.test.d.ts +1 -0
- package/dist/tests/ast/visitor.test.js +53 -0
- package/dist/tests/ast/visitor.test.js.map +1 -0
- package/dist/tests/cli/main.test.js +109 -9
- package/dist/tests/cli/main.test.js.map +1 -1
- package/dist/tests/codegen/closures.test.d.ts +1 -0
- package/dist/tests/codegen/closures.test.js +32 -0
- package/dist/tests/codegen/closures.test.js.map +1 -0
- package/dist/tests/codegen/expressions.test.d.ts +1 -0
- package/dist/tests/codegen/expressions.test.js +149 -0
- package/dist/tests/codegen/expressions.test.js.map +1 -0
- package/dist/tests/codegen/llvm.test.js +14 -0
- package/dist/tests/codegen/llvm.test.js.map +1 -1
- package/dist/tests/codegen/values.test.d.ts +1 -0
- package/dist/tests/codegen/values.test.js +48 -0
- package/dist/tests/codegen/values.test.js.map +1 -0
- package/dist/tests/diagnostics/diagnostic.test.d.ts +1 -0
- package/dist/tests/diagnostics/diagnostic.test.js +117 -0
- package/dist/tests/diagnostics/diagnostic.test.js.map +1 -0
- package/dist/tests/diagnostics/source.test.d.ts +1 -0
- package/dist/tests/diagnostics/source.test.js +58 -0
- package/dist/tests/diagnostics/source.test.js.map +1 -0
- package/dist/tests/driver/modules.test.d.ts +1 -0
- package/dist/tests/driver/modules.test.js +140 -0
- package/dist/tests/driver/modules.test.js.map +1 -0
- package/dist/tests/driver/paths.test.js +17 -1
- package/dist/tests/driver/paths.test.js.map +1 -1
- package/dist/tests/driver/runtime-lib.test.d.ts +1 -0
- package/dist/tests/driver/runtime-lib.test.js +19 -0
- package/dist/tests/driver/runtime-lib.test.js.map +1 -0
- package/dist/tests/driver/toolchain-provider.test.js +91 -0
- package/dist/tests/driver/toolchain-provider.test.js.map +1 -1
- package/dist/tests/driver/toolchain.test.js +11 -1
- package/dist/tests/driver/toolchain.test.js.map +1 -1
- package/dist/tests/e2e/compile-node.test.js +14 -1
- package/dist/tests/e2e/compile-node.test.js.map +1 -1
- package/dist/tests/e2e/compile.test.js +465 -2
- package/dist/tests/e2e/compile.test.js.map +1 -1
- package/dist/tests/e2e/differential.test.d.ts +7 -0
- package/dist/tests/e2e/differential.test.js +581 -0
- package/dist/tests/e2e/differential.test.js.map +1 -0
- package/dist/tests/e2e/harness.d.ts +21 -0
- package/dist/tests/e2e/harness.js +26 -0
- package/dist/tests/e2e/harness.js.map +1 -1
- package/dist/tests/extensions/node.test.d.ts +1 -0
- package/dist/tests/extensions/node.test.js +32 -0
- package/dist/tests/extensions/node.test.js.map +1 -0
- package/dist/tests/lexer/identifiers.test.d.ts +1 -0
- package/dist/tests/lexer/identifiers.test.js +13 -0
- package/dist/tests/lexer/identifiers.test.js.map +1 -0
- package/dist/tests/lexer/numbers.test.d.ts +1 -0
- package/dist/tests/lexer/numbers.test.js +23 -0
- package/dist/tests/lexer/numbers.test.js.map +1 -0
- package/dist/tests/lexer/strings.test.d.ts +1 -0
- package/dist/tests/lexer/strings.test.js +72 -0
- package/dist/tests/lexer/strings.test.js.map +1 -0
- package/dist/tests/parser/declarations.test.d.ts +1 -0
- package/dist/tests/parser/declarations.test.js +70 -0
- package/dist/tests/parser/declarations.test.js.map +1 -0
- package/dist/tests/parser/expressions.test.d.ts +1 -0
- package/dist/tests/parser/expressions.test.js +47 -0
- package/dist/tests/parser/expressions.test.js.map +1 -0
- package/dist/tests/parser/helpers.test.d.ts +1 -0
- package/dist/tests/parser/helpers.test.js +58 -0
- package/dist/tests/parser/helpers.test.js.map +1 -0
- package/dist/tests/parser/literals.test.d.ts +1 -0
- package/dist/tests/parser/literals.test.js +70 -0
- package/dist/tests/parser/literals.test.js.map +1 -0
- package/dist/tests/parser/module-syntax.test.d.ts +1 -0
- package/dist/tests/parser/module-syntax.test.js +91 -0
- package/dist/tests/parser/module-syntax.test.js.map +1 -0
- package/dist/tests/parser/statements.test.d.ts +1 -0
- package/dist/tests/parser/statements.test.js +85 -0
- package/dist/tests/parser/statements.test.js.map +1 -0
- package/dist/tests/parser/type-members.test.d.ts +1 -0
- package/dist/tests/parser/type-members.test.js +86 -0
- package/dist/tests/parser/type-members.test.js.map +1 -0
- package/dist/tests/parser/types.test.d.ts +1 -0
- package/dist/tests/parser/types.test.js +143 -0
- package/dist/tests/parser/types.test.js.map +1 -0
- package/package.json +6 -1
- package/runtime/ext_node/fs/fs_ops.c +36 -1
- package/runtime/rt.h +17 -0
- package/runtime/rt_internal.h +88 -2
- package/runtime/xt_builtins.c +174 -6
- package/runtime/xt_containers.c +234 -42
- package/runtime/xt_generator.c +304 -0
- package/runtime/xt_io.c +170 -30
- package/runtime/xt_promise.c +6 -1
- package/runtime/xt_regex.h +105 -35
- package/runtime/xt_stdlib/dispatch.inc +255 -4
- package/runtime/xt_stdlib/strings.inc +17 -13
- package/runtime/xt_stdlib2/arrays.inc +126 -19
- package/runtime/xt_stdlib2/date.inc +9 -2
- package/runtime/xt_stdlib2/error.inc +162 -12
- package/runtime/xt_stdlib2/helpers.inc +4 -0
- package/runtime/xt_stdlib2/json.inc +19 -6
- package/runtime/xt_stdlib2/number-string-statics.inc +1 -1
- package/runtime/xt_stdlib2/numbers.inc +4 -5
- package/runtime/xt_stdlib2/objects.inc +29 -0
- package/runtime/xt_stdlib2/regexp-match.inc +293 -51
- package/runtime/xt_stdlib2/set.inc +58 -2
- package/runtime/xt_stdlib2/strings.inc +38 -0
- package/runtime/xt_symbol.c +149 -0
- package/runtime/xt_values.c +221 -15
- package/scripts/build-runtime.ts +1 -1
- package/src/ast/expressions.ts +8 -0
- package/src/binder/binder.ts +1 -1
- package/src/binder/references.ts +47 -4
- package/src/binder/types.ts +4 -0
- package/src/cli/main.ts +1 -2
- package/src/codegen/generator/calls/access.ts +158 -13
- package/src/codegen/generator/calls/closures.ts +24 -0
- package/src/codegen/generator/calls/invocation.ts +11 -1
- package/src/codegen/generator/calls/literals.ts +10 -4
- package/src/codegen/generator/calls/super.ts +6 -9
- package/src/codegen/generator/context.ts +44 -7
- package/src/codegen/generator/expressions/assignment.ts +1 -3
- package/src/codegen/generator/expressions/primary.ts +108 -2
- package/src/codegen/generator/generator.ts +0 -1
- package/src/codegen/generator/module.ts +24 -18
- package/src/codegen/generator/state.ts +44 -1
- package/src/codegen/generator/statements/control-flow.ts +86 -0
- package/src/codegen/generator/statements/dispatch.ts +18 -6
- package/src/codegen/generator/statements/loops.ts +29 -11
- package/src/codegen/generator/tables.ts +44 -1
- package/src/driver/compiler.ts +32 -2
- package/src/driver/modules.ts +64 -4
- package/src/driver/toolchain.ts +1 -1
- package/src/lexer/scanner.ts +0 -1
- package/src/parser/declarations/classes.ts +4 -0
- package/src/parser/declarations/type-members.ts +0 -2
- package/src/parser/expressions.ts +13 -1
- package/src/parser/helpers.ts +2 -2
- package/src/parser/literals.ts +82 -7
- package/src/parser/modules.ts +0 -1
- package/src/parser/parser.ts +0 -1
- package/src/parser/statements.ts +14 -0
- package/src/parser/types.ts +2 -2
package/runtime/xt_builtins.c
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
#include "rt_internal.h"
|
|
9
9
|
|
|
10
10
|
#include <math.h>
|
|
11
|
+
#include <stdio.h>
|
|
11
12
|
#include <stdlib.h>
|
|
12
13
|
#include <string.h>
|
|
13
14
|
|
|
@@ -19,7 +20,9 @@ xt_value xt_object_values(xt_value value) {
|
|
|
19
20
|
xt_value result = xt_array_new(0, NULL);
|
|
20
21
|
if (!XT_IS_OBJECT(value)) return result;
|
|
21
22
|
xt_object *obj = (xt_object *)XT_GET_PTR(value);
|
|
22
|
-
for (uint32_t i = 0; i < obj->count; i++)
|
|
23
|
+
for (uint32_t i = 0; i < obj->count; i++) {
|
|
24
|
+
if (XT_IS_STRING(obj->properties[i].key)) xt_array_push(result, obj->properties[i].value);
|
|
25
|
+
}
|
|
23
26
|
return result;
|
|
24
27
|
}
|
|
25
28
|
|
|
@@ -28,8 +31,9 @@ xt_value xt_object_entries(xt_value value) {
|
|
|
28
31
|
if (!XT_IS_OBJECT(value)) return result;
|
|
29
32
|
xt_object *obj = (xt_object *)XT_GET_PTR(value);
|
|
30
33
|
for (uint32_t i = 0; i < obj->count; i++) {
|
|
34
|
+
if (!XT_IS_STRING(obj->properties[i].key)) continue;
|
|
31
35
|
xt_value pair = xt_array_new(0, NULL);
|
|
32
|
-
xt_array_push(pair,
|
|
36
|
+
xt_array_push(pair, obj->properties[i].key);
|
|
33
37
|
xt_array_push(pair, obj->properties[i].value);
|
|
34
38
|
xt_array_push(result, pair);
|
|
35
39
|
}
|
|
@@ -44,7 +48,7 @@ xt_value xt_object_assign(int32_t argc, xt_value *argv) {
|
|
|
44
48
|
if (!XT_IS_OBJECT(argv[i])) continue;
|
|
45
49
|
xt_object *source = (xt_object *)XT_GET_PTR(argv[i]);
|
|
46
50
|
for (uint32_t j = 0; j < source->count; j++) {
|
|
47
|
-
xt_object_set(target,
|
|
51
|
+
xt_object_set(target, source->properties[j].key, source->properties[j].value);
|
|
48
52
|
}
|
|
49
53
|
}
|
|
50
54
|
return target;
|
|
@@ -119,6 +123,140 @@ xt_value xt_is_finite(int32_t argc, xt_value *argv) {
|
|
|
119
123
|
return xt_bool(!isnan(value) && !isinf(value));
|
|
120
124
|
}
|
|
121
125
|
|
|
126
|
+
/* ------------------------------------------------------------------------- */
|
|
127
|
+
/* URI encoding / decoding (ECMAScript 19.2.6) */
|
|
128
|
+
/* ------------------------------------------------------------------------- */
|
|
129
|
+
|
|
130
|
+
static _Noreturn void xt_throw_uri_error(const char *message) {
|
|
131
|
+
char buffer[96];
|
|
132
|
+
snprintf(buffer, sizeof(buffer), "URIError: %s", message);
|
|
133
|
+
xt_throw(xt_string_from_cstr(buffer));
|
|
134
|
+
abort();
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
static int xt_uri_is_kept(const char *allowed, unsigned char c) {
|
|
138
|
+
return c < 0x80 && c != 0 && strchr(allowed, (int)c) != NULL;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
static xt_value xt_uri_encode(xt_value input, const char *allowed) {
|
|
142
|
+
xt_string *s = xt_as_string(xt_to_string(input));
|
|
143
|
+
static const char hex[] = "0123456789ABCDEF";
|
|
144
|
+
char *out = (char *)malloc((size_t)s->length * 3 + 1);
|
|
145
|
+
if (!out) {
|
|
146
|
+
fprintf(stderr, "xbintsc: out of memory\n");
|
|
147
|
+
abort();
|
|
148
|
+
}
|
|
149
|
+
size_t written = 0;
|
|
150
|
+
for (uint32_t i = 0; i < s->length; i++) {
|
|
151
|
+
unsigned char c = (unsigned char)s->data[i];
|
|
152
|
+
if (xt_uri_is_kept(allowed, c)) {
|
|
153
|
+
out[written++] = (char)c;
|
|
154
|
+
} else {
|
|
155
|
+
out[written++] = '%';
|
|
156
|
+
out[written++] = hex[(c >> 4) & 0xF];
|
|
157
|
+
out[written++] = hex[c & 0xF];
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
xt_value result = xt_string_new(out, written);
|
|
161
|
+
free(out);
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
static int xt_hex_value(int c) {
|
|
166
|
+
if (c >= '0' && c <= '9') return c - '0';
|
|
167
|
+
if (c >= 'A' && c <= 'F') return c - 'A' + 10;
|
|
168
|
+
if (c >= 'a' && c <= 'f') return c - 'a' + 10;
|
|
169
|
+
return -1;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* Decode percent-escapes as UTF-8. When `component` is false (`decodeURI`),
|
|
173
|
+
* escapes for reserved characters are copied through unchanged. */
|
|
174
|
+
static xt_value xt_uri_decode(xt_value input, int component) {
|
|
175
|
+
xt_string *s = xt_as_string(xt_to_string(input));
|
|
176
|
+
char *out = (char *)malloc((size_t)s->length + 1);
|
|
177
|
+
if (!out) {
|
|
178
|
+
fprintf(stderr, "xbintsc: out of memory\n");
|
|
179
|
+
abort();
|
|
180
|
+
}
|
|
181
|
+
size_t written = 0;
|
|
182
|
+
uint32_t i = 0;
|
|
183
|
+
while (i < s->length) {
|
|
184
|
+
unsigned char c = (unsigned char)s->data[i];
|
|
185
|
+
if (c != '%') {
|
|
186
|
+
out[written++] = (char)c;
|
|
187
|
+
i++;
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (i + 2 >= s->length) xt_throw_uri_error("URI malformed");
|
|
191
|
+
int h1 = xt_hex_value((unsigned char)s->data[i + 1]);
|
|
192
|
+
int h2 = xt_hex_value((unsigned char)s->data[i + 2]);
|
|
193
|
+
if (h1 < 0 || h2 < 0) xt_throw_uri_error("URI malformed");
|
|
194
|
+
unsigned char b = (unsigned char)((h1 << 4) | h2);
|
|
195
|
+
if (b < 0x80) {
|
|
196
|
+
if (!component && xt_uri_is_kept(";/?:@&=+$,#", b)) {
|
|
197
|
+
out[written++] = s->data[i];
|
|
198
|
+
out[written++] = s->data[i + 1];
|
|
199
|
+
out[written++] = s->data[i + 2];
|
|
200
|
+
} else {
|
|
201
|
+
out[written++] = (char)b;
|
|
202
|
+
}
|
|
203
|
+
i += 3;
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
int extra;
|
|
207
|
+
if (b >= 0xC2 && b <= 0xDF) extra = 1;
|
|
208
|
+
else if (b >= 0xE0 && b <= 0xEF) extra = 2;
|
|
209
|
+
else if (b >= 0xF0 && b <= 0xF4) extra = 3;
|
|
210
|
+
else xt_throw_uri_error("URI malformed");
|
|
211
|
+
char seq[4];
|
|
212
|
+
seq[0] = (char)b;
|
|
213
|
+
for (int k = 1; k <= extra; k++) {
|
|
214
|
+
uint32_t pos = i + (uint32_t)k * 3;
|
|
215
|
+
if (pos + 2 >= s->length) xt_throw_uri_error("URI malformed");
|
|
216
|
+
if (s->data[pos] != '%') xt_throw_uri_error("URI malformed");
|
|
217
|
+
int c1 = xt_hex_value((unsigned char)s->data[pos + 1]);
|
|
218
|
+
int c2 = xt_hex_value((unsigned char)s->data[pos + 2]);
|
|
219
|
+
if (c1 < 0 || c2 < 0) xt_throw_uri_error("URI malformed");
|
|
220
|
+
unsigned char cb = (unsigned char)((c1 << 4) | c2);
|
|
221
|
+
if ((cb & 0xC0) != 0x80) xt_throw_uri_error("URI malformed");
|
|
222
|
+
seq[k] = (char)cb;
|
|
223
|
+
}
|
|
224
|
+
uint32_t codePoint;
|
|
225
|
+
if (extra == 1) codePoint = ((uint32_t)(b & 0x1F) << 6) | ((uint32_t)seq[1] & 0x3F);
|
|
226
|
+
else if (extra == 2)
|
|
227
|
+
codePoint = ((uint32_t)(b & 0x0F) << 12) | (((uint32_t)seq[1] & 0x3F) << 6) | ((uint32_t)seq[2] & 0x3F);
|
|
228
|
+
else
|
|
229
|
+
codePoint = ((uint32_t)(b & 0x07) << 18) | (((uint32_t)seq[1] & 0x3F) << 12) |
|
|
230
|
+
(((uint32_t)seq[2] & 0x3F) << 6) | ((uint32_t)seq[3] & 0x3F);
|
|
231
|
+
uint32_t minimum = extra == 1 ? 0x80u : (extra == 2 ? 0x800u : 0x10000u);
|
|
232
|
+
if (codePoint < minimum || codePoint > 0x10FFFF || (codePoint >= 0xD800 && codePoint <= 0xDFFF))
|
|
233
|
+
xt_throw_uri_error("URI malformed");
|
|
234
|
+
for (int k = 0; k <= extra; k++) out[written++] = seq[k];
|
|
235
|
+
i += (uint32_t)(extra + 1) * 3;
|
|
236
|
+
}
|
|
237
|
+
xt_value result = xt_string_new(out, written);
|
|
238
|
+
free(out);
|
|
239
|
+
return result;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
xt_value xt_encode_uri_component(int32_t argc, xt_value *argv) {
|
|
243
|
+
return xt_uri_encode(xt_arg_at(argc, argv, 0),
|
|
244
|
+
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.!~*'()");
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
xt_value xt_encode_uri(int32_t argc, xt_value *argv) {
|
|
248
|
+
return xt_uri_encode(xt_arg_at(argc, argv, 0),
|
|
249
|
+
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.!~*'();,/?:@&=+$#");
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
xt_value xt_decode_uri_component(int32_t argc, xt_value *argv) {
|
|
253
|
+
return xt_uri_decode(xt_arg_at(argc, argv, 0), /* component */ 1);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
xt_value xt_decode_uri(int32_t argc, xt_value *argv) {
|
|
257
|
+
return xt_uri_decode(xt_arg_at(argc, argv, 0), /* component */ 0);
|
|
258
|
+
}
|
|
259
|
+
|
|
122
260
|
xt_value xt_number_ctor(int32_t argc, xt_value *argv) {
|
|
123
261
|
if (argc == 0) return xt_number(0);
|
|
124
262
|
return xt_number(xt_to_number(argv[0]));
|
|
@@ -126,6 +264,7 @@ xt_value xt_number_ctor(int32_t argc, xt_value *argv) {
|
|
|
126
264
|
|
|
127
265
|
xt_value xt_string_ctor(int32_t argc, xt_value *argv) {
|
|
128
266
|
if (argc == 0) return xt_string_from_cstr("");
|
|
267
|
+
if (xt_is_symbol(argv[0])) return xt_symbol_to_string(argv[0]);
|
|
129
268
|
return xt_to_string(argv[0]);
|
|
130
269
|
}
|
|
131
270
|
|
|
@@ -153,18 +292,29 @@ XT_BUILTIN_TRAMPOLINE(xt_builtin_value_boolean, xt_boolean_ctor)
|
|
|
153
292
|
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_number, xt_number_ctor)
|
|
154
293
|
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_bigint, xt_bigint_ctor)
|
|
155
294
|
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_string, xt_string_ctor)
|
|
295
|
+
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_symbol, xt_symbol)
|
|
156
296
|
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_parseInt, xt_parse_int)
|
|
157
297
|
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_parseFloat, xt_parse_float)
|
|
158
298
|
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_isNaN, xt_is_nan)
|
|
159
299
|
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_isFinite, xt_is_finite)
|
|
300
|
+
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_encodeURIComponent, xt_encode_uri_component)
|
|
301
|
+
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_encodeURI, xt_encode_uri)
|
|
302
|
+
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_decodeURIComponent, xt_decode_uri_component)
|
|
303
|
+
XT_BUILTIN_TRAMPOLINE(xt_builtin_value_decodeURI, xt_decode_uri)
|
|
160
304
|
|
|
161
305
|
xt_value xt_in(xt_value key, xt_value value) {
|
|
162
306
|
if (XT_IS_OBJECT(value)) return xt_object_has(value, key);
|
|
163
307
|
if (XT_IS_ARRAY(value)) {
|
|
308
|
+
if (xt_is_symbol(key)) {
|
|
309
|
+
xt_array *array = (xt_array *)XT_GET_PTR(value);
|
|
310
|
+
if (!XT_IS_OBJECT(array->extra)) return XT_FALSE;
|
|
311
|
+
return xt_object_has_own(array->extra, key);
|
|
312
|
+
}
|
|
164
313
|
int32_t index = xt_to_int32(key);
|
|
165
314
|
return xt_bool(index >= 0 && (uint32_t)index < xt_as_array(value)->length);
|
|
166
315
|
}
|
|
167
316
|
if (XT_IS_STRING(value)) {
|
|
317
|
+
if (xt_is_symbol(key)) return XT_FALSE;
|
|
168
318
|
xt_string *s = xt_as_string(value);
|
|
169
319
|
xt_string *k = xt_as_string(xt_to_string(key));
|
|
170
320
|
if (k->length == 6 && memcmp(k->data, "length", 6) == 0) return XT_TRUE;
|
|
@@ -177,9 +327,9 @@ xt_value xt_in(xt_value key, xt_value value) {
|
|
|
177
327
|
xt_value xt_delete(xt_value value, xt_value key) {
|
|
178
328
|
if (XT_IS_OBJECT(value)) {
|
|
179
329
|
xt_object *obj = (xt_object *)XT_GET_PTR(value);
|
|
180
|
-
|
|
330
|
+
xt_value k = xt_to_property_key(key);
|
|
181
331
|
for (uint32_t i = 0; i < obj->count; i++) {
|
|
182
|
-
if (
|
|
332
|
+
if (xt_property_key_equals(obj->properties[i].key, k)) {
|
|
183
333
|
for (uint32_t j = i + 1; j < obj->count; j++) obj->properties[j - 1] = obj->properties[j];
|
|
184
334
|
obj->count--;
|
|
185
335
|
break;
|
|
@@ -188,7 +338,7 @@ xt_value xt_delete(xt_value value, xt_value key) {
|
|
|
188
338
|
return XT_TRUE;
|
|
189
339
|
}
|
|
190
340
|
if (XT_IS_ARRAY(value)) {
|
|
191
|
-
xt_array_set(value, key, XT_UNDEFINED);
|
|
341
|
+
if (!xt_is_symbol(key)) xt_array_set(value, key, XT_UNDEFINED);
|
|
192
342
|
return XT_TRUE;
|
|
193
343
|
}
|
|
194
344
|
return XT_TRUE;
|
|
@@ -216,6 +366,7 @@ xt_value xt_closure_new(void *fn, int32_t env_count, xt_value *env) {
|
|
|
216
366
|
function->code = (xt_code_fn)fn;
|
|
217
367
|
function->environment_count = env_count;
|
|
218
368
|
function->arity = -1;
|
|
369
|
+
function->name = NULL;
|
|
219
370
|
function->properties = NULL;
|
|
220
371
|
function->environment = NULL;
|
|
221
372
|
function->prototype = XT_UNDEFINED;
|
|
@@ -236,6 +387,9 @@ xt_value xt_call_with_this(xt_value value, xt_value thisValue, int32_t argc, xt_
|
|
|
236
387
|
return XT_UNDEFINED;
|
|
237
388
|
}
|
|
238
389
|
xt_function *function = (xt_function *)XT_GET_PTR(value);
|
|
390
|
+
/* Calling a generator function returns a suspended generator instead of
|
|
391
|
+
* running the body. */
|
|
392
|
+
if (function->is_generator) return xt_generator_new(value, thisValue, argc, argv);
|
|
239
393
|
/* The closure value itself is threaded through as `env` so the callee can
|
|
240
394
|
* read its captures with xt_closure_env(env, i). */
|
|
241
395
|
return function->code(thisValue, value, argc, argv);
|
|
@@ -248,6 +402,11 @@ xt_value xt_function_set_prototype(xt_value value, xt_value proto) {
|
|
|
248
402
|
return value;
|
|
249
403
|
}
|
|
250
404
|
|
|
405
|
+
xt_value xt_function_set_generator(xt_value value) {
|
|
406
|
+
if (XT_IS_FUNCTION(value)) ((xt_function *)XT_GET_PTR(value))->is_generator = 1;
|
|
407
|
+
return value;
|
|
408
|
+
}
|
|
409
|
+
|
|
251
410
|
xt_value xt_function_get_prototype(xt_value value) {
|
|
252
411
|
if (XT_IS_FUNCTION(value)) return ((xt_function *)XT_GET_PTR(value))->prototype;
|
|
253
412
|
return XT_UNDEFINED;
|
|
@@ -294,3 +453,12 @@ int32_t xt_closure_arity(xt_value value) {
|
|
|
294
453
|
return ((xt_function *)XT_GET_PTR(value))->arity;
|
|
295
454
|
}
|
|
296
455
|
|
|
456
|
+
xt_value xt_function_set_metadata(xt_value value, xt_value name, int32_t arity) {
|
|
457
|
+
if (XT_IS_FUNCTION(value)) {
|
|
458
|
+
xt_function *function = (xt_function *)XT_GET_PTR(value);
|
|
459
|
+
function->arity = arity;
|
|
460
|
+
function->name = XT_IS_STRING(name) ? xt_as_string(name) : NULL;
|
|
461
|
+
}
|
|
462
|
+
return value;
|
|
463
|
+
}
|
|
464
|
+
|