jseption 0.0.0-stage → 0.0.2

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 (114) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +191 -2
  3. package/dist/atoms.d.ts +255 -0
  4. package/dist/atoms.js +445 -0
  5. package/dist/atoms.js.map +1 -0
  6. package/dist/builtins/array.d.ts +3 -0
  7. package/dist/builtins/array.js +116 -0
  8. package/dist/builtins/array.js.map +1 -0
  9. package/dist/builtins/bigint.d.ts +3 -0
  10. package/dist/builtins/bigint.js +122 -0
  11. package/dist/builtins/bigint.js.map +1 -0
  12. package/dist/builtins/boolean.d.ts +2 -0
  13. package/dist/builtins/boolean.js +26 -0
  14. package/dist/builtins/boolean.js.map +1 -0
  15. package/dist/builtins/date.d.ts +3 -0
  16. package/dist/builtins/date.js +1046 -0
  17. package/dist/builtins/date.js.map +1 -0
  18. package/dist/builtins/error.d.ts +2 -0
  19. package/dist/builtins/error.js +154 -0
  20. package/dist/builtins/error.js.map +1 -0
  21. package/dist/builtins/function.d.ts +5 -0
  22. package/dist/builtins/function.js +164 -0
  23. package/dist/builtins/function.js.map +1 -0
  24. package/dist/builtins/global.d.ts +2 -0
  25. package/dist/builtins/global.js +29 -0
  26. package/dist/builtins/global.js.map +1 -0
  27. package/dist/builtins/index.d.ts +3 -0
  28. package/dist/builtins/index.js +139 -0
  29. package/dist/builtins/index.js.map +1 -0
  30. package/dist/builtins/json.d.ts +6 -0
  31. package/dist/builtins/json.js +984 -0
  32. package/dist/builtins/json.js.map +1 -0
  33. package/dist/builtins/mapset.d.ts +4 -0
  34. package/dist/builtins/mapset.js +234 -0
  35. package/dist/builtins/mapset.js.map +1 -0
  36. package/dist/builtins/math.d.ts +2 -0
  37. package/dist/builtins/math.js +62 -0
  38. package/dist/builtins/math.js.map +1 -0
  39. package/dist/builtins/native.d.ts +22 -0
  40. package/dist/builtins/native.js +250 -0
  41. package/dist/builtins/native.js.map +1 -0
  42. package/dist/builtins/number.d.ts +4 -0
  43. package/dist/builtins/number.js +76 -0
  44. package/dist/builtins/number.js.map +1 -0
  45. package/dist/builtins/object.d.ts +12 -0
  46. package/dist/builtins/object.js +575 -0
  47. package/dist/builtins/object.js.map +1 -0
  48. package/dist/builtins/promise.d.ts +13 -0
  49. package/dist/builtins/promise.js +582 -0
  50. package/dist/builtins/promise.js.map +1 -0
  51. package/dist/builtins/proxy.d.ts +3 -0
  52. package/dist/builtins/proxy.js +226 -0
  53. package/dist/builtins/proxy.js.map +1 -0
  54. package/dist/builtins/reflect.d.ts +2 -0
  55. package/dist/builtins/reflect.js +109 -0
  56. package/dist/builtins/reflect.js.map +1 -0
  57. package/dist/builtins/regexp.d.ts +2 -0
  58. package/dist/builtins/regexp.js +203 -0
  59. package/dist/builtins/regexp.js.map +1 -0
  60. package/dist/builtins/string.d.ts +4 -0
  61. package/dist/builtins/string.js +135 -0
  62. package/dist/builtins/string.js.map +1 -0
  63. package/dist/builtins/symbol.d.ts +3 -0
  64. package/dist/builtins/symbol.js +98 -0
  65. package/dist/builtins/symbol.js.map +1 -0
  66. package/dist/builtins/typedarray.d.ts +15 -0
  67. package/dist/builtins/typedarray.js +1838 -0
  68. package/dist/builtins/typedarray.js.map +1 -0
  69. package/dist/builtins/weakref.d.ts +18 -0
  70. package/dist/builtins/weakref.js +130 -0
  71. package/dist/builtins/weakref.js.map +1 -0
  72. package/dist/dump.d.ts +2 -0
  73. package/dist/dump.js +124 -0
  74. package/dist/dump.js.map +1 -0
  75. package/dist/embed.d.ts +18 -0
  76. package/dist/embed.js +286 -0
  77. package/dist/embed.js.map +1 -0
  78. package/dist/interpreter.d.ts +81 -0
  79. package/dist/interpreter.js +3768 -0
  80. package/dist/interpreter.js.map +1 -0
  81. package/dist/jit.d.ts +59 -0
  82. package/dist/jit.js +3440 -0
  83. package/dist/jit.js.map +1 -0
  84. package/dist/jit_hook.d.ts +21 -0
  85. package/dist/jit_hook.js +4 -0
  86. package/dist/jit_hook.js.map +1 -0
  87. package/dist/jit_runtime.d.ts +104 -0
  88. package/dist/jit_runtime.js +721 -0
  89. package/dist/jit_runtime.js.map +1 -0
  90. package/dist/jit_stack.d.ts +24 -0
  91. package/dist/jit_stack.js +227 -0
  92. package/dist/jit_stack.js.map +1 -0
  93. package/dist/jseption.d.ts +15 -0
  94. package/dist/jseption.js +61 -0
  95. package/dist/jseption.js.map +1 -0
  96. package/dist/opcodes.d.ts +347 -0
  97. package/dist/opcodes.js +322 -0
  98. package/dist/opcodes.js.map +1 -0
  99. package/dist/parser.d.ts +283 -0
  100. package/dist/parser.js +9752 -0
  101. package/dist/parser.js.map +1 -0
  102. package/dist/qjs.d.ts +2 -0
  103. package/dist/qjs.js +122 -0
  104. package/dist/qjs.js.map +1 -0
  105. package/dist/quickjs.d.ts +460 -0
  106. package/dist/quickjs.js +3408 -0
  107. package/dist/quickjs.js.map +1 -0
  108. package/dist/std.d.ts +4 -0
  109. package/dist/std.js +273 -0
  110. package/dist/std.js.map +1 -0
  111. package/dist/values.d.ts +447 -0
  112. package/dist/values.js +461 -0
  113. package/dist/values.js.map +1 -0
  114. package/package.json +59 -4
@@ -0,0 +1,203 @@
1
+ /*
2
+ * RegExp objects (port of the RegExp part of quickjs.c)
3
+ *
4
+ * libregexp is not ported: a guest RegExp object IS a host RegExp with the
5
+ * guest prototype (builtins/native.ts), so matching, lastIndex handling and
6
+ * the Symbol.* protocol methods are the borrowed host natives. The results
7
+ * they create (match arrays, split arrays, string iterators) are
8
+ * re-prototyped by the fixers. The constructor keeps the quickjs.c logic
9
+ * for IsRegExp, pattern/flags extraction and flag validation.
10
+ */
11
+ import * as Q from "../quickjs.js";
12
+ import { JS_EXCEPTION, JS_IsException, JS_IsUndefined, JS_IsObject, JS_NewObject, JS_NewObjectProto, JS_GetProperty, JS_ToString, JS_ToBoolFree, JS_ThrowTypeError, JS_ThrowSyntaxError, js_proto_from_ctor, js_same_value, hooks, JS_SetPropertyFunctionList, JS_NewGlobalCConstructor, JS_CGETSET_DEF, JS_NATIVE_DEF, JS_NATIVE_GETSET_DEF, JS_PROP_STRING_DEF, JS_PROP_CONFIGURABLE, JS_ATOM_constructor, JS_ATOM_source, JS_ATOM_flags, JS_ATOM_Symbol_match, JS_ATOM_Symbol_matchAll, JS_ATOM_Symbol_replace, JS_ATOM_Symbol_search, JS_ATOM_Symbol_split, JS_ATOM_Symbol_species, JS_ATOM_Symbol_toStringTag, } from "../quickjs.js";
13
+ import { js_adopt_host_object, fix_match, fix_array, fix_regexp_string_iterator, fix_iter_result_match, HOST_REGEXP_STRING_ITERATOR_PROTO, } from "./native.js";
14
+ const RP = RegExp.prototype;
15
+ const host_getter = (name) => Object.getOwnPropertyDescriptor(RP, name).get;
16
+ const SOURCE_GETTER = host_getter('source');
17
+ const FLAGS_GETTER = host_getter('flags');
18
+ /* validate the flags (quickjs.c messages) and compile with the host */
19
+ function js_compile_regexp(ctx, pattern, flags) {
20
+ let flags_str = '';
21
+ if (!JS_IsUndefined(flags)) {
22
+ const str = JS_ToString(ctx, flags);
23
+ if (JS_IsException(str))
24
+ return null;
25
+ flags_str = str;
26
+ let seen = '';
27
+ for (const c of flags_str) {
28
+ if (!'dgimsuvy'.includes(c) || seen.includes(c)) {
29
+ JS_ThrowSyntaxError(ctx, 'invalid regular expression flags');
30
+ return null;
31
+ }
32
+ seen += c;
33
+ }
34
+ if (seen.includes('u') && seen.includes('v')) {
35
+ JS_ThrowSyntaxError(ctx, 'invalid regular expression flags');
36
+ return null;
37
+ }
38
+ }
39
+ try {
40
+ return new RegExp(pattern, flags_str);
41
+ }
42
+ catch (e) {
43
+ let msg = (e instanceof Error) ? e.message : String(e);
44
+ /* strip the host prefix "Invalid regular expression: /.../flags: " if present */
45
+ msg = msg.replace(/^Invalid regular expression: (\/.*\/[a-z]*: )?/s, '');
46
+ JS_ThrowSyntaxError(ctx, msg);
47
+ return null;
48
+ }
49
+ }
50
+ /* create the guest RegExp object from a freshly compiled host regexp */
51
+ function js_regexp_create(ctx, ctor, re) {
52
+ const proto = js_proto_from_ctor(ctx, ctor, 18 /* JSClassID.REGEXP */);
53
+ if (JS_IsException(proto))
54
+ return proto;
55
+ return js_adopt_host_object(ctx, re, proto, 18 /* JSClassID.REGEXP */);
56
+ }
57
+ /* hook used by the interpreter for regexp literals */
58
+ function js_regexp_constructor_internal_hook(ctx, ctor, pattern, flags) {
59
+ if (typeof pattern !== 'string' || typeof flags !== 'string')
60
+ return JS_ThrowTypeError(ctx, 'string expected');
61
+ const re = js_compile_regexp(ctx, pattern, flags);
62
+ if (!re)
63
+ return JS_EXCEPTION;
64
+ return js_regexp_create(ctx, ctor, re);
65
+ }
66
+ /* the host regexp behind a guest RegExp object, or null */
67
+ function js_get_regexp(ctx, obj, throw_error) {
68
+ if (Q.JS_IsObject(obj) && Q.JS_GetClassID(obj) === 18 /* JSClassID.REGEXP */ && obj instanceof RegExp)
69
+ return obj;
70
+ if (throw_error)
71
+ Q.JS_ThrowTypeErrorInvalidClass(ctx, 18 /* JSClassID.REGEXP */);
72
+ return null;
73
+ }
74
+ /* return < 0 if exception or TRUE/FALSE */
75
+ function js_is_regexp(ctx, obj) {
76
+ if (!JS_IsObject(obj))
77
+ return 0;
78
+ const m = JS_GetProperty(ctx, obj, JS_ATOM_Symbol_match);
79
+ if (JS_IsException(m))
80
+ return -1;
81
+ if (!JS_IsUndefined(m))
82
+ return JS_ToBoolFree(ctx, m) ? 1 : 0;
83
+ return js_get_regexp(ctx, obj, false) !== null ? 1 : 0;
84
+ }
85
+ function js_regexp_constructor(ctx, new_target, argv) {
86
+ const pat = argv[0];
87
+ const flags1 = argv[1];
88
+ const pat_is_regexp = js_is_regexp(ctx, pat);
89
+ if (pat_is_regexp < 0)
90
+ return JS_EXCEPTION;
91
+ if (JS_IsUndefined(new_target)) {
92
+ /* called as a function */
93
+ new_target = ctx.rt.current_stack_frame?.cur_func ?? undefined;
94
+ if (pat_is_regexp && JS_IsUndefined(flags1)) {
95
+ const ctor = JS_GetProperty(ctx, pat, JS_ATOM_constructor);
96
+ if (JS_IsException(ctor))
97
+ return ctor;
98
+ if (js_same_value(ctx, ctor, new_target))
99
+ return pat;
100
+ }
101
+ }
102
+ let re;
103
+ const re1 = js_get_regexp(ctx, pat, false);
104
+ if (re1) {
105
+ const pattern = SOURCE_GETTER.call(re1);
106
+ if (JS_IsUndefined(flags1)) {
107
+ re = new RegExp(re1);
108
+ }
109
+ else {
110
+ re = js_compile_regexp(ctx, pattern, flags1);
111
+ if (!re)
112
+ return JS_EXCEPTION;
113
+ }
114
+ }
115
+ else {
116
+ let flags;
117
+ let pattern_val;
118
+ if (pat_is_regexp) {
119
+ pattern_val = JS_GetProperty(ctx, pat, JS_ATOM_source);
120
+ if (JS_IsException(pattern_val))
121
+ return pattern_val;
122
+ if (JS_IsUndefined(flags1)) {
123
+ flags = JS_GetProperty(ctx, pat, JS_ATOM_flags);
124
+ if (JS_IsException(flags))
125
+ return flags;
126
+ }
127
+ else {
128
+ flags = flags1;
129
+ }
130
+ }
131
+ else {
132
+ pattern_val = pat;
133
+ flags = flags1;
134
+ }
135
+ let pattern;
136
+ if (JS_IsUndefined(pattern_val)) {
137
+ pattern = '';
138
+ }
139
+ else {
140
+ const s = JS_ToString(ctx, pattern_val);
141
+ if (JS_IsException(s))
142
+ return s;
143
+ pattern = s;
144
+ }
145
+ re = js_compile_regexp(ctx, pattern, flags);
146
+ if (!re)
147
+ return JS_EXCEPTION;
148
+ }
149
+ return js_regexp_create(ctx, new_target, re);
150
+ }
151
+ function js_get_this(ctx, this_val) { return this_val; }
152
+ const js_regexp_funcs = [
153
+ JS_CGETSET_DEF(JS_ATOM_Symbol_species, js_get_this, null),
154
+ ];
155
+ /* The flag/source getters are generic on %RegExp.prototype% itself ("(?:)",
156
+ "" and undefined). The host getters recognise the host prototype only,
157
+ so the guest prototype is special cased here. */
158
+ function regexp_getter(ctx, name, proto_value) {
159
+ const get = host_getter(name);
160
+ const proto = ctx.class_proto[18 /* JSClassID.REGEXP */];
161
+ return function () {
162
+ if (this === proto)
163
+ return proto_value;
164
+ return get.call(this);
165
+ };
166
+ }
167
+ export function JS_AddIntrinsicRegExp(ctx) {
168
+ hooks.js_regexp_constructor_internal = js_regexp_constructor_internal_hook;
169
+ const proto = JS_NewObject(ctx);
170
+ ctx.class_proto[18 /* JSClassID.REGEXP */] = proto;
171
+ const js_regexp_proto_funcs = [
172
+ JS_NATIVE_GETSET_DEF('flags', FLAGS_GETTER, null),
173
+ JS_NATIVE_GETSET_DEF('source', regexp_getter(ctx, 'source', '(?:)'), null),
174
+ JS_NATIVE_GETSET_DEF('global', regexp_getter(ctx, 'global', undefined), null),
175
+ JS_NATIVE_GETSET_DEF('ignoreCase', regexp_getter(ctx, 'ignoreCase', undefined), null),
176
+ JS_NATIVE_GETSET_DEF('multiline', regexp_getter(ctx, 'multiline', undefined), null),
177
+ JS_NATIVE_GETSET_DEF('dotAll', regexp_getter(ctx, 'dotAll', undefined), null),
178
+ JS_NATIVE_GETSET_DEF('unicode', regexp_getter(ctx, 'unicode', undefined), null),
179
+ JS_NATIVE_GETSET_DEF('unicodeSets', regexp_getter(ctx, 'unicodeSets', undefined), null),
180
+ JS_NATIVE_GETSET_DEF('sticky', regexp_getter(ctx, 'sticky', undefined), null),
181
+ JS_NATIVE_GETSET_DEF('hasIndices', regexp_getter(ctx, 'hasIndices', undefined), null),
182
+ JS_NATIVE_DEF('exec', 1, RP.exec, fix_match),
183
+ JS_NATIVE_DEF('compile', 2, RP.compile),
184
+ JS_NATIVE_DEF('test', 1, RP.test),
185
+ JS_NATIVE_DEF('toString', 0, RP.toString),
186
+ JS_NATIVE_DEF(JS_ATOM_Symbol_replace, 2, RP[Symbol.replace]),
187
+ JS_NATIVE_DEF(JS_ATOM_Symbol_match, 1, RP[Symbol.match], fix_match),
188
+ JS_NATIVE_DEF(JS_ATOM_Symbol_matchAll, 1, RP[Symbol.matchAll], fix_regexp_string_iterator),
189
+ JS_NATIVE_DEF(JS_ATOM_Symbol_search, 1, RP[Symbol.search]),
190
+ JS_NATIVE_DEF(JS_ATOM_Symbol_split, 2, RP[Symbol.split], fix_array),
191
+ ];
192
+ JS_SetPropertyFunctionList(ctx, proto, js_regexp_proto_funcs);
193
+ const obj = JS_NewGlobalCConstructor(ctx, 'RegExp', js_regexp_constructor, 2, proto);
194
+ ctx.regexp_ctor = obj;
195
+ JS_SetPropertyFunctionList(ctx, obj, js_regexp_funcs);
196
+ const it_proto = JS_NewObjectProto(ctx, ctx.iterator_proto);
197
+ ctx.class_proto[42 /* JSClassID.REGEXP_STRING_ITERATOR */] = it_proto;
198
+ JS_SetPropertyFunctionList(ctx, it_proto, [
199
+ JS_NATIVE_DEF('next', 0, HOST_REGEXP_STRING_ITERATOR_PROTO.next, fix_iter_result_match),
200
+ JS_PROP_STRING_DEF(JS_ATOM_Symbol_toStringTag, 'RegExp String Iterator', JS_PROP_CONFIGURABLE),
201
+ ]);
202
+ }
203
+ //# sourceMappingURL=regexp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regexp.js","sourceRoot":"","sources":["../../src/builtins/regexp.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * RegExp objects (port of the RegExp part of quickjs.c)\n *\n * libregexp is not ported: a guest RegExp object IS a host RegExp with the\n * guest prototype (builtins/native.ts), so matching, lastIndex handling and\n * the Symbol.* protocol methods are the borrowed host natives. The results\n * they create (match arrays, split arrays, string iterators) are\n * re-prototyped by the fixers. The constructor keeps the quickjs.c logic\n * for IsRegExp, pattern/flags extraction and flag validation.\n */\nimport * as Q from '../quickjs.ts';\nimport {\n JSContext, JSValue, JSObject, JSClassID, JS_EXCEPTION, JS_IsException, JS_IsUndefined, JS_IsObject,\n JS_NewObject, JS_NewObjectProto, JS_GetProperty, JS_ToString, JS_ToBoolFree, JS_ThrowTypeError,\n JS_ThrowSyntaxError, js_proto_from_ctor, js_same_value, hooks, JS_SetPropertyFunctionList,\n JS_NewGlobalCConstructor, JS_CGETSET_DEF, JS_NATIVE_DEF, JS_NATIVE_GETSET_DEF, JS_PROP_STRING_DEF,\n JSCFunctionListEntry, JS_PROP_CONFIGURABLE, JS_ATOM_constructor, JS_ATOM_source, JS_ATOM_flags,\n JS_ATOM_Symbol_match, JS_ATOM_Symbol_matchAll, JS_ATOM_Symbol_replace, JS_ATOM_Symbol_search, JS_ATOM_Symbol_split, JS_ATOM_Symbol_species,\n JS_ATOM_Symbol_toStringTag,\n} from '../quickjs.ts';\nimport {\n js_adopt_host_object, fix_match, fix_array, fix_regexp_string_iterator, fix_iter_result_match,\n HOST_REGEXP_STRING_ITERATOR_PROTO,\n} from './native.ts';\n\nconst RP = RegExp.prototype;\nconst host_getter = (name: string) => Object.getOwnPropertyDescriptor(RP, name)!.get!;\nconst SOURCE_GETTER = host_getter('source');\nconst FLAGS_GETTER = host_getter('flags');\n\n/* validate the flags (quickjs.c messages) and compile with the host */\nfunction js_compile_regexp(ctx: JSContext, pattern: string, flags: JSValue): RegExp | null {\n let flags_str = '';\n if (!JS_IsUndefined(flags)) {\n const str = JS_ToString(ctx, flags);\n if (JS_IsException(str)) return null;\n flags_str = str as string;\n let seen = '';\n for (const c of flags_str) {\n if (!'dgimsuvy'.includes(c) || seen.includes(c)) {\n JS_ThrowSyntaxError(ctx, 'invalid regular expression flags');\n return null;\n }\n seen += c;\n }\n if (seen.includes('u') && seen.includes('v')) {\n JS_ThrowSyntaxError(ctx, 'invalid regular expression flags');\n return null;\n }\n }\n try {\n return new RegExp(pattern, flags_str);\n } catch (e) {\n let msg = (e instanceof Error) ? e.message : String(e);\n /* strip the host prefix \"Invalid regular expression: /.../flags: \" if present */\n msg = msg.replace(/^Invalid regular expression: (\\/.*\\/[a-z]*: )?/s, '');\n JS_ThrowSyntaxError(ctx, msg);\n return null;\n }\n}\n\n/* create the guest RegExp object from a freshly compiled host regexp */\nfunction js_regexp_create(ctx: JSContext, ctor: JSValue, re: RegExp): JSValue {\n const proto = js_proto_from_ctor(ctx, ctor, JSClassID.REGEXP);\n if (JS_IsException(proto)) return proto;\n return js_adopt_host_object(ctx, re, proto, JSClassID.REGEXP);\n}\n\n/* hook used by the interpreter for regexp literals */\nfunction js_regexp_constructor_internal_hook(ctx: JSContext, ctor: JSValue, pattern: string, flags: string): JSValue {\n if (typeof pattern !== 'string' || typeof flags !== 'string') return JS_ThrowTypeError(ctx, 'string expected');\n const re = js_compile_regexp(ctx, pattern, flags);\n if (!re) return JS_EXCEPTION;\n return js_regexp_create(ctx, ctor, re);\n}\n\n/* the host regexp behind a guest RegExp object, or null */\nfunction js_get_regexp(ctx: JSContext, obj: JSValue, throw_error: boolean): RegExp | null {\n if (Q.JS_IsObject(obj) && Q.JS_GetClassID(obj) === JSClassID.REGEXP && obj instanceof RegExp) return obj;\n if (throw_error) Q.JS_ThrowTypeErrorInvalidClass(ctx, JSClassID.REGEXP);\n return null;\n}\n\n/* return < 0 if exception or TRUE/FALSE */\nfunction js_is_regexp(ctx: JSContext, obj: JSValue): number {\n if (!JS_IsObject(obj)) return 0;\n const m = JS_GetProperty(ctx, obj, JS_ATOM_Symbol_match);\n if (JS_IsException(m)) return -1;\n if (!JS_IsUndefined(m)) return JS_ToBoolFree(ctx, m) ? 1 : 0;\n return js_get_regexp(ctx, obj, false) !== null ? 1 : 0;\n}\n\nfunction js_regexp_constructor(ctx: JSContext, new_target: JSValue, argv: JSValue[]): JSValue {\n const pat = argv[0];\n const flags1 = argv[1];\n const pat_is_regexp = js_is_regexp(ctx, pat);\n if (pat_is_regexp < 0) return JS_EXCEPTION;\n if (JS_IsUndefined(new_target)) {\n /* called as a function */\n new_target = ctx.rt.current_stack_frame?.cur_func ?? undefined;\n if (pat_is_regexp && JS_IsUndefined(flags1)) {\n const ctor = JS_GetProperty(ctx, pat, JS_ATOM_constructor);\n if (JS_IsException(ctor)) return ctor;\n if (js_same_value(ctx, ctor, new_target)) return pat;\n }\n }\n let re: RegExp | null;\n const re1 = js_get_regexp(ctx, pat, false);\n if (re1) {\n const pattern = SOURCE_GETTER.call(re1) as string;\n if (JS_IsUndefined(flags1)) {\n re = new RegExp(re1);\n } else {\n re = js_compile_regexp(ctx, pattern, flags1);\n if (!re) return JS_EXCEPTION;\n }\n } else {\n let flags: JSValue;\n let pattern_val: JSValue;\n if (pat_is_regexp) {\n pattern_val = JS_GetProperty(ctx, pat, JS_ATOM_source);\n if (JS_IsException(pattern_val)) return pattern_val;\n if (JS_IsUndefined(flags1)) {\n flags = JS_GetProperty(ctx, pat, JS_ATOM_flags);\n if (JS_IsException(flags)) return flags;\n } else {\n flags = flags1;\n }\n } else {\n pattern_val = pat;\n flags = flags1;\n }\n let pattern: string;\n if (JS_IsUndefined(pattern_val)) {\n pattern = '';\n } else {\n const s = JS_ToString(ctx, pattern_val);\n if (JS_IsException(s)) return s;\n pattern = s as string;\n }\n re = js_compile_regexp(ctx, pattern, flags);\n if (!re) return JS_EXCEPTION;\n }\n return js_regexp_create(ctx, new_target, re);\n}\n\nfunction js_get_this(ctx: JSContext, this_val: JSValue): JSValue { return this_val; }\n\nconst js_regexp_funcs: JSCFunctionListEntry[] = [\n JS_CGETSET_DEF(JS_ATOM_Symbol_species, js_get_this, null),\n];\n\n/* The flag/source getters are generic on %RegExp.prototype% itself (\"(?:)\",\n \"\" and undefined). The host getters recognise the host prototype only,\n so the guest prototype is special cased here. */\nfunction regexp_getter(ctx: JSContext, name: string, proto_value: JSValue): Function {\n const get = host_getter(name);\n const proto = ctx.class_proto[JSClassID.REGEXP];\n return function (this: any) {\n if (this === proto) return proto_value;\n return get.call(this);\n };\n}\n\nexport function JS_AddIntrinsicRegExp(ctx: JSContext): void {\n hooks.js_regexp_constructor_internal = js_regexp_constructor_internal_hook;\n\n const proto = JS_NewObject(ctx) as JSObject;\n ctx.class_proto[JSClassID.REGEXP] = proto;\n const js_regexp_proto_funcs: JSCFunctionListEntry[] = [\n JS_NATIVE_GETSET_DEF('flags', FLAGS_GETTER, null),\n JS_NATIVE_GETSET_DEF('source', regexp_getter(ctx, 'source', '(?:)'), null),\n JS_NATIVE_GETSET_DEF('global', regexp_getter(ctx, 'global', undefined), null),\n JS_NATIVE_GETSET_DEF('ignoreCase', regexp_getter(ctx, 'ignoreCase', undefined), null),\n JS_NATIVE_GETSET_DEF('multiline', regexp_getter(ctx, 'multiline', undefined), null),\n JS_NATIVE_GETSET_DEF('dotAll', regexp_getter(ctx, 'dotAll', undefined), null),\n JS_NATIVE_GETSET_DEF('unicode', regexp_getter(ctx, 'unicode', undefined), null),\n JS_NATIVE_GETSET_DEF('unicodeSets', regexp_getter(ctx, 'unicodeSets', undefined), null),\n JS_NATIVE_GETSET_DEF('sticky', regexp_getter(ctx, 'sticky', undefined), null),\n JS_NATIVE_GETSET_DEF('hasIndices', regexp_getter(ctx, 'hasIndices', undefined), null),\n JS_NATIVE_DEF('exec', 1, RP.exec, fix_match),\n JS_NATIVE_DEF('compile', 2, (RP as any).compile),\n JS_NATIVE_DEF('test', 1, RP.test),\n JS_NATIVE_DEF('toString', 0, RP.toString),\n JS_NATIVE_DEF(JS_ATOM_Symbol_replace, 2, RP[Symbol.replace]),\n JS_NATIVE_DEF(JS_ATOM_Symbol_match, 1, RP[Symbol.match], fix_match),\n JS_NATIVE_DEF(JS_ATOM_Symbol_matchAll, 1, RP[Symbol.matchAll], fix_regexp_string_iterator),\n JS_NATIVE_DEF(JS_ATOM_Symbol_search, 1, RP[Symbol.search]),\n JS_NATIVE_DEF(JS_ATOM_Symbol_split, 2, RP[Symbol.split], fix_array),\n ];\n JS_SetPropertyFunctionList(ctx, proto, js_regexp_proto_funcs);\n const obj = JS_NewGlobalCConstructor(ctx, 'RegExp', js_regexp_constructor, 2, proto);\n ctx.regexp_ctor = obj as JSObject;\n JS_SetPropertyFunctionList(ctx, obj, js_regexp_funcs);\n\n const it_proto = JS_NewObjectProto(ctx, ctx.iterator_proto) as JSObject;\n ctx.class_proto[JSClassID.REGEXP_STRING_ITERATOR] = it_proto;\n JS_SetPropertyFunctionList(ctx, it_proto, [\n JS_NATIVE_DEF('next', 0, (HOST_REGEXP_STRING_ITERATOR_PROTO as any).next, fix_iter_result_match),\n JS_PROP_STRING_DEF(JS_ATOM_Symbol_toStringTag, 'RegExp String Iterator', JS_PROP_CONFIGURABLE),\n ]);\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { JSContext, JSValue } from '../quickjs.ts';
2
+ export declare function JS_ToStringCheckObject(ctx: JSContext, val: JSValue): JSValue;
3
+ export declare function JS_AddIntrinsicStringNormalize(ctx: JSContext): void;
4
+ export declare function JS_AddIntrinsicString(ctx: JSContext): void;
@@ -0,0 +1,135 @@
1
+ /*
2
+ * String objects (port of the String part of quickjs.c)
3
+ *
4
+ * Strings are host UTF-16 strings and String wrapper objects are host
5
+ * String objects with the guest prototype, so the String.prototype methods
6
+ * are borrowed host natives (builtins/native.ts). Arrays and iterators they
7
+ * create are re-prototyped by the fixers; a guest RegExp argument is a host
8
+ * RegExp with the guest prototype, so the natives dispatch to the guest
9
+ * Symbol.match/replace/split/search/matchAll methods as the spec requires.
10
+ */
11
+ import * as Q from "../quickjs.js";
12
+ import { JS_IsException, JS_IsUndefined, JS_NewObjectProto, JS_NewGlobalCConstructor, JS_PROP_CONFIGURABLE, JS_ToString, JS_ToQuotedString, JS_ThrowTypeError, JS_SetPropertyFunctionList, JS_CFUNC_DEF, JS_NATIVE_DEF, JS_PROP_STRING_DEF, JS_ALIAS_DEF, JS_ATOM_Symbol_iterator, JS_ATOM_Symbol_toStringTag, } from "../quickjs.js";
13
+ import { js_symbol_descriptive_string } from "./symbol.js";
14
+ import { fix_array, fix_match, fix_string_iterator, fix_regexp_string_iterator, fix_iter_result, HOST_STRING_ITERATOR_PROTO, } from "./native.js";
15
+ /* JS_ToStringCheckObject: ToString but undefined/null are rejected */
16
+ export function JS_ToStringCheckObject(ctx, val) {
17
+ if (val === undefined || val === null)
18
+ return JS_ThrowTypeError(ctx, 'null or undefined are forbidden');
19
+ return JS_ToString(ctx, val);
20
+ }
21
+ function js_string_constructor(ctx, new_target, argv) {
22
+ let val;
23
+ if (argv.length === 0) {
24
+ val = '';
25
+ }
26
+ else {
27
+ if (JS_IsUndefined(new_target) && typeof argv[0] === 'symbol') {
28
+ val = js_symbol_descriptive_string(argv[0]);
29
+ }
30
+ else {
31
+ val = JS_ToString(ctx, argv[0]);
32
+ }
33
+ if (JS_IsException(val))
34
+ return val;
35
+ }
36
+ if (!JS_IsUndefined(new_target)) {
37
+ return Q.js_create_wrapper_from_ctor(ctx, new_target, 5 /* JSClassID.STRING */, val);
38
+ }
39
+ return val;
40
+ }
41
+ /* QuickJS extension used by the tests */
42
+ function js_string___quote(ctx, this_val, argv) {
43
+ return JS_ToQuotedString(ctx, this_val);
44
+ }
45
+ const S = String;
46
+ const SP = String.prototype;
47
+ const js_string_funcs = [
48
+ JS_NATIVE_DEF('fromCharCode', 1, S.fromCharCode),
49
+ JS_NATIVE_DEF('fromCodePoint', 1, S.fromCodePoint),
50
+ JS_NATIVE_DEF('raw', 1, S.raw),
51
+ ];
52
+ /* match/matchAll/replace/replaceAll/search/split return whatever the
53
+ Symbol.* method of a guest argument returns (already guest values); when
54
+ the argument is a string the host creates an internal RegExp and the
55
+ result is a host array/iterator, hence the fixers (which only touch host
56
+ prototyped objects). */
57
+ const js_string_proto_funcs = [
58
+ /* 'length' is the own property of the host String wrapper */
59
+ JS_NATIVE_DEF('at', 1, SP.at),
60
+ JS_NATIVE_DEF('charCodeAt', 1, SP.charCodeAt),
61
+ JS_NATIVE_DEF('charAt', 1, SP.charAt),
62
+ JS_NATIVE_DEF('concat', 1, SP.concat),
63
+ JS_NATIVE_DEF('codePointAt', 1, SP.codePointAt),
64
+ JS_NATIVE_DEF('isWellFormed', 0, SP.isWellFormed),
65
+ JS_NATIVE_DEF('toWellFormed', 0, SP.toWellFormed),
66
+ JS_NATIVE_DEF('indexOf', 1, SP.indexOf),
67
+ JS_NATIVE_DEF('lastIndexOf', 1, SP.lastIndexOf),
68
+ JS_NATIVE_DEF('includes', 1, SP.includes),
69
+ JS_NATIVE_DEF('endsWith', 1, SP.endsWith),
70
+ JS_NATIVE_DEF('startsWith', 1, SP.startsWith),
71
+ JS_NATIVE_DEF('match', 1, SP.match, fix_match),
72
+ JS_NATIVE_DEF('matchAll', 1, SP.matchAll, fix_regexp_string_iterator),
73
+ JS_NATIVE_DEF('search', 1, SP.search),
74
+ JS_NATIVE_DEF('split', 2, SP.split, fix_array),
75
+ JS_NATIVE_DEF('substring', 2, SP.substring),
76
+ JS_NATIVE_DEF('substr', 2, SP.substr),
77
+ JS_NATIVE_DEF('slice', 2, SP.slice),
78
+ JS_NATIVE_DEF('repeat', 1, SP.repeat),
79
+ JS_NATIVE_DEF('replace', 2, SP.replace),
80
+ JS_NATIVE_DEF('replaceAll', 2, SP.replaceAll),
81
+ JS_NATIVE_DEF('padEnd', 1, SP.padEnd),
82
+ JS_NATIVE_DEF('padStart', 1, SP.padStart),
83
+ JS_NATIVE_DEF('trim', 0, SP.trim),
84
+ JS_NATIVE_DEF('trimEnd', 0, SP.trimEnd),
85
+ JS_ALIAS_DEF('trimRight', 'trimEnd'),
86
+ JS_NATIVE_DEF('trimStart', 0, SP.trimStart),
87
+ JS_ALIAS_DEF('trimLeft', 'trimStart'),
88
+ JS_NATIVE_DEF('toString', 0, SP.toString),
89
+ JS_NATIVE_DEF('valueOf', 0, SP.valueOf),
90
+ JS_CFUNC_DEF('__quote', 1, js_string___quote),
91
+ JS_NATIVE_DEF('toLowerCase', 0, SP.toLowerCase),
92
+ JS_NATIVE_DEF('toUpperCase', 0, SP.toUpperCase),
93
+ JS_NATIVE_DEF('toLocaleLowerCase', 0, SP.toLocaleLowerCase),
94
+ JS_NATIVE_DEF('toLocaleUpperCase', 0, SP.toLocaleUpperCase),
95
+ JS_NATIVE_DEF(JS_ATOM_Symbol_iterator, 0, SP[Symbol.iterator], fix_string_iterator),
96
+ /* ES6 Annex B 2.3.2 etc. */
97
+ JS_NATIVE_DEF('anchor', 1, SP.anchor),
98
+ JS_NATIVE_DEF('big', 0, SP.big),
99
+ JS_NATIVE_DEF('blink', 0, SP.blink),
100
+ JS_NATIVE_DEF('bold', 0, SP.bold),
101
+ JS_NATIVE_DEF('fixed', 0, SP.fixed),
102
+ JS_NATIVE_DEF('fontcolor', 1, SP.fontcolor),
103
+ JS_NATIVE_DEF('fontsize', 1, SP.fontsize),
104
+ JS_NATIVE_DEF('italics', 0, SP.italics),
105
+ JS_NATIVE_DEF('link', 1, SP.link),
106
+ JS_NATIVE_DEF('small', 0, SP.small),
107
+ JS_NATIVE_DEF('strike', 0, SP.strike),
108
+ JS_NATIVE_DEF('sub', 0, SP.sub),
109
+ JS_NATIVE_DEF('sup', 0, SP.sup),
110
+ ];
111
+ const js_string_iterator_proto_funcs = [
112
+ JS_NATIVE_DEF('next', 0, HOST_STRING_ITERATOR_PROTO.next, fix_iter_result),
113
+ JS_PROP_STRING_DEF(JS_ATOM_Symbol_toStringTag, 'String Iterator', JS_PROP_CONFIGURABLE),
114
+ ];
115
+ const js_string_proto_normalize = [
116
+ JS_NATIVE_DEF('normalize', 0, SP.normalize),
117
+ JS_NATIVE_DEF('localeCompare', 1, SP.localeCompare),
118
+ ];
119
+ export function JS_AddIntrinsicStringNormalize(ctx) {
120
+ JS_SetPropertyFunctionList(ctx, ctx.class_proto[5 /* JSClassID.STRING */], js_string_proto_normalize);
121
+ }
122
+ export function JS_AddIntrinsicString(ctx) {
123
+ /* String.prototype is a String object with value '' */
124
+ const proto = Q.js_new_primitive_wrapper(ctx, ctx.class_proto[1 /* JSClassID.OBJECT */], 5 /* JSClassID.STRING */, '');
125
+ ctx.class_proto[5 /* JSClassID.STRING */] = proto;
126
+ const obj = JS_NewGlobalCConstructor(ctx, 'String', js_string_constructor, 1, proto);
127
+ JS_SetPropertyFunctionList(ctx, obj, js_string_funcs);
128
+ JS_SetPropertyFunctionList(ctx, proto, js_string_proto_funcs);
129
+ const iter_proto = JS_NewObjectProto(ctx, ctx.iterator_proto);
130
+ ctx.class_proto[41 /* JSClassID.STRING_ITERATOR */] = iter_proto;
131
+ JS_SetPropertyFunctionList(ctx, iter_proto, js_string_iterator_proto_funcs);
132
+ /* called from JS_NewContext in quickjs.c */
133
+ JS_AddIntrinsicStringNormalize(ctx);
134
+ }
135
+ //# sourceMappingURL=string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/builtins/string.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * String objects (port of the String part of quickjs.c)\n *\n * Strings are host UTF-16 strings and String wrapper objects are host\n * String objects with the guest prototype, so the String.prototype methods\n * are borrowed host natives (builtins/native.ts). Arrays and iterators they\n * create are re-prototyped by the fixers; a guest RegExp argument is a host\n * RegExp with the guest prototype, so the natives dispatch to the guest\n * Symbol.match/replace/split/search/matchAll methods as the spec requires.\n */\nimport * as Q from '../quickjs.ts';\nimport {\n JSContext, JSValue, JSObject, JSClassID, JS_IsException, JS_IsUndefined, JS_NewObjectProto,\n JS_NewGlobalCConstructor, JS_PROP_CONFIGURABLE, JS_ToString, JS_ToQuotedString, JS_ThrowTypeError,\n JS_SetPropertyFunctionList, JS_CFUNC_DEF, JS_NATIVE_DEF, JS_PROP_STRING_DEF, JS_ALIAS_DEF,\n JS_ATOM_Symbol_iterator, JS_ATOM_Symbol_toStringTag,\n} from '../quickjs.ts';\nimport { js_symbol_descriptive_string } from './symbol.ts';\nimport {\n fix_array, fix_match, fix_string_iterator, fix_regexp_string_iterator, fix_iter_result, HOST_STRING_ITERATOR_PROTO,\n} from './native.ts';\n\n/* JS_ToStringCheckObject: ToString but undefined/null are rejected */\nexport function JS_ToStringCheckObject(ctx: JSContext, val: JSValue): JSValue {\n if (val === undefined || val === null) return JS_ThrowTypeError(ctx, 'null or undefined are forbidden');\n return JS_ToString(ctx, val);\n}\n\nfunction js_string_constructor(ctx: JSContext, new_target: JSValue, argv: JSValue[]): JSValue {\n let val: JSValue;\n if (argv.length === 0) {\n val = '';\n } else {\n if (JS_IsUndefined(new_target) && typeof argv[0] === 'symbol') {\n val = js_symbol_descriptive_string(argv[0] as symbol);\n } else {\n val = JS_ToString(ctx, argv[0]);\n }\n if (JS_IsException(val)) return val;\n }\n if (!JS_IsUndefined(new_target)) {\n return Q.js_create_wrapper_from_ctor(ctx, new_target, JSClassID.STRING, val);\n }\n return val;\n}\n\n/* QuickJS extension used by the tests */\nfunction js_string___quote(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n return JS_ToQuotedString(ctx, this_val);\n}\n\nconst S = String;\nconst SP = String.prototype;\n\nconst js_string_funcs = [\n JS_NATIVE_DEF('fromCharCode', 1, S.fromCharCode),\n JS_NATIVE_DEF('fromCodePoint', 1, S.fromCodePoint),\n JS_NATIVE_DEF('raw', 1, S.raw),\n];\n\n/* match/matchAll/replace/replaceAll/search/split return whatever the\n Symbol.* method of a guest argument returns (already guest values); when\n the argument is a string the host creates an internal RegExp and the\n result is a host array/iterator, hence the fixers (which only touch host\n prototyped objects). */\nconst js_string_proto_funcs = [\n /* 'length' is the own property of the host String wrapper */\n JS_NATIVE_DEF('at', 1, SP.at),\n JS_NATIVE_DEF('charCodeAt', 1, SP.charCodeAt),\n JS_NATIVE_DEF('charAt', 1, SP.charAt),\n JS_NATIVE_DEF('concat', 1, SP.concat),\n JS_NATIVE_DEF('codePointAt', 1, SP.codePointAt),\n JS_NATIVE_DEF('isWellFormed', 0, SP.isWellFormed),\n JS_NATIVE_DEF('toWellFormed', 0, SP.toWellFormed),\n JS_NATIVE_DEF('indexOf', 1, SP.indexOf),\n JS_NATIVE_DEF('lastIndexOf', 1, SP.lastIndexOf),\n JS_NATIVE_DEF('includes', 1, SP.includes),\n JS_NATIVE_DEF('endsWith', 1, SP.endsWith),\n JS_NATIVE_DEF('startsWith', 1, SP.startsWith),\n JS_NATIVE_DEF('match', 1, SP.match, fix_match),\n JS_NATIVE_DEF('matchAll', 1, SP.matchAll, fix_regexp_string_iterator),\n JS_NATIVE_DEF('search', 1, SP.search),\n JS_NATIVE_DEF('split', 2, SP.split, fix_array),\n JS_NATIVE_DEF('substring', 2, SP.substring),\n JS_NATIVE_DEF('substr', 2, SP.substr),\n JS_NATIVE_DEF('slice', 2, SP.slice),\n JS_NATIVE_DEF('repeat', 1, SP.repeat),\n JS_NATIVE_DEF('replace', 2, SP.replace),\n JS_NATIVE_DEF('replaceAll', 2, SP.replaceAll),\n JS_NATIVE_DEF('padEnd', 1, SP.padEnd),\n JS_NATIVE_DEF('padStart', 1, SP.padStart),\n JS_NATIVE_DEF('trim', 0, SP.trim),\n JS_NATIVE_DEF('trimEnd', 0, SP.trimEnd),\n JS_ALIAS_DEF('trimRight', 'trimEnd'),\n JS_NATIVE_DEF('trimStart', 0, SP.trimStart),\n JS_ALIAS_DEF('trimLeft', 'trimStart'),\n JS_NATIVE_DEF('toString', 0, SP.toString),\n JS_NATIVE_DEF('valueOf', 0, SP.valueOf),\n JS_CFUNC_DEF('__quote', 1, js_string___quote),\n JS_NATIVE_DEF('toLowerCase', 0, SP.toLowerCase),\n JS_NATIVE_DEF('toUpperCase', 0, SP.toUpperCase),\n JS_NATIVE_DEF('toLocaleLowerCase', 0, SP.toLocaleLowerCase),\n JS_NATIVE_DEF('toLocaleUpperCase', 0, SP.toLocaleUpperCase),\n JS_NATIVE_DEF(JS_ATOM_Symbol_iterator, 0, SP[Symbol.iterator], fix_string_iterator),\n /* ES6 Annex B 2.3.2 etc. */\n JS_NATIVE_DEF('anchor', 1, (SP as any).anchor),\n JS_NATIVE_DEF('big', 0, (SP as any).big),\n JS_NATIVE_DEF('blink', 0, (SP as any).blink),\n JS_NATIVE_DEF('bold', 0, (SP as any).bold),\n JS_NATIVE_DEF('fixed', 0, (SP as any).fixed),\n JS_NATIVE_DEF('fontcolor', 1, (SP as any).fontcolor),\n JS_NATIVE_DEF('fontsize', 1, (SP as any).fontsize),\n JS_NATIVE_DEF('italics', 0, (SP as any).italics),\n JS_NATIVE_DEF('link', 1, (SP as any).link),\n JS_NATIVE_DEF('small', 0, (SP as any).small),\n JS_NATIVE_DEF('strike', 0, (SP as any).strike),\n JS_NATIVE_DEF('sub', 0, (SP as any).sub),\n JS_NATIVE_DEF('sup', 0, (SP as any).sup),\n];\n\nconst js_string_iterator_proto_funcs = [\n JS_NATIVE_DEF('next', 0, (HOST_STRING_ITERATOR_PROTO as any).next, fix_iter_result),\n JS_PROP_STRING_DEF(JS_ATOM_Symbol_toStringTag, 'String Iterator', JS_PROP_CONFIGURABLE),\n];\n\nconst js_string_proto_normalize = [\n JS_NATIVE_DEF('normalize', 0, SP.normalize),\n JS_NATIVE_DEF('localeCompare', 1, SP.localeCompare),\n];\n\nexport function JS_AddIntrinsicStringNormalize(ctx: JSContext): void {\n JS_SetPropertyFunctionList(ctx, ctx.class_proto[JSClassID.STRING], js_string_proto_normalize);\n}\n\nexport function JS_AddIntrinsicString(ctx: JSContext): void {\n /* String.prototype is a String object with value '' */\n const proto = Q.js_new_primitive_wrapper(ctx, ctx.class_proto[JSClassID.OBJECT], JSClassID.STRING, '') as JSObject;\n ctx.class_proto[JSClassID.STRING] = proto;\n const obj = JS_NewGlobalCConstructor(ctx, 'String', js_string_constructor, 1, proto);\n JS_SetPropertyFunctionList(ctx, obj, js_string_funcs);\n JS_SetPropertyFunctionList(ctx, proto, js_string_proto_funcs);\n\n const iter_proto = JS_NewObjectProto(ctx, ctx.iterator_proto) as JSObject;\n ctx.class_proto[JSClassID.STRING_ITERATOR] = iter_proto;\n JS_SetPropertyFunctionList(ctx, iter_proto, js_string_iterator_proto_funcs);\n\n /* called from JS_NewContext in quickjs.c */\n JS_AddIntrinsicStringNormalize(ctx);\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import { JSContext } from '../quickjs.ts';
2
+ export declare function js_symbol_descriptive_string(sym: symbol): string;
3
+ export declare function JS_AddIntrinsicSymbol(ctx: JSContext): void;
@@ -0,0 +1,98 @@
1
+ /*
2
+ * Symbol objects (port of the Symbol part of quickjs.c)
3
+ */
4
+ import * as Q from "../quickjs.js";
5
+ import { JS_IsException, JS_IsUndefined, JS_NewObjectProto, JS_NewGlobalCConstructorOnly, JS_DefinePropertyValue, JS_PROP_CONFIGURABLE, JS_ToString, JS_ThrowTypeError, JS_ThrowTypeErrorNotASymbol, JS_SetPropertyFunctionList, JS_NATIVE_DEF, JS_NATIVE_GETSET_DEF, hooks, JS_ATOM_TYPE_SYMBOL, JS_ATOM_TYPE_GLOBAL_SYMBOL, JS_ATOM_Symbol_toPrimitive, JS_ATOM_Symbol_iterator, JS_ATOM_Symbol_match, JS_ATOM_Symbol_matchAll, JS_ATOM_Symbol_replace, JS_ATOM_Symbol_search, JS_ATOM_Symbol_split, JS_ATOM_Symbol_toStringTag, JS_ATOM_Symbol_isConcatSpreadable, JS_ATOM_Symbol_hasInstance, JS_ATOM_Symbol_species, JS_ATOM_Symbol_unscopables, JS_ATOM_Symbol_asyncIterator, JS_AtomToValue, JS_NewAtom, } from "../quickjs.js";
6
+ function js_thisSymbolValue(ctx, this_val) {
7
+ if (typeof this_val === 'symbol')
8
+ return this_val;
9
+ if (Q.JS_IsObject(this_val) && Q.JS_GetClassID(this_val) === 7 /* JSClassID.SYMBOL */)
10
+ return Q.JS_GetAnyOpaque(this_val);
11
+ return JS_ThrowTypeErrorNotASymbol(ctx);
12
+ }
13
+ function js_symbol_constructor(ctx, new_target, argv) {
14
+ if (!JS_IsUndefined(new_target))
15
+ return JS_ThrowTypeError(ctx, 'not a constructor');
16
+ let str;
17
+ if (!JS_IsUndefined(argv[0])) {
18
+ const s = JS_ToString(ctx, argv[0]);
19
+ if (JS_IsException(s))
20
+ return s;
21
+ str = s;
22
+ }
23
+ return ctx.rt.atoms.newSymbol(str, JS_ATOM_TYPE_SYMBOL);
24
+ }
25
+ function js_symbol_toString(ctx, this_val, argv) {
26
+ const val = js_thisSymbolValue(ctx, this_val);
27
+ if (JS_IsException(val))
28
+ return val;
29
+ return js_symbol_descriptive_string(val);
30
+ }
31
+ export function js_symbol_descriptive_string(sym) {
32
+ return 'Symbol(' + (sym.description ?? '') + ')';
33
+ }
34
+ function js_symbol_valueOf(ctx, this_val, argv) {
35
+ return js_thisSymbolValue(ctx, this_val);
36
+ }
37
+ function js_symbol_get_description(ctx, this_val) {
38
+ const val = js_thisSymbolValue(ctx, this_val);
39
+ if (JS_IsException(val))
40
+ return val;
41
+ return val.description;
42
+ }
43
+ function js_symbol_for(ctx, this_val, argv) {
44
+ const str = JS_ToString(ctx, argv[0]);
45
+ if (JS_IsException(str))
46
+ return str;
47
+ const reg = ctx.rt.global_symbol_registry;
48
+ let sym = reg.get(str);
49
+ if (!sym) {
50
+ sym = ctx.rt.atoms.newSymbol(str, JS_ATOM_TYPE_GLOBAL_SYMBOL);
51
+ reg.set(str, sym);
52
+ }
53
+ return sym;
54
+ }
55
+ function js_symbol_keyFor(ctx, this_val, argv) {
56
+ const sym = argv[0];
57
+ if (!(typeof sym === 'symbol'))
58
+ return JS_ThrowTypeError(ctx, 'not a symbol');
59
+ if (Symbol.keyFor(sym) === undefined)
60
+ return undefined;
61
+ return sym.description;
62
+ }
63
+ /* Symbol wrapper objects are host Symbol objects with the guest prototype:
64
+ the prototype methods are borrowed host natives. The registry of
65
+ Symbol.for is the host registry (symbols are host symbols). */
66
+ const js_symbol_proto_funcs = [
67
+ JS_NATIVE_DEF('toString', 0, Symbol.prototype.toString),
68
+ JS_NATIVE_DEF('valueOf', 0, Symbol.prototype.valueOf),
69
+ JS_NATIVE_GETSET_DEF('description', Object.getOwnPropertyDescriptor(Symbol.prototype, 'description').get, null),
70
+ ];
71
+ const js_symbol_funcs = [
72
+ JS_NATIVE_DEF('for', 1, Symbol.for),
73
+ JS_NATIVE_DEF('keyFor', 1, Symbol.keyFor),
74
+ ];
75
+ const well_known_symbols = [
76
+ ['toPrimitive', JS_ATOM_Symbol_toPrimitive], ['iterator', JS_ATOM_Symbol_iterator], ['match', JS_ATOM_Symbol_match],
77
+ ['matchAll', JS_ATOM_Symbol_matchAll], ['replace', JS_ATOM_Symbol_replace], ['search', JS_ATOM_Symbol_search],
78
+ ['split', JS_ATOM_Symbol_split], ['toStringTag', JS_ATOM_Symbol_toStringTag], ['isConcatSpreadable', JS_ATOM_Symbol_isConcatSpreadable],
79
+ ['hasInstance', JS_ATOM_Symbol_hasInstance], ['species', JS_ATOM_Symbol_species], ['unscopables', JS_ATOM_Symbol_unscopables],
80
+ ['asyncIterator', JS_ATOM_Symbol_asyncIterator],
81
+ ];
82
+ export function JS_AddIntrinsicSymbol(ctx) {
83
+ const proto = JS_NewObjectProto(ctx, ctx.class_proto[1 /* JSClassID.OBJECT */]);
84
+ ctx.class_proto[7 /* JSClassID.SYMBOL */] = proto;
85
+ JS_SetPropertyFunctionList(ctx, proto, js_symbol_proto_funcs);
86
+ const obj1 = JS_NewGlobalCConstructorOnly(ctx, 'Symbol', js_symbol_constructor, 0, proto);
87
+ /* Symbol() can be called without new */
88
+ Q.js_get_meta(obj1).cfunc.cproto = 4 /* JSCFunctionEnum.constructor_or_func */;
89
+ JS_SetPropertyFunctionList(ctx, obj1, js_symbol_funcs);
90
+ for (const [name, atom] of well_known_symbols) {
91
+ JS_DefinePropertyValue(ctx, obj1, JS_NewAtom(ctx, name), JS_AtomToValue(ctx, atom), 0);
92
+ }
93
+ /* Symbol.prototype[Symbol.toStringTag] and [Symbol.toPrimitive] */
94
+ JS_DefinePropertyValue(ctx, proto, JS_ATOM_Symbol_toStringTag, 'Symbol', JS_PROP_CONFIGURABLE);
95
+ const toprim = hooks.js_borrow_native(ctx, Symbol.prototype[Symbol.toPrimitive], '[Symbol.toPrimitive]', 1, null);
96
+ JS_DefinePropertyValue(ctx, proto, JS_ATOM_Symbol_toPrimitive, toprim, JS_PROP_CONFIGURABLE);
97
+ }
98
+ //# sourceMappingURL=symbol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol.js","sourceRoot":"","sources":["../../src/builtins/symbol.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Symbol objects (port of the Symbol part of quickjs.c)\n */\nimport * as Q from '../quickjs.ts';\nimport {\n JSContext, JSValue, JSObject, JSClassID, JS_EXCEPTION, JS_IsException, JS_IsUndefined, JS_IsSymbol,\n JS_NewObjectProto, JS_NewCFunction3, JS_NewGlobalCConstructorOnly, JSCFunctionEnum, JS_DefinePropertyValue, JS_PROP_CONFIGURABLE,\n JS_ToString, JS_ThrowTypeError, JS_ThrowTypeErrorNotASymbol, JS_SetPropertyFunctionList, JS_CFUNC_DEF, JS_NATIVE_DEF, JS_NATIVE_GETSET_DEF, hooks,\n JS_CFUNC_MAGIC_DEF, JS_CGETSET_DEF, JS_PROP_STRING_DEF, JS_CFUNC_SPECIAL_DEF, JS_ATOM_TYPE_SYMBOL, JS_ATOM_TYPE_GLOBAL_SYMBOL,\n JS_ATOM_Symbol_toPrimitive, JS_ATOM_Symbol_iterator, JS_ATOM_Symbol_match, JS_ATOM_Symbol_matchAll, JS_ATOM_Symbol_replace,\n JS_ATOM_Symbol_search, JS_ATOM_Symbol_split, JS_ATOM_Symbol_toStringTag, JS_ATOM_Symbol_isConcatSpreadable,\n JS_ATOM_Symbol_hasInstance, JS_ATOM_Symbol_species, JS_ATOM_Symbol_unscopables, JS_ATOM_Symbol_asyncIterator,\n JS_AtomToValue, JS_NewAtom, JSAtom,\n} from '../quickjs.ts';\n\nfunction js_thisSymbolValue(ctx: JSContext, this_val: JSValue): JSValue {\n if (typeof this_val === 'symbol') return this_val;\n if (Q.JS_IsObject(this_val) && Q.JS_GetClassID(this_val) === JSClassID.SYMBOL) return Q.JS_GetAnyOpaque(this_val) as symbol;\n return JS_ThrowTypeErrorNotASymbol(ctx);\n}\n\nfunction js_symbol_constructor(ctx: JSContext, new_target: JSValue, argv: JSValue[]): JSValue {\n if (!JS_IsUndefined(new_target)) return JS_ThrowTypeError(ctx, 'not a constructor');\n let str: string | undefined;\n if (!JS_IsUndefined(argv[0])) {\n const s = JS_ToString(ctx, argv[0]);\n if (JS_IsException(s)) return s;\n str = s as string;\n }\n return ctx.rt.atoms.newSymbol(str, JS_ATOM_TYPE_SYMBOL);\n}\n\nfunction js_symbol_toString(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n const val = js_thisSymbolValue(ctx, this_val);\n if (JS_IsException(val)) return val;\n return js_symbol_descriptive_string(val as symbol);\n}\n\nexport function js_symbol_descriptive_string(sym: symbol): string {\n return 'Symbol(' + (sym.description ?? '') + ')';\n}\n\nfunction js_symbol_valueOf(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n return js_thisSymbolValue(ctx, this_val);\n}\n\nfunction js_symbol_get_description(ctx: JSContext, this_val: JSValue): JSValue {\n const val = js_thisSymbolValue(ctx, this_val);\n if (JS_IsException(val)) return val;\n return (val as symbol).description;\n}\n\nfunction js_symbol_for(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n const str = JS_ToString(ctx, argv[0]);\n if (JS_IsException(str)) return str;\n const reg = ctx.rt.global_symbol_registry;\n let sym = reg.get(str as string);\n if (!sym) {\n sym = ctx.rt.atoms.newSymbol(str as string, JS_ATOM_TYPE_GLOBAL_SYMBOL);\n reg.set(str as string, sym);\n }\n return sym;\n}\n\nfunction js_symbol_keyFor(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n const sym = argv[0];\n if (!(typeof sym === 'symbol')) return JS_ThrowTypeError(ctx, 'not a symbol');\n if (Symbol.keyFor(sym) === undefined) return undefined;\n return sym.description;\n}\n\n/* Symbol wrapper objects are host Symbol objects with the guest prototype:\n the prototype methods are borrowed host natives. The registry of\n Symbol.for is the host registry (symbols are host symbols). */\nconst js_symbol_proto_funcs = [\n JS_NATIVE_DEF('toString', 0, Symbol.prototype.toString),\n JS_NATIVE_DEF('valueOf', 0, Symbol.prototype.valueOf),\n JS_NATIVE_GETSET_DEF('description', Object.getOwnPropertyDescriptor(Symbol.prototype, 'description')!.get!, null),\n];\n\nconst js_symbol_funcs = [\n JS_NATIVE_DEF('for', 1, Symbol.for),\n JS_NATIVE_DEF('keyFor', 1, Symbol.keyFor),\n];\n\nconst well_known_symbols: [string, JSAtom][] = [\n ['toPrimitive', JS_ATOM_Symbol_toPrimitive], ['iterator', JS_ATOM_Symbol_iterator], ['match', JS_ATOM_Symbol_match],\n ['matchAll', JS_ATOM_Symbol_matchAll], ['replace', JS_ATOM_Symbol_replace], ['search', JS_ATOM_Symbol_search],\n ['split', JS_ATOM_Symbol_split], ['toStringTag', JS_ATOM_Symbol_toStringTag], ['isConcatSpreadable', JS_ATOM_Symbol_isConcatSpreadable],\n ['hasInstance', JS_ATOM_Symbol_hasInstance], ['species', JS_ATOM_Symbol_species], ['unscopables', JS_ATOM_Symbol_unscopables],\n ['asyncIterator', JS_ATOM_Symbol_asyncIterator],\n];\n\nexport function JS_AddIntrinsicSymbol(ctx: JSContext): void {\n const proto = JS_NewObjectProto(ctx, ctx.class_proto[JSClassID.OBJECT]) as JSObject;\n ctx.class_proto[JSClassID.SYMBOL] = proto;\n JS_SetPropertyFunctionList(ctx, proto, js_symbol_proto_funcs);\n const obj1 = JS_NewGlobalCConstructorOnly(ctx, 'Symbol', js_symbol_constructor as any, 0, proto);\n /* Symbol() can be called without new */\n Q.js_get_meta(obj1)!.cfunc!.cproto = JSCFunctionEnum.constructor_or_func;\n JS_SetPropertyFunctionList(ctx, obj1, js_symbol_funcs);\n for (const [name, atom] of well_known_symbols) {\n JS_DefinePropertyValue(ctx, obj1, JS_NewAtom(ctx, name), JS_AtomToValue(ctx, atom), 0);\n }\n /* Symbol.prototype[Symbol.toStringTag] and [Symbol.toPrimitive] */\n JS_DefinePropertyValue(ctx, proto, JS_ATOM_Symbol_toStringTag, 'Symbol', JS_PROP_CONFIGURABLE);\n const toprim = hooks.js_borrow_native(ctx, (Symbol.prototype as any)[Symbol.toPrimitive], '[Symbol.toPrimitive]', 1, null);\n JS_DefinePropertyValue(ctx, proto, JS_ATOM_Symbol_toPrimitive, toprim, JS_PROP_CONFIGURABLE);\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import { JSContext, JSValue, JSObject, JSClassID, JSArrayBuffer } from '../quickjs.ts';
2
+ export declare class JSArrayBufferData extends JSArrayBuffer {
3
+ max_byte_length: number;
4
+ dv: DataView | null;
5
+ dv_data: Uint8Array | null;
6
+ constructor(len: number, shared: boolean, max_len: number);
7
+ }
8
+ export declare function JS_NewArrayBufferCopy(ctx: JSContext, buf: Uint8Array): JSValue;
9
+ export declare function JS_DetachArrayBuffer(ctx: JSContext, obj: JSValue): void;
10
+ export declare function is_typed_array_class(class_id: JSClassID): boolean;
11
+ declare function typed_array_is_detached(ctx: JSContext, p: JSObject): boolean;
12
+ declare function typed_array_get_length(ctx: JSContext, p: JSObject): number;
13
+ declare function validate_typed_array(ctx: JSContext, this_val: JSValue): number;
14
+ export declare function JS_AddIntrinsicTypedArrays(ctx: JSContext): void;
15
+ export { typed_array_get_length as js_typed_array_get_length_elements, typed_array_is_detached, validate_typed_array };