xbintsc 0.2.9 → 0.3.3
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/README.md +17 -2
- package/README.zh-CN.md +16 -2
- package/bin/xbintsc.js +49 -10
- package/dist/src/ast/expressions.d.ts +2 -0
- package/dist/src/binder/binder.d.ts +24 -98
- package/dist/src/binder/binder.js +13 -559
- package/dist/src/binder/binder.js.map +1 -1
- package/dist/src/binder/declarations.d.ts +16 -0
- package/dist/src/binder/declarations.js +168 -0
- package/dist/src/binder/declarations.js.map +1 -0
- package/dist/src/binder/helpers.d.ts +11 -0
- package/dist/src/binder/helpers.js +46 -0
- package/dist/src/binder/helpers.js.map +1 -0
- package/dist/src/binder/references.d.ts +21 -0
- package/dist/src/binder/references.js +349 -0
- package/dist/src/binder/references.js.map +1 -0
- package/dist/src/binder/types.d.ts +114 -0
- package/dist/src/binder/types.js +27 -0
- package/dist/src/binder/types.js.map +1 -0
- package/dist/src/cli/main.d.ts +1 -0
- package/dist/src/cli/main.js +40 -0
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/codegen/generator/calls/access.d.ts +13 -0
- package/dist/src/codegen/generator/calls/access.js +115 -0
- package/dist/src/codegen/generator/calls/access.js.map +1 -0
- package/dist/src/codegen/generator/calls/closures.d.ts +11 -0
- package/dist/src/codegen/generator/calls/closures.js +50 -0
- package/dist/src/codegen/generator/calls/closures.js.map +1 -0
- package/dist/src/codegen/generator/calls/invocation.d.ts +18 -0
- package/dist/src/codegen/generator/calls/invocation.js +242 -0
- package/dist/src/codegen/generator/calls/invocation.js.map +1 -0
- package/dist/src/codegen/generator/calls/literals.d.ts +10 -0
- package/dist/src/codegen/generator/calls/literals.js +69 -0
- package/dist/src/codegen/generator/calls/literals.js.map +1 -0
- package/dist/src/codegen/generator/calls/super.d.ts +10 -0
- package/dist/src/codegen/generator/calls/super.js +47 -0
- package/dist/src/codegen/generator/calls/super.js.map +1 -0
- package/dist/src/codegen/generator/calls.d.ts +15 -24
- package/dist/src/codegen/generator/calls.js +15 -482
- package/dist/src/codegen/generator/calls.js.map +1 -1
- package/dist/src/codegen/generator/context.d.ts +1 -1
- package/dist/src/codegen/generator/context.js +2 -2
- package/dist/src/codegen/generator/context.js.map +1 -1
- package/dist/src/codegen/generator/expressions/assignment.d.ts +13 -0
- package/dist/src/codegen/generator/expressions/assignment.js +203 -0
- package/dist/src/codegen/generator/expressions/assignment.js.map +1 -0
- package/dist/src/codegen/generator/expressions/operators.d.ts +14 -0
- package/dist/src/codegen/generator/expressions/operators.js +163 -0
- package/dist/src/codegen/generator/expressions/operators.js.map +1 -0
- package/dist/src/codegen/generator/expressions/primary.d.ts +17 -0
- package/dist/src/codegen/generator/expressions/primary.js +260 -0
- package/dist/src/codegen/generator/expressions/primary.js.map +1 -0
- package/dist/src/codegen/generator/expressions.d.ts +11 -21
- package/dist/src/codegen/generator/expressions.js +11 -494
- package/dist/src/codegen/generator/expressions.js.map +1 -1
- package/dist/src/codegen/generator/module.js +16 -4
- package/dist/src/codegen/generator/module.js.map +1 -1
- package/dist/src/codegen/generator/state.js +8 -0
- package/dist/src/codegen/generator/state.js.map +1 -1
- package/dist/src/codegen/generator/statements/control-flow.d.ts +14 -0
- package/dist/src/codegen/generator/statements/control-flow.js +199 -0
- package/dist/src/codegen/generator/statements/control-flow.js.map +1 -0
- package/dist/src/codegen/generator/statements/dispatch.d.ts +12 -0
- package/dist/src/codegen/generator/statements/dispatch.js +100 -0
- package/dist/src/codegen/generator/statements/dispatch.js.map +1 -0
- package/dist/src/codegen/generator/statements/loops.d.ts +13 -0
- package/dist/src/codegen/generator/statements/loops.js +152 -0
- package/dist/src/codegen/generator/statements/loops.js.map +1 -0
- package/dist/src/codegen/generator/statements/variables.d.ts +13 -0
- package/dist/src/codegen/generator/statements/variables.js +146 -0
- package/dist/src/codegen/generator/statements/variables.js.map +1 -0
- package/dist/src/codegen/generator/statements.d.ts +13 -21
- package/dist/src/codegen/generator/statements.js +13 -568
- package/dist/src/codegen/generator/statements.js.map +1 -1
- package/dist/src/codegen/generator/tables.js +7 -0
- package/dist/src/codegen/generator/tables.js.map +1 -1
- package/dist/src/codegen/values.d.ts +17 -17
- package/dist/src/codegen/values.js +21 -57
- package/dist/src/codegen/values.js.map +1 -1
- package/dist/src/diagnostics/diagnostic.d.ts +1 -0
- package/dist/src/diagnostics/diagnostic.js +1 -0
- package/dist/src/diagnostics/diagnostic.js.map +1 -1
- package/dist/src/diagnostics/source.d.ts +1 -1
- package/dist/src/diagnostics/source.js +7 -12
- package/dist/src/diagnostics/source.js.map +1 -1
- package/dist/src/driver/compiler.d.ts +4 -0
- package/dist/src/driver/compiler.js +51 -16
- package/dist/src/driver/compiler.js.map +1 -1
- package/dist/src/driver/index.d.ts +5 -2
- package/dist/src/driver/index.js +5 -2
- package/dist/src/driver/index.js.map +1 -1
- package/dist/src/driver/paths.d.ts +20 -0
- package/dist/src/driver/paths.js +49 -0
- package/dist/src/driver/paths.js.map +1 -1
- package/dist/src/driver/runtime-lib.d.ts +18 -0
- package/dist/src/driver/runtime-lib.js +31 -0
- package/dist/src/driver/runtime-lib.js.map +1 -0
- package/dist/src/driver/toolchain-download.d.ts +50 -0
- package/dist/src/driver/toolchain-download.js +76 -0
- package/dist/src/driver/toolchain-download.js.map +1 -0
- package/dist/src/driver/toolchain-provider.d.ts +33 -0
- package/dist/src/driver/toolchain-provider.js +71 -0
- package/dist/src/driver/toolchain-provider.js.map +1 -0
- package/dist/src/driver/toolchain.d.ts +9 -4
- package/dist/src/driver/toolchain.js +6 -10
- package/dist/src/driver/toolchain.js.map +1 -1
- package/dist/src/extensions/node/child_process/index.d.ts +4 -2
- package/dist/src/extensions/node/child_process/index.js +4 -2
- package/dist/src/extensions/node/child_process/index.js.map +1 -1
- package/dist/src/extensions/node/events/index.d.ts +10 -0
- package/dist/src/extensions/node/events/index.js +22 -0
- package/dist/src/extensions/node/events/index.js.map +1 -0
- package/dist/src/extensions/node/index.js +6 -0
- package/dist/src/extensions/node/index.js.map +1 -1
- package/dist/src/extensions/node/querystring/index.d.ts +10 -0
- package/dist/src/extensions/node/querystring/index.js +25 -0
- package/dist/src/extensions/node/querystring/index.js.map +1 -0
- package/dist/src/extensions/node/util/index.d.ts +11 -0
- package/dist/src/extensions/node/util/index.js +41 -0
- package/dist/src/extensions/node/util/index.js.map +1 -0
- package/dist/src/extensions/registry.d.ts +6 -0
- package/dist/src/extensions/registry.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/lexer/scanner/identifiers.d.ts +9 -0
- package/dist/src/lexer/scanner/identifiers.js +33 -0
- package/dist/src/lexer/scanner/identifiers.js.map +1 -0
- package/dist/src/lexer/scanner/numbers.d.ts +10 -0
- package/dist/src/lexer/scanner/numbers.js +89 -0
- package/dist/src/lexer/scanner/numbers.js.map +1 -0
- package/dist/src/lexer/scanner/punctuation.d.ts +9 -0
- package/dist/src/lexer/scanner/punctuation.js +151 -0
- package/dist/src/lexer/scanner/punctuation.js.map +1 -0
- package/dist/src/lexer/scanner/regex.d.ts +11 -0
- package/dist/src/lexer/scanner/regex.js +69 -0
- package/dist/src/lexer/scanner/regex.js.map +1 -0
- package/dist/src/lexer/scanner/strings.d.ts +13 -0
- package/dist/src/lexer/scanner/strings.js +118 -0
- package/dist/src/lexer/scanner/strings.js.map +1 -0
- package/dist/src/lexer/scanner.d.ts +20 -27
- package/dist/src/lexer/scanner.js +11 -415
- package/dist/src/lexer/scanner.js.map +1 -1
- package/dist/src/parser/declarations/classes.d.ts +14 -0
- package/dist/src/parser/declarations/classes.js +191 -0
- package/dist/src/parser/declarations/classes.js.map +1 -0
- package/dist/src/parser/declarations/functions.d.ts +17 -0
- package/dist/src/parser/declarations/functions.js +241 -0
- package/dist/src/parser/declarations/functions.js.map +1 -0
- package/dist/src/parser/declarations/type-members.d.ts +16 -0
- package/dist/src/parser/declarations/type-members.js +156 -0
- package/dist/src/parser/declarations/type-members.js.map +1 -0
- package/dist/src/parser/declarations.d.ts +13 -24
- package/dist/src/parser/declarations.js +13 -571
- package/dist/src/parser/declarations.js.map +1 -1
- package/dist/src/parser/helpers.js +13 -4
- package/dist/src/parser/helpers.js.map +1 -1
- package/dist/src/parser/literals.js +10 -1
- package/dist/src/parser/literals.js.map +1 -1
- package/dist/tests/codegen/llvm.test.js +24 -0
- package/dist/tests/codegen/llvm.test.js.map +1 -1
- package/dist/tests/driver/compiler.test.js +3 -0
- package/dist/tests/driver/compiler.test.js.map +1 -1
- package/dist/tests/driver/paths.test.d.ts +1 -0
- package/dist/tests/driver/paths.test.js +26 -0
- package/dist/tests/driver/paths.test.js.map +1 -0
- package/dist/tests/driver/toolchain-download.test.d.ts +1 -0
- package/dist/tests/driver/toolchain-download.test.js +38 -0
- package/dist/tests/driver/toolchain-download.test.js.map +1 -0
- package/dist/tests/driver/toolchain-provider.test.d.ts +1 -0
- package/dist/tests/driver/toolchain-provider.test.js +37 -0
- package/dist/tests/driver/toolchain-provider.test.js.map +1 -0
- package/dist/tests/e2e/compile-node.test.d.ts +7 -0
- package/dist/tests/e2e/compile-node.test.js +123 -0
- package/dist/tests/e2e/compile-node.test.js.map +1 -0
- package/dist/tests/e2e/compile.test.d.ts +4 -1
- package/dist/tests/e2e/compile.test.js +78 -130
- package/dist/tests/e2e/compile.test.js.map +1 -1
- package/dist/tests/e2e/harness.d.ts +36 -0
- package/dist/tests/e2e/harness.js +64 -0
- package/dist/tests/e2e/harness.js.map +1 -0
- package/dist/tests/e2e/node-modules.test.js +60 -0
- package/dist/tests/e2e/node-modules.test.js.map +1 -1
- package/dist/tests/extensions/registry.test.js +4 -0
- package/dist/tests/extensions/registry.test.js.map +1 -1
- package/package.json +5 -3
- package/runtime/ext_node/buffer/buffer.c +12 -552
- package/runtime/ext_node/buffer/parts/byte-access.inc +35 -0
- package/runtime/ext_node/buffer/parts/construction.inc +60 -0
- package/runtime/ext_node/buffer/parts/integer-io.inc +119 -0
- package/runtime/ext_node/buffer/parts/methods.inc +135 -0
- package/runtime/ext_node/buffer/parts/prototype.inc +54 -0
- package/runtime/ext_node/buffer/parts/search.inc +86 -0
- package/runtime/ext_node/buffer/parts/static-api.inc +58 -0
- package/runtime/ext_node/child_process/child_process.c +37 -3
- package/runtime/ext_node/events/events.c +285 -0
- package/runtime/ext_node/http/http.c +11 -736
- package/runtime/ext_node/http/parts/client.inc +290 -0
- package/runtime/ext_node/http/parts/helpers.inc +45 -0
- package/runtime/ext_node/http/parts/prototypes.inc +57 -0
- package/runtime/ext_node/http/parts/response.inc +149 -0
- package/runtime/ext_node/http/parts/server.inc +133 -0
- package/runtime/ext_node/http/parts/string-builder.inc +58 -0
- package/runtime/ext_node/net/net.c +12 -504
- package/runtime/ext_node/net/parts/construction.inc +22 -0
- package/runtime/ext_node/net/parts/platform.inc +60 -0
- package/runtime/ext_node/net/parts/prototypes.inc +35 -0
- package/runtime/ext_node/net/parts/read-loop.inc +58 -0
- package/runtime/ext_node/net/parts/server.inc +131 -0
- package/runtime/ext_node/net/parts/socket-methods.inc +100 -0
- package/runtime/ext_node/net/parts/static-api.inc +93 -0
- package/runtime/ext_node/querystring/querystring.c +251 -0
- package/runtime/ext_node/util/util.c +456 -0
- package/runtime/rt.h +8 -2
- package/runtime/rt_internal.h +34 -0
- package/runtime/xt_bigint/arithmetic.inc +135 -0
- package/runtime/xt_bigint/bits.inc +98 -0
- package/runtime/xt_bigint/bitwise.inc +103 -0
- package/runtime/xt_bigint/compare.inc +30 -0
- package/runtime/xt_bigint/conversions.inc +51 -0
- package/runtime/xt_bigint/division.inc +85 -0
- package/runtime/xt_bigint/format.inc +145 -0
- package/runtime/xt_bigint/helpers.inc +92 -0
- package/runtime/xt_bigint/magnitude.inc +88 -0
- package/runtime/xt_bigint/public.inc +59 -0
- package/runtime/xt_bigint/small-arithmetic.inc +58 -0
- package/runtime/xt_bigint.c +42 -0
- package/runtime/xt_builtins.c +1 -0
- package/runtime/xt_io.c +7 -0
- package/runtime/xt_stdlib/arrays.inc +161 -0
- package/runtime/xt_stdlib/dispatch.inc +116 -0
- package/runtime/xt_stdlib/helpers.inc +23 -0
- package/runtime/xt_stdlib/math.inc +72 -0
- package/runtime/xt_stdlib/strings.inc +178 -0
- package/runtime/xt_stdlib.c +10 -549
- package/runtime/xt_stdlib2/array-statics.inc +37 -0
- package/runtime/xt_stdlib2/arrays.inc +189 -0
- package/runtime/xt_stdlib2/container.inc +23 -0
- package/runtime/xt_stdlib2/date.inc +72 -0
- package/runtime/xt_stdlib2/error.inc +22 -0
- package/runtime/xt_stdlib2/helpers.inc +43 -0
- package/runtime/xt_stdlib2/json.inc +213 -0
- package/runtime/xt_stdlib2/map.inc +95 -0
- package/runtime/xt_stdlib2/number-string-statics.inc +73 -0
- package/runtime/xt_stdlib2/numbers.inc +38 -0
- package/runtime/xt_stdlib2/objects.inc +41 -0
- package/runtime/xt_stdlib2/regexp-match.inc +204 -0
- package/runtime/xt_stdlib2/regexp.inc +20 -0
- package/runtime/xt_stdlib2/set.inc +105 -0
- package/runtime/xt_stdlib2/strings.inc +94 -0
- package/runtime/xt_stdlib2.c +19 -1278
- package/runtime/xt_values.c +155 -12
- package/scripts/build-runtime.ts +109 -0
- package/scripts/fetch-toolchain.ts +101 -0
- package/scripts/package-release.ts +192 -0
- package/src/ast/expressions.ts +2 -0
- package/src/binder/binder.ts +40 -725
- package/src/binder/declarations.ts +203 -0
- package/src/binder/helpers.ts +47 -0
- package/src/binder/references.ts +410 -0
- package/src/binder/types.ts +134 -0
- package/src/cli/main.ts +43 -0
- package/src/codegen/generator/calls/access.ts +139 -0
- package/src/codegen/generator/calls/closures.ts +60 -0
- package/src/codegen/generator/calls/invocation.ts +282 -0
- package/src/codegen/generator/calls/literals.ts +77 -0
- package/src/codegen/generator/calls/super.ts +61 -0
- package/src/codegen/generator/calls.ts +30 -552
- package/src/codegen/generator/context.ts +2 -2
- package/src/codegen/generator/expressions/assignment.ts +226 -0
- package/src/codegen/generator/expressions/operators.ts +182 -0
- package/src/codegen/generator/expressions/primary.ts +304 -0
- package/src/codegen/generator/expressions.ts +22 -553
- package/src/codegen/generator/module.ts +14 -4
- package/src/codegen/generator/state.ts +8 -0
- package/src/codegen/generator/statements/control-flow.ts +225 -0
- package/src/codegen/generator/statements/dispatch.ts +122 -0
- package/src/codegen/generator/statements/loops.ts +173 -0
- package/src/codegen/generator/statements/variables.ts +152 -0
- package/src/codegen/generator/statements.ts +26 -612
- package/src/codegen/generator/tables.ts +7 -0
- package/src/codegen/values.ts +22 -57
- package/src/diagnostics/diagnostic.ts +1 -0
- package/src/diagnostics/source.ts +7 -12
- package/src/driver/compiler.ts +61 -18
- package/src/driver/index.ts +17 -2
- package/src/driver/paths.ts +54 -0
- package/src/driver/runtime-lib.ts +32 -0
- package/src/driver/toolchain-download.ts +108 -0
- package/src/driver/toolchain-provider.ts +91 -0
- package/src/driver/toolchain.ts +29 -11
- package/src/extensions/node/child_process/index.ts +4 -2
- package/src/extensions/node/events/index.ts +27 -0
- package/src/extensions/node/index.ts +6 -0
- package/src/extensions/node/querystring/index.ts +29 -0
- package/src/extensions/node/util/index.ts +48 -0
- package/src/extensions/registry.ts +6 -0
- package/src/index.ts +1 -0
- package/src/lexer/scanner/identifiers.ts +37 -0
- package/src/lexer/scanner/numbers.ts +84 -0
- package/src/lexer/scanner/punctuation.ts +132 -0
- package/src/lexer/scanner/regex.ts +79 -0
- package/src/lexer/scanner/strings.ts +128 -0
- package/src/lexer/scanner.ts +35 -401
- package/src/parser/declarations/classes.ts +215 -0
- package/src/parser/declarations/functions.ts +254 -0
- package/src/parser/declarations/type-members.ts +181 -0
- package/src/parser/declarations.ts +32 -609
- package/src/parser/helpers.ts +13 -6
- package/src/parser/literals.ts +10 -1
- package/scripts/build-runtime.mjs +0 -55
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Node.js `events` module for xbintsc.
|
|
3
|
+
*
|
|
4
|
+
* Provides a standalone `EventEmitter` class backed by the shared emitter in
|
|
5
|
+
* `../node_common.h` (listeners live in an `__xt_events` property and events
|
|
6
|
+
* emitted before a listener exists are buffered until one attaches). On top of
|
|
7
|
+
* the base surface this module adds Node's richer API: `once` with real
|
|
8
|
+
* "remove after firing" semantics, `prependListener` / `prependOnceListener`,
|
|
9
|
+
* `listeners` / `rawListeners`, `listenerCount`, `eventNames`,
|
|
10
|
+
* `removeAllListeners` and the max-listener bookkeeping.
|
|
11
|
+
*
|
|
12
|
+
* `EventEmitter` is exposed both as a global constructor and as a named export
|
|
13
|
+
* of `import { EventEmitter } from "events"`.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
#include "../node_common.h"
|
|
17
|
+
|
|
18
|
+
static xt_value xt_events_proto(void);
|
|
19
|
+
|
|
20
|
+
xt_value xt_event_emitter_ctor(int32_t argc, xt_value *argv) {
|
|
21
|
+
(void)argc;
|
|
22
|
+
(void)argv;
|
|
23
|
+
return xt_object_new_with_proto(xt_events_proto());
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* -- listener queries ----------------------------------------------------- */
|
|
27
|
+
|
|
28
|
+
static xt_value xt_events_method_listeners(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
|
|
29
|
+
(void)env;
|
|
30
|
+
const char *event = xt_node_cstr(xt_arg(argc, argv, 0));
|
|
31
|
+
xt_value result = xt_array_new(0, NULL);
|
|
32
|
+
if (!event) return result;
|
|
33
|
+
xt_value array = xt_node_listeners(thisValue, event, 0);
|
|
34
|
+
if (XT_IS_ARRAY(array)) {
|
|
35
|
+
int32_t count = (int32_t)xt_to_number(xt_array_length(array));
|
|
36
|
+
for (int32_t i = 0; i < count; i++) xt_array_push(result, xt_array_get(array, xt_number((double)i)));
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
static xt_value xt_events_method_listener_count(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
|
|
42
|
+
(void)env;
|
|
43
|
+
const char *event = xt_node_cstr(xt_arg(argc, argv, 0));
|
|
44
|
+
if (!event) return xt_number(0);
|
|
45
|
+
xt_value array = xt_node_listeners(thisValue, event, 0);
|
|
46
|
+
if (!XT_IS_ARRAY(array)) return xt_number(0);
|
|
47
|
+
return xt_number(xt_to_number(xt_array_length(array)));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
static xt_value xt_events_method_event_names(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
|
|
51
|
+
(void)env;
|
|
52
|
+
(void)argc;
|
|
53
|
+
(void)argv;
|
|
54
|
+
xt_value result = xt_array_new(0, NULL);
|
|
55
|
+
xt_value map = xt_node_event_map(thisValue, 0);
|
|
56
|
+
if (!XT_IS_OBJECT(map)) return result;
|
|
57
|
+
xt_value keys = xt_object_keys(map);
|
|
58
|
+
int32_t count = (int32_t)xt_to_number(xt_array_length(keys));
|
|
59
|
+
for (int32_t i = 0; i < count; i++) {
|
|
60
|
+
xt_value key = xt_array_get(keys, xt_number((double)i));
|
|
61
|
+
const char *event = xt_string_data(xt_to_string(key));
|
|
62
|
+
xt_value listeners = xt_node_listeners(thisValue, event, 0);
|
|
63
|
+
if (XT_IS_ARRAY(listeners) && xt_to_number(xt_array_length(listeners)) > 0) xt_array_push(result, key);
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
static xt_value xt_events_method_remove_all(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
|
|
69
|
+
(void)env;
|
|
70
|
+
xt_value event = xt_arg(argc, argv, 0);
|
|
71
|
+
if (argc == 0 || xt_truthy(xt_is_nullish(event))) {
|
|
72
|
+
xt_node_set(thisValue, "__xt_events", xt_object_new());
|
|
73
|
+
xt_node_set(thisValue, "__xt_pending", xt_object_new());
|
|
74
|
+
return thisValue;
|
|
75
|
+
}
|
|
76
|
+
const char *name = xt_node_cstr(event);
|
|
77
|
+
if (name) {
|
|
78
|
+
xt_value map = xt_node_event_map(thisValue, 1);
|
|
79
|
+
xt_object_set(map, xt_string_from_cstr(name), xt_array_new(0, NULL));
|
|
80
|
+
}
|
|
81
|
+
return thisValue;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/* -- max listeners -------------------------------------------------------- */
|
|
85
|
+
|
|
86
|
+
static xt_value xt_events_method_set_max(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
|
|
87
|
+
(void)env;
|
|
88
|
+
xt_node_set(thisValue, "__max_listeners", xt_arg(argc, argv, 0));
|
|
89
|
+
return thisValue;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
static xt_value xt_events_method_get_max(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
|
|
93
|
+
(void)env;
|
|
94
|
+
(void)argc;
|
|
95
|
+
(void)argv;
|
|
96
|
+
xt_value value = xt_object_get_cstr(thisValue, "__max_listeners");
|
|
97
|
+
if (xt_truthy(xt_is_nullish(value))) return xt_number(10);
|
|
98
|
+
return value;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* -- prepend -------------------------------------------------------------- */
|
|
102
|
+
|
|
103
|
+
static void xt_events_prepend(xt_value target, const char *event, xt_value fn) {
|
|
104
|
+
xt_value existing = xt_node_listeners(target, event, 1);
|
|
105
|
+
xt_value rebuilt = xt_array_new(1, &fn);
|
|
106
|
+
int32_t count = (int32_t)xt_to_number(xt_array_length(existing));
|
|
107
|
+
for (int32_t i = 0; i < count; i++) xt_array_push(rebuilt, xt_array_get(existing, xt_number((double)i)));
|
|
108
|
+
xt_value map = xt_node_event_map(target, 1);
|
|
109
|
+
xt_object_set(map, xt_string_from_cstr(event), rebuilt);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
static xt_value xt_events_method_prepend(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
|
|
113
|
+
(void)env;
|
|
114
|
+
const char *event = xt_node_cstr(xt_arg(argc, argv, 0));
|
|
115
|
+
xt_value fn = xt_arg(argc, argv, 1);
|
|
116
|
+
if (event && XT_IS_FUNCTION(fn)) {
|
|
117
|
+
xt_events_prepend(thisValue, event, fn);
|
|
118
|
+
xt_node_flush(thisValue, event);
|
|
119
|
+
}
|
|
120
|
+
return thisValue;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* -- once ----------------------------------------------------------------- */
|
|
124
|
+
|
|
125
|
+
/* Drop the once-wrapper carrying `token` from `event`'s listeners. */
|
|
126
|
+
static void xt_events_remove_token(xt_value target, const char *event, xt_value token) {
|
|
127
|
+
xt_value array = xt_node_listeners(target, event, 0);
|
|
128
|
+
if (!XT_IS_ARRAY(array)) return;
|
|
129
|
+
xt_value kept = xt_array_new(0, NULL);
|
|
130
|
+
int32_t count = (int32_t)xt_to_number(xt_array_length(array));
|
|
131
|
+
for (int32_t i = 0; i < count; i++) {
|
|
132
|
+
xt_value item = xt_array_get(array, xt_number((double)i));
|
|
133
|
+
if (xt_node_get(item, "__xt_once_token") == token) continue;
|
|
134
|
+
xt_array_push(kept, item);
|
|
135
|
+
}
|
|
136
|
+
xt_value map = xt_node_event_map(target, 1);
|
|
137
|
+
xt_object_set(map, xt_string_from_cstr(event), kept);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
static xt_value xt_events_once_callback(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
|
|
141
|
+
(void)thisValue;
|
|
142
|
+
xt_value target = xt_closure_env(env, 0);
|
|
143
|
+
xt_value original = xt_closure_env(env, 1);
|
|
144
|
+
xt_value eventValue = xt_closure_env(env, 2);
|
|
145
|
+
xt_value token = xt_closure_env(env, 3);
|
|
146
|
+
const char *event = xt_string_data(xt_to_string(eventValue));
|
|
147
|
+
if (event) xt_events_remove_token(target, event, token);
|
|
148
|
+
if (XT_IS_FUNCTION(original)) return xt_call_with_this(original, target, argc, argv);
|
|
149
|
+
return xt_undefined();
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* Register `fn` so it fires at most once; `prepend` controls its position.
|
|
153
|
+
The wrapper identifies itself for removal through a shared marker object,
|
|
154
|
+
since a closure cannot hold a reference to itself. */
|
|
155
|
+
static xt_value xt_events_once_impl(xt_value target, const char *event, xt_value fn, int prepend) {
|
|
156
|
+
xt_value eventValue = xt_string_from_cstr(event);
|
|
157
|
+
xt_value token = xt_object_new();
|
|
158
|
+
xt_value env[4] = {target, fn, eventValue, token};
|
|
159
|
+
xt_value wrapper = xt_closure_new((void *)xt_events_once_callback, 4, env);
|
|
160
|
+
xt_node_set(wrapper, "__xt_once_token", token);
|
|
161
|
+
if (prepend) {
|
|
162
|
+
xt_events_prepend(target, event, wrapper);
|
|
163
|
+
} else {
|
|
164
|
+
xt_value array = xt_node_listeners(target, event, 1);
|
|
165
|
+
xt_array_push(array, wrapper);
|
|
166
|
+
}
|
|
167
|
+
xt_node_flush(target, event);
|
|
168
|
+
return target;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
static xt_value xt_events_method_once(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
|
|
172
|
+
(void)env;
|
|
173
|
+
const char *event = xt_node_cstr(xt_arg(argc, argv, 0));
|
|
174
|
+
xt_value fn = xt_arg(argc, argv, 1);
|
|
175
|
+
if (event && XT_IS_FUNCTION(fn)) xt_events_once_impl(thisValue, event, fn, 0);
|
|
176
|
+
return thisValue;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
static xt_value xt_events_method_prepend_once(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
|
|
180
|
+
(void)env;
|
|
181
|
+
const char *event = xt_node_cstr(xt_arg(argc, argv, 0));
|
|
182
|
+
xt_value fn = xt_arg(argc, argv, 1);
|
|
183
|
+
if (event && XT_IS_FUNCTION(fn)) xt_events_once_impl(thisValue, event, fn, 1);
|
|
184
|
+
return thisValue;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/* -- statics -------------------------------------------------------------- */
|
|
188
|
+
|
|
189
|
+
/* `events.once(emitter, name)` returns a Promise that resolves on the next
|
|
190
|
+
emission of `name`. */
|
|
191
|
+
static xt_value xt_events_once_promise_resolve(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
|
|
192
|
+
(void)thisValue;
|
|
193
|
+
xt_value resolve = xt_closure_env(env, 0);
|
|
194
|
+
xt_value value = xt_arg(argc, argv, 0);
|
|
195
|
+
if (XT_IS_FUNCTION(resolve)) xt_closure_call(resolve, 1, &value);
|
|
196
|
+
return xt_undefined();
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
static xt_value xt_events_once_promise_executor(xt_value thisValue, xt_value env, int32_t argc, xt_value *argv) {
|
|
200
|
+
(void)thisValue;
|
|
201
|
+
xt_value emitter = xt_closure_env(env, 0);
|
|
202
|
+
xt_value event = xt_closure_env(env, 1);
|
|
203
|
+
xt_value resolve = xt_arg(argc, argv, 0);
|
|
204
|
+
xt_value resolveEnv[1] = {resolve};
|
|
205
|
+
xt_value listener = xt_closure_new((void *)xt_events_once_promise_resolve, 1, resolveEnv);
|
|
206
|
+
const char *name = xt_string_data(xt_to_string(event));
|
|
207
|
+
if (name) xt_events_once_impl(emitter, name, listener, 0);
|
|
208
|
+
return xt_undefined();
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/* `EventEmitter.listenerCount(emitter, event)` etc. */
|
|
212
|
+
xt_value xt_events_static(xt_value name, int32_t argc, xt_value *argv) {
|
|
213
|
+
const char *fn = xt_string_data(name);
|
|
214
|
+
if (!fn) return xt_undefined();
|
|
215
|
+
if (strcmp(fn, "listenerCount") == 0) {
|
|
216
|
+
xt_value emitter = xt_arg(argc, argv, 0);
|
|
217
|
+
const char *event = xt_node_cstr(xt_arg(argc, argv, 1));
|
|
218
|
+
if (!event) return xt_number(0);
|
|
219
|
+
xt_value array = xt_node_listeners(emitter, event, 0);
|
|
220
|
+
if (!XT_IS_ARRAY(array)) return xt_number(0);
|
|
221
|
+
return xt_number(xt_to_number(xt_array_length(array)));
|
|
222
|
+
}
|
|
223
|
+
if (strcmp(fn, "getEventListeners") == 0) {
|
|
224
|
+
xt_value emitter = xt_arg(argc, argv, 0);
|
|
225
|
+
xt_value result = xt_array_new(0, NULL);
|
|
226
|
+
const char *event = xt_node_cstr(xt_arg(argc, argv, 1));
|
|
227
|
+
if (!event) return result;
|
|
228
|
+
xt_value array = xt_node_listeners(emitter, event, 0);
|
|
229
|
+
if (XT_IS_ARRAY(array)) {
|
|
230
|
+
int32_t count = (int32_t)xt_to_number(xt_array_length(array));
|
|
231
|
+
for (int32_t i = 0; i < count; i++) xt_array_push(result, xt_array_get(array, xt_number((double)i)));
|
|
232
|
+
}
|
|
233
|
+
return result;
|
|
234
|
+
}
|
|
235
|
+
if (strcmp(fn, "getMaxListeners") == 0) {
|
|
236
|
+
xt_value emitter = xt_arg(argc, argv, 0);
|
|
237
|
+
xt_value value = xt_object_get_cstr(emitter, "__max_listeners");
|
|
238
|
+
if (xt_truthy(xt_is_nullish(value))) return xt_number(10);
|
|
239
|
+
return value;
|
|
240
|
+
}
|
|
241
|
+
if (strcmp(fn, "setMaxListeners") == 0) {
|
|
242
|
+
xt_value emitter = xt_arg(argc, argv, 0);
|
|
243
|
+
xt_node_set(emitter, "__max_listeners", xt_arg(argc, argv, 1));
|
|
244
|
+
return emitter;
|
|
245
|
+
}
|
|
246
|
+
if (strcmp(fn, "once") == 0) {
|
|
247
|
+
xt_value emitter = xt_arg(argc, argv, 0);
|
|
248
|
+
xt_value event = xt_arg(argc, argv, 1);
|
|
249
|
+
xt_value env[2] = {emitter, event};
|
|
250
|
+
xt_value executor = xt_closure_new((void *)xt_events_once_promise_executor, 2, env);
|
|
251
|
+
xt_value ctorArgs[1] = {executor};
|
|
252
|
+
return xt_promise_ctor(1, ctorArgs);
|
|
253
|
+
}
|
|
254
|
+
if (strcmp(fn, "addAbortListener") == 0) {
|
|
255
|
+
xt_value signal = xt_arg(argc, argv, 0);
|
|
256
|
+
xt_value listener = xt_arg(argc, argv, 1);
|
|
257
|
+
if (XT_IS_OBJECT(signal)) {
|
|
258
|
+
xt_value array = xt_node_listeners(signal, "abort", 1);
|
|
259
|
+
if (XT_IS_FUNCTION(listener)) xt_array_push(array, listener);
|
|
260
|
+
}
|
|
261
|
+
return XT_UNDEFINED;
|
|
262
|
+
}
|
|
263
|
+
return xt_undefined();
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/* -- prototype ------------------------------------------------------------ */
|
|
267
|
+
|
|
268
|
+
static xt_value xt_events_proto(void) {
|
|
269
|
+
static xt_value proto = 0;
|
|
270
|
+
if (proto) return proto;
|
|
271
|
+
proto = xt_object_new();
|
|
272
|
+
xt_node_install_emitter(proto);
|
|
273
|
+
/* Override the default emitter surface with the fuller `events` behaviour. */
|
|
274
|
+
xt_node_define_method(proto, "once", (void *)xt_events_method_once);
|
|
275
|
+
xt_node_define_method(proto, "prependListener", (void *)xt_events_method_prepend);
|
|
276
|
+
xt_node_define_method(proto, "prependOnceListener", (void *)xt_events_method_prepend_once);
|
|
277
|
+
xt_node_define_method(proto, "listeners", (void *)xt_events_method_listeners);
|
|
278
|
+
xt_node_define_method(proto, "rawListeners", (void *)xt_events_method_listeners);
|
|
279
|
+
xt_node_define_method(proto, "listenerCount", (void *)xt_events_method_listener_count);
|
|
280
|
+
xt_node_define_method(proto, "eventNames", (void *)xt_events_method_event_names);
|
|
281
|
+
xt_node_define_method(proto, "removeAllListeners", (void *)xt_events_method_remove_all);
|
|
282
|
+
xt_node_define_method(proto, "setMaxListeners", (void *)xt_events_method_set_max);
|
|
283
|
+
xt_node_define_method(proto, "getMaxListeners", (void *)xt_events_method_get_max);
|
|
284
|
+
return proto;
|
|
285
|
+
}
|