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.
Files changed (215) hide show
  1. package/dist/src/ast/expressions.d.ts +8 -0
  2. package/dist/src/binder/binder.js +1 -0
  3. package/dist/src/binder/binder.js.map +1 -1
  4. package/dist/src/binder/references.d.ts +1 -1
  5. package/dist/src/binder/references.js +34 -5
  6. package/dist/src/binder/references.js.map +1 -1
  7. package/dist/src/binder/types.d.ts +4 -0
  8. package/dist/src/binder/types.js.map +1 -1
  9. package/dist/src/cli/main.js.map +1 -1
  10. package/dist/src/codegen/generator/calls/access.d.ts +9 -1
  11. package/dist/src/codegen/generator/calls/access.js +146 -13
  12. package/dist/src/codegen/generator/calls/access.js.map +1 -1
  13. package/dist/src/codegen/generator/calls/closures.d.ts +1 -0
  14. package/dist/src/codegen/generator/calls/closures.js +25 -0
  15. package/dist/src/codegen/generator/calls/closures.js.map +1 -1
  16. package/dist/src/codegen/generator/calls/invocation.js +12 -1
  17. package/dist/src/codegen/generator/calls/invocation.js.map +1 -1
  18. package/dist/src/codegen/generator/calls/literals.js +12 -4
  19. package/dist/src/codegen/generator/calls/literals.js.map +1 -1
  20. package/dist/src/codegen/generator/calls/super.js +4 -7
  21. package/dist/src/codegen/generator/calls/super.js.map +1 -1
  22. package/dist/src/codegen/generator/context.d.ts +21 -2
  23. package/dist/src/codegen/generator/context.js +42 -5
  24. package/dist/src/codegen/generator/context.js.map +1 -1
  25. package/dist/src/codegen/generator/expressions/assignment.js +1 -3
  26. package/dist/src/codegen/generator/expressions/assignment.js.map +1 -1
  27. package/dist/src/codegen/generator/expressions/primary.d.ts +3 -1
  28. package/dist/src/codegen/generator/expressions/primary.js +99 -1
  29. package/dist/src/codegen/generator/expressions/primary.js.map +1 -1
  30. package/dist/src/codegen/generator/generator.js.map +1 -1
  31. package/dist/src/codegen/generator/module.js +25 -15
  32. package/dist/src/codegen/generator/module.js.map +1 -1
  33. package/dist/src/codegen/generator/state.d.ts +15 -0
  34. package/dist/src/codegen/generator/state.js +28 -1
  35. package/dist/src/codegen/generator/state.js.map +1 -1
  36. package/dist/src/codegen/generator/statements/control-flow.d.ts +3 -1
  37. package/dist/src/codegen/generator/statements/control-flow.js +85 -0
  38. package/dist/src/codegen/generator/statements/control-flow.js.map +1 -1
  39. package/dist/src/codegen/generator/statements/dispatch.js +15 -6
  40. package/dist/src/codegen/generator/statements/dispatch.js.map +1 -1
  41. package/dist/src/codegen/generator/statements/loops.d.ts +3 -0
  42. package/dist/src/codegen/generator/statements/loops.js +25 -11
  43. package/dist/src/codegen/generator/statements/loops.js.map +1 -1
  44. package/dist/src/codegen/generator/tables.d.ts +7 -0
  45. package/dist/src/codegen/generator/tables.js +41 -1
  46. package/dist/src/codegen/generator/tables.js.map +1 -1
  47. package/dist/src/driver/compiler.d.ts +1 -1
  48. package/dist/src/driver/compiler.js +33 -1
  49. package/dist/src/driver/compiler.js.map +1 -1
  50. package/dist/src/driver/modules.d.ts +4 -3
  51. package/dist/src/driver/modules.js +61 -4
  52. package/dist/src/driver/modules.js.map +1 -1
  53. package/dist/src/driver/toolchain.js +1 -1
  54. package/dist/src/driver/toolchain.js.map +1 -1
  55. package/dist/src/lexer/scanner.js.map +1 -1
  56. package/dist/src/parser/declarations/classes.js +4 -0
  57. package/dist/src/parser/declarations/classes.js.map +1 -1
  58. package/dist/src/parser/declarations/type-members.js.map +1 -1
  59. package/dist/src/parser/expressions.d.ts +2 -1
  60. package/dist/src/parser/expressions.js +10 -1
  61. package/dist/src/parser/expressions.js.map +1 -1
  62. package/dist/src/parser/helpers.js +2 -2
  63. package/dist/src/parser/helpers.js.map +1 -1
  64. package/dist/src/parser/literals.js +79 -6
  65. package/dist/src/parser/literals.js.map +1 -1
  66. package/dist/src/parser/modules.js.map +1 -1
  67. package/dist/src/parser/parser.js +0 -1
  68. package/dist/src/parser/parser.js.map +1 -1
  69. package/dist/src/parser/statements.d.ts +1 -0
  70. package/dist/src/parser/statements.js +13 -1
  71. package/dist/src/parser/statements.js.map +1 -1
  72. package/dist/src/parser/types.js +2 -2
  73. package/dist/src/parser/types.js.map +1 -1
  74. package/dist/tests/ast/factory.test.d.ts +1 -0
  75. package/dist/tests/ast/factory.test.js +35 -0
  76. package/dist/tests/ast/factory.test.js.map +1 -0
  77. package/dist/tests/ast/visitor.test.d.ts +1 -0
  78. package/dist/tests/ast/visitor.test.js +53 -0
  79. package/dist/tests/ast/visitor.test.js.map +1 -0
  80. package/dist/tests/cli/main.test.js +109 -9
  81. package/dist/tests/cli/main.test.js.map +1 -1
  82. package/dist/tests/codegen/closures.test.d.ts +1 -0
  83. package/dist/tests/codegen/closures.test.js +32 -0
  84. package/dist/tests/codegen/closures.test.js.map +1 -0
  85. package/dist/tests/codegen/expressions.test.d.ts +1 -0
  86. package/dist/tests/codegen/expressions.test.js +149 -0
  87. package/dist/tests/codegen/expressions.test.js.map +1 -0
  88. package/dist/tests/codegen/llvm.test.js +14 -0
  89. package/dist/tests/codegen/llvm.test.js.map +1 -1
  90. package/dist/tests/codegen/values.test.d.ts +1 -0
  91. package/dist/tests/codegen/values.test.js +48 -0
  92. package/dist/tests/codegen/values.test.js.map +1 -0
  93. package/dist/tests/diagnostics/diagnostic.test.d.ts +1 -0
  94. package/dist/tests/diagnostics/diagnostic.test.js +117 -0
  95. package/dist/tests/diagnostics/diagnostic.test.js.map +1 -0
  96. package/dist/tests/diagnostics/source.test.d.ts +1 -0
  97. package/dist/tests/diagnostics/source.test.js +58 -0
  98. package/dist/tests/diagnostics/source.test.js.map +1 -0
  99. package/dist/tests/driver/modules.test.d.ts +1 -0
  100. package/dist/tests/driver/modules.test.js +140 -0
  101. package/dist/tests/driver/modules.test.js.map +1 -0
  102. package/dist/tests/driver/paths.test.js +17 -1
  103. package/dist/tests/driver/paths.test.js.map +1 -1
  104. package/dist/tests/driver/runtime-lib.test.d.ts +1 -0
  105. package/dist/tests/driver/runtime-lib.test.js +19 -0
  106. package/dist/tests/driver/runtime-lib.test.js.map +1 -0
  107. package/dist/tests/driver/toolchain-provider.test.js +91 -0
  108. package/dist/tests/driver/toolchain-provider.test.js.map +1 -1
  109. package/dist/tests/driver/toolchain.test.js +11 -1
  110. package/dist/tests/driver/toolchain.test.js.map +1 -1
  111. package/dist/tests/e2e/compile-node.test.js +14 -1
  112. package/dist/tests/e2e/compile-node.test.js.map +1 -1
  113. package/dist/tests/e2e/compile.test.js +465 -2
  114. package/dist/tests/e2e/compile.test.js.map +1 -1
  115. package/dist/tests/e2e/differential.test.d.ts +7 -0
  116. package/dist/tests/e2e/differential.test.js +581 -0
  117. package/dist/tests/e2e/differential.test.js.map +1 -0
  118. package/dist/tests/e2e/harness.d.ts +21 -0
  119. package/dist/tests/e2e/harness.js +26 -0
  120. package/dist/tests/e2e/harness.js.map +1 -1
  121. package/dist/tests/extensions/node.test.d.ts +1 -0
  122. package/dist/tests/extensions/node.test.js +32 -0
  123. package/dist/tests/extensions/node.test.js.map +1 -0
  124. package/dist/tests/lexer/identifiers.test.d.ts +1 -0
  125. package/dist/tests/lexer/identifiers.test.js +13 -0
  126. package/dist/tests/lexer/identifiers.test.js.map +1 -0
  127. package/dist/tests/lexer/numbers.test.d.ts +1 -0
  128. package/dist/tests/lexer/numbers.test.js +23 -0
  129. package/dist/tests/lexer/numbers.test.js.map +1 -0
  130. package/dist/tests/lexer/strings.test.d.ts +1 -0
  131. package/dist/tests/lexer/strings.test.js +72 -0
  132. package/dist/tests/lexer/strings.test.js.map +1 -0
  133. package/dist/tests/parser/declarations.test.d.ts +1 -0
  134. package/dist/tests/parser/declarations.test.js +70 -0
  135. package/dist/tests/parser/declarations.test.js.map +1 -0
  136. package/dist/tests/parser/expressions.test.d.ts +1 -0
  137. package/dist/tests/parser/expressions.test.js +47 -0
  138. package/dist/tests/parser/expressions.test.js.map +1 -0
  139. package/dist/tests/parser/helpers.test.d.ts +1 -0
  140. package/dist/tests/parser/helpers.test.js +58 -0
  141. package/dist/tests/parser/helpers.test.js.map +1 -0
  142. package/dist/tests/parser/literals.test.d.ts +1 -0
  143. package/dist/tests/parser/literals.test.js +70 -0
  144. package/dist/tests/parser/literals.test.js.map +1 -0
  145. package/dist/tests/parser/module-syntax.test.d.ts +1 -0
  146. package/dist/tests/parser/module-syntax.test.js +91 -0
  147. package/dist/tests/parser/module-syntax.test.js.map +1 -0
  148. package/dist/tests/parser/statements.test.d.ts +1 -0
  149. package/dist/tests/parser/statements.test.js +85 -0
  150. package/dist/tests/parser/statements.test.js.map +1 -0
  151. package/dist/tests/parser/type-members.test.d.ts +1 -0
  152. package/dist/tests/parser/type-members.test.js +86 -0
  153. package/dist/tests/parser/type-members.test.js.map +1 -0
  154. package/dist/tests/parser/types.test.d.ts +1 -0
  155. package/dist/tests/parser/types.test.js +143 -0
  156. package/dist/tests/parser/types.test.js.map +1 -0
  157. package/package.json +6 -1
  158. package/runtime/ext_node/fs/fs_ops.c +36 -1
  159. package/runtime/rt.h +17 -0
  160. package/runtime/rt_internal.h +88 -2
  161. package/runtime/xt_builtins.c +174 -6
  162. package/runtime/xt_containers.c +234 -42
  163. package/runtime/xt_generator.c +304 -0
  164. package/runtime/xt_io.c +170 -30
  165. package/runtime/xt_promise.c +6 -1
  166. package/runtime/xt_regex.h +105 -35
  167. package/runtime/xt_stdlib/dispatch.inc +255 -4
  168. package/runtime/xt_stdlib/strings.inc +17 -13
  169. package/runtime/xt_stdlib2/arrays.inc +126 -19
  170. package/runtime/xt_stdlib2/date.inc +9 -2
  171. package/runtime/xt_stdlib2/error.inc +162 -12
  172. package/runtime/xt_stdlib2/helpers.inc +4 -0
  173. package/runtime/xt_stdlib2/json.inc +19 -6
  174. package/runtime/xt_stdlib2/number-string-statics.inc +1 -1
  175. package/runtime/xt_stdlib2/numbers.inc +4 -5
  176. package/runtime/xt_stdlib2/objects.inc +29 -0
  177. package/runtime/xt_stdlib2/regexp-match.inc +293 -51
  178. package/runtime/xt_stdlib2/set.inc +58 -2
  179. package/runtime/xt_stdlib2/strings.inc +38 -0
  180. package/runtime/xt_symbol.c +149 -0
  181. package/runtime/xt_values.c +221 -15
  182. package/scripts/build-runtime.ts +1 -1
  183. package/src/ast/expressions.ts +8 -0
  184. package/src/binder/binder.ts +1 -1
  185. package/src/binder/references.ts +47 -4
  186. package/src/binder/types.ts +4 -0
  187. package/src/cli/main.ts +1 -2
  188. package/src/codegen/generator/calls/access.ts +158 -13
  189. package/src/codegen/generator/calls/closures.ts +24 -0
  190. package/src/codegen/generator/calls/invocation.ts +11 -1
  191. package/src/codegen/generator/calls/literals.ts +10 -4
  192. package/src/codegen/generator/calls/super.ts +6 -9
  193. package/src/codegen/generator/context.ts +44 -7
  194. package/src/codegen/generator/expressions/assignment.ts +1 -3
  195. package/src/codegen/generator/expressions/primary.ts +108 -2
  196. package/src/codegen/generator/generator.ts +0 -1
  197. package/src/codegen/generator/module.ts +24 -18
  198. package/src/codegen/generator/state.ts +44 -1
  199. package/src/codegen/generator/statements/control-flow.ts +86 -0
  200. package/src/codegen/generator/statements/dispatch.ts +18 -6
  201. package/src/codegen/generator/statements/loops.ts +29 -11
  202. package/src/codegen/generator/tables.ts +44 -1
  203. package/src/driver/compiler.ts +32 -2
  204. package/src/driver/modules.ts +64 -4
  205. package/src/driver/toolchain.ts +1 -1
  206. package/src/lexer/scanner.ts +0 -1
  207. package/src/parser/declarations/classes.ts +4 -0
  208. package/src/parser/declarations/type-members.ts +0 -2
  209. package/src/parser/expressions.ts +13 -1
  210. package/src/parser/helpers.ts +2 -2
  211. package/src/parser/literals.ts +82 -7
  212. package/src/parser/modules.ts +0 -1
  213. package/src/parser/parser.ts +0 -1
  214. package/src/parser/statements.ts +14 -0
  215. package/src/parser/types.ts +2 -2
@@ -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++) xt_array_push(result, obj->properties[i].value);
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, XT_FROM_PTR(XT_TAG_STRING, obj->properties[i].key));
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, XT_FROM_PTR(XT_TAG_STRING, source->properties[j].key), source->properties[j].value);
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
- xt_string *k = xt_as_string(xt_to_string(key));
330
+ xt_value k = xt_to_property_key(key);
181
331
  for (uint32_t i = 0; i < obj->count; i++) {
182
- if (xt_string_equals(obj->properties[i].key, k)) {
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
+