@ugo-studio/jspp 0.2.8 → 0.3.0

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 (46) hide show
  1. package/dist/analysis/typeAnalyzer.js +42 -27
  2. package/dist/core/codegen/class-handlers.js +6 -6
  3. package/dist/core/codegen/control-flow-handlers.js +4 -4
  4. package/dist/core/codegen/declaration-handlers.js +21 -3
  5. package/dist/core/codegen/destructuring-handlers.js +187 -0
  6. package/dist/core/codegen/expression-handlers.js +7 -0
  7. package/dist/core/codegen/function-handlers.js +58 -36
  8. package/dist/core/codegen/helpers.js +288 -52
  9. package/dist/core/codegen/index.js +7 -4
  10. package/dist/core/codegen/statement-handlers.js +43 -23
  11. package/package.json +1 -1
  12. package/scripts/precompile-headers.ts +13 -5
  13. package/src/prelude/any_value.hpp +362 -361
  14. package/src/prelude/any_value_access.hpp +170 -170
  15. package/src/prelude/any_value_defines.hpp +189 -189
  16. package/src/prelude/any_value_helpers.hpp +374 -365
  17. package/src/prelude/library/array.hpp +185 -185
  18. package/src/prelude/library/console.hpp +111 -111
  19. package/src/prelude/library/error.hpp +112 -112
  20. package/src/prelude/library/function.hpp +10 -10
  21. package/src/prelude/library/math.hpp +307 -307
  22. package/src/prelude/library/object.hpp +275 -275
  23. package/src/prelude/library/performance.hpp +1 -1
  24. package/src/prelude/library/process.hpp +39 -39
  25. package/src/prelude/library/promise.hpp +123 -123
  26. package/src/prelude/library/symbol.hpp +52 -52
  27. package/src/prelude/library/timer.hpp +91 -91
  28. package/src/prelude/types.hpp +178 -178
  29. package/src/prelude/utils/access.hpp +411 -393
  30. package/src/prelude/utils/operators.hpp +336 -329
  31. package/src/prelude/values/array.hpp +0 -1
  32. package/src/prelude/values/async_iterator.hpp +83 -81
  33. package/src/prelude/values/function.hpp +82 -82
  34. package/src/prelude/values/helpers/array.hpp +198 -208
  35. package/src/prelude/values/helpers/async_iterator.hpp +275 -271
  36. package/src/prelude/values/helpers/function.hpp +108 -108
  37. package/src/prelude/values/helpers/iterator.hpp +144 -107
  38. package/src/prelude/values/helpers/promise.hpp +253 -253
  39. package/src/prelude/values/helpers/string.hpp +37 -47
  40. package/src/prelude/values/iterator.hpp +32 -5
  41. package/src/prelude/values/promise.hpp +72 -72
  42. package/src/prelude/values/prototypes/array.hpp +54 -42
  43. package/src/prelude/values/prototypes/iterator.hpp +201 -74
  44. package/src/prelude/values/prototypes/promise.hpp +196 -196
  45. package/src/prelude/values/prototypes/string.hpp +564 -542
  46. package/src/prelude/values/string.hpp +25 -26
@@ -1,39 +1,39 @@
1
- #pragma once
2
-
3
- #include "types.hpp"
4
- #include "any_value.hpp"
5
-
6
- #ifdef _WIN32
7
- #define JSPP_PLATFORM "win32"
8
- #else
9
- #define JSPP_PLATFORM "linux"
10
- #endif
11
-
12
- inline auto process = jspp::AnyValue::make_object({
13
- {"argv", jspp::AnyValue::make_array(std::vector<jspp::AnyValue>{})},
14
- {"env", jspp::AnyValue::make_object({})},
15
- {"platform", jspp::AnyValue::make_string(JSPP_PLATFORM)},
16
- {"exit", jspp::AnyValue::make_function([](const jspp::AnyValue&, std::span<const jspp::AnyValue> args) -> jspp::AnyValue {
17
- int code = 0;
18
- if (!args.empty() && args[0].is_number()) {
19
- code = static_cast<int>(args[0].as_double());
20
- }
21
- std::exit(code);
22
- return jspp::Constants::UNDEFINED;
23
- }, "exit")}
24
- });
25
-
26
- namespace jspp {
27
- inline void setup_process_argv(int argc, char** argv) {
28
- std::vector<jspp::AnyValue> args;
29
- if (argc > 0) {
30
- args.push_back(jspp::AnyValue::make_string(argv[0]));
31
- args.push_back(jspp::AnyValue::make_string("index.js"));
32
- for (int i = 1; i < argc; ++i) {
33
- args.push_back(jspp::AnyValue::make_string(argv[i]));
34
- }
35
- }
36
- process.set_own_property("argv", jspp::AnyValue::make_array(std::move(args)));
37
- }
38
- }
39
-
1
+ #pragma once
2
+
3
+ #include "types.hpp"
4
+ #include "any_value.hpp"
5
+
6
+ #ifdef _WIN32
7
+ #define JSPP_PLATFORM "win32"
8
+ #else
9
+ #define JSPP_PLATFORM "linux"
10
+ #endif
11
+
12
+ inline auto process = jspp::AnyValue::make_object({
13
+ {"argv", jspp::AnyValue::make_array(std::vector<jspp::AnyValue>{})},
14
+ {"env", jspp::AnyValue::make_object({})},
15
+ {"platform", jspp::AnyValue::make_string(JSPP_PLATFORM)},
16
+ {"exit", jspp::AnyValue::make_function([](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue {
17
+ int code = 0;
18
+ if (!args.empty() && args[0].is_number()) {
19
+ code = static_cast<int>(args[0].as_double());
20
+ }
21
+ std::exit(code);
22
+ return jspp::Constants::UNDEFINED;
23
+ }, "exit")}
24
+ });
25
+
26
+ namespace jspp {
27
+ inline void setup_process_argv(int argc, char** argv) {
28
+ std::vector<jspp::AnyValue> args;
29
+ if (argc > 0) {
30
+ args.push_back(jspp::AnyValue::make_string(argv[0]));
31
+ args.push_back(jspp::AnyValue::make_string("index.js"));
32
+ for (int i = 1; i < argc; ++i) {
33
+ args.push_back(jspp::AnyValue::make_string(argv[i]));
34
+ }
35
+ }
36
+ process.set_own_property("argv", jspp::AnyValue::make_array(std::move(args)));
37
+ }
38
+ }
39
+
@@ -1,123 +1,123 @@
1
- #pragma once
2
-
3
- #include "types.hpp"
4
- #include "values/promise.hpp"
5
- #include "any_value.hpp"
6
- #include "exception.hpp"
7
-
8
- inline auto Promise = jspp::AnyValue::make_function([](const jspp::AnyValue &thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
9
- {
10
- if (args.empty() || !args[0].is_function())
11
- {
12
- throw jspp::Exception::make_exception("Promise resolver undefined is not a function", "TypeError");
13
- }
14
- auto executor = args[0].as_function();
15
-
16
- jspp::JsPromise promise;
17
- auto state = promise.state; // Share state
18
-
19
- // resolve function
20
- auto resolveFn = jspp::AnyValue::make_function([state](const jspp::AnyValue &, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
21
- {
22
- jspp::JsPromise p; p.state = state;
23
- p.resolve(args.empty() ? jspp::Constants::UNDEFINED : args[0]);
24
- return jspp::Constants::UNDEFINED; }, "resolve");
25
-
26
- // reject function
27
- auto rejectFn = jspp::AnyValue::make_function([state](const jspp::AnyValue &, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
28
- {
29
- jspp::JsPromise p; p.state = state;
30
- p.reject(args.empty() ? jspp::Constants::UNDEFINED : args[0]);
31
- return jspp::Constants::UNDEFINED; }, "reject");
32
-
33
- try
34
- {
35
- const jspp::AnyValue executorArgs[] = {resolveFn, rejectFn};
36
- executor->call(jspp::Constants::UNDEFINED, std::span<const jspp::AnyValue>(executorArgs, 2));
37
- }
38
- catch (const jspp::Exception &e)
39
- {
40
- promise.reject(e.data);
41
- }
42
- catch (...)
43
- {
44
- promise.reject(jspp::AnyValue::make_string("Unknown error during Promise execution"));
45
- }
46
-
47
- return jspp::AnyValue::make_promise(promise); },
48
- "Promise");
49
-
50
- struct PromiseInit
51
- {
52
- PromiseInit()
53
- {
54
- // Promise.resolve(value)
55
- Promise.define_data_property("resolve", jspp::AnyValue::make_function([](const jspp::AnyValue &, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
56
- {
57
- jspp::JsPromise p;
58
- p.resolve(args.empty() ? jspp::Constants::UNDEFINED : args[0]);
59
- return jspp::AnyValue::make_promise(p); }, "resolve"));
60
-
61
- // Promise.reject(reason)
62
- Promise.define_data_property("reject", jspp::AnyValue::make_function([](const jspp::AnyValue &, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
63
- {
64
- jspp::JsPromise p;
65
- p.reject(args.empty() ? jspp::Constants::UNDEFINED : args[0]);
66
- return jspp::AnyValue::make_promise(p); }, "reject"));
67
-
68
- // Promise.all(iterable)
69
- Promise.define_data_property("all", jspp::AnyValue::make_function([](const jspp::AnyValue &, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
70
- {
71
- // Handle non-array iterable or empty args
72
- if (args.empty() || !args[0].is_array()) {
73
- jspp::JsPromise p; p.reject(jspp::AnyValue::make_string("Promise.all argument must be an array"));
74
- return jspp::AnyValue::make_promise(p);
75
- }
76
-
77
- auto arr = args[0].as_array();
78
- size_t len = static_cast<size_t>(arr->length);
79
- if (len == 0) {
80
- jspp::JsPromise p; p.resolve(jspp::AnyValue::make_array(std::vector<jspp::AnyValue>()));
81
- return jspp::AnyValue::make_promise(p);
82
- }
83
-
84
- jspp::JsPromise masterPromise;
85
- auto masterState = masterPromise.state;
86
-
87
- auto results = std::make_shared<std::vector<jspp::AnyValue>>(len, jspp::Constants::UNDEFINED);
88
- auto count = std::make_shared<size_t>(len);
89
-
90
- // Check if already rejected to avoid further processing
91
- auto rejected = std::make_shared<bool>(false);
92
-
93
- for (size_t i = 0; i < len; ++i) {
94
- jspp::AnyValue item = arr->get_property(static_cast<uint32_t>(i));
95
-
96
- auto handleResult = [masterState, results, count, i, rejected](const jspp::AnyValue& res) {
97
- if (*rejected) return;
98
- (*results)[i] = res;
99
- (*count)--;
100
- if (*count == 0) {
101
- jspp::JsPromise p; p.state = masterState;
102
- p.resolve(jspp::AnyValue::make_array(std::move(*results)));
103
- }
104
- };
105
-
106
- auto handleReject = [masterState, rejected](const jspp::AnyValue& reason) {
107
- if (*rejected) return;
108
- *rejected = true;
109
- jspp::JsPromise p; p.state = masterState;
110
- masterState->status =jspp::PromiseStatus::Rejected; // ensure master state updated
111
- p.reject(reason);
112
- };
113
-
114
- if (item.is_promise()) {
115
- item.as_promise()->then(handleResult, handleReject);
116
- } else {
117
- handleResult(item);
118
- }
119
- }
120
-
121
- return jspp::AnyValue::make_promise(masterPromise); }, "all"));
122
- }
123
- } promiseInit;
1
+ #pragma once
2
+
3
+ #include "types.hpp"
4
+ #include "values/promise.hpp"
5
+ #include "any_value.hpp"
6
+ #include "exception.hpp"
7
+
8
+ inline auto Promise = jspp::AnyValue::make_function([](jspp::AnyValue thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
9
+ {
10
+ if (args.empty() || !args[0].is_function())
11
+ {
12
+ throw jspp::Exception::make_exception("Promise resolver undefined is not a function", "TypeError");
13
+ }
14
+ auto executor = args[0].as_function();
15
+
16
+ jspp::JsPromise promise;
17
+ auto state = promise.state; // Share state
18
+
19
+ // resolve function
20
+ auto resolveFn = jspp::AnyValue::make_function([state](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
21
+ {
22
+ jspp::JsPromise p; p.state = state;
23
+ p.resolve(args.empty() ? jspp::Constants::UNDEFINED : args[0]);
24
+ return jspp::Constants::UNDEFINED; }, "resolve");
25
+
26
+ // reject function
27
+ auto rejectFn = jspp::AnyValue::make_function([state](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
28
+ {
29
+ jspp::JsPromise p; p.state = state;
30
+ p.reject(args.empty() ? jspp::Constants::UNDEFINED : args[0]);
31
+ return jspp::Constants::UNDEFINED; }, "reject");
32
+
33
+ try
34
+ {
35
+ const jspp::AnyValue executorArgs[] = {resolveFn, rejectFn};
36
+ executor->call(jspp::Constants::UNDEFINED, std::span<const jspp::AnyValue>(executorArgs, 2));
37
+ }
38
+ catch (const jspp::Exception &e)
39
+ {
40
+ promise.reject(e.data);
41
+ }
42
+ catch (...)
43
+ {
44
+ promise.reject(jspp::AnyValue::make_string("Unknown error during Promise execution"));
45
+ }
46
+
47
+ return jspp::AnyValue::make_promise(promise); },
48
+ "Promise");
49
+
50
+ struct PromiseInit
51
+ {
52
+ PromiseInit()
53
+ {
54
+ // Promise.resolve(value)
55
+ Promise.define_data_property("resolve", jspp::AnyValue::make_function([](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
56
+ {
57
+ jspp::JsPromise p;
58
+ p.resolve(args.empty() ? jspp::Constants::UNDEFINED : args[0]);
59
+ return jspp::AnyValue::make_promise(p); }, "resolve"));
60
+
61
+ // Promise.reject(reason)
62
+ Promise.define_data_property("reject", jspp::AnyValue::make_function([](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
63
+ {
64
+ jspp::JsPromise p;
65
+ p.reject(args.empty() ? jspp::Constants::UNDEFINED : args[0]);
66
+ return jspp::AnyValue::make_promise(p); }, "reject"));
67
+
68
+ // Promise.all(iterable)
69
+ Promise.define_data_property("all", jspp::AnyValue::make_function([](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
70
+ {
71
+ // Handle non-array iterable or empty args
72
+ if (args.empty() || !args[0].is_array()) {
73
+ jspp::JsPromise p; p.reject(jspp::AnyValue::make_string("Promise.all argument must be an array"));
74
+ return jspp::AnyValue::make_promise(p);
75
+ }
76
+
77
+ auto arr = args[0].as_array();
78
+ size_t len = static_cast<size_t>(arr->length);
79
+ if (len == 0) {
80
+ jspp::JsPromise p; p.resolve(jspp::AnyValue::make_array(std::vector<jspp::AnyValue>()));
81
+ return jspp::AnyValue::make_promise(p);
82
+ }
83
+
84
+ jspp::JsPromise masterPromise;
85
+ auto masterState = masterPromise.state;
86
+
87
+ auto results = std::make_shared<std::vector<jspp::AnyValue>>(len, jspp::Constants::UNDEFINED);
88
+ auto count = std::make_shared<size_t>(len);
89
+
90
+ // Check if already rejected to avoid further processing
91
+ auto rejected = std::make_shared<bool>(false);
92
+
93
+ for (size_t i = 0; i < len; ++i) {
94
+ jspp::AnyValue item = arr->get_property(static_cast<uint32_t>(i));
95
+
96
+ auto handleResult = [masterState, results, count, i, rejected](jspp::AnyValue res) {
97
+ if (*rejected) return;
98
+ (*results)[i] = res;
99
+ (*count)--;
100
+ if (*count == 0) {
101
+ jspp::JsPromise p; p.state = masterState;
102
+ p.resolve(jspp::AnyValue::make_array(std::move(*results)));
103
+ }
104
+ };
105
+
106
+ auto handleReject = [masterState, rejected](jspp::AnyValue reason) {
107
+ if (*rejected) return;
108
+ *rejected = true;
109
+ jspp::JsPromise p; p.state = masterState;
110
+ masterState->status =jspp::PromiseStatus::Rejected; // ensure master state updated
111
+ p.reject(reason);
112
+ };
113
+
114
+ if (item.is_promise()) {
115
+ item.as_promise()->then(handleResult, handleReject);
116
+ } else {
117
+ handleResult(item);
118
+ }
119
+ }
120
+
121
+ return jspp::AnyValue::make_promise(masterPromise); }, "all"));
122
+ }
123
+ } promiseInit;
@@ -1,52 +1,52 @@
1
- #pragma once
2
-
3
- #include "types.hpp"
4
- #include "utils/well_known_symbols.hpp"
5
- #include "values/object.hpp"
6
- #include "any_value.hpp"
7
-
8
- // Define Symbol as a function
9
- inline auto Symbol = jspp::AnyValue::make_function([](const jspp::AnyValue &thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
10
- {
11
- std::string description = "";
12
- if (!args.empty() && !args[0].is_undefined()) {
13
- description = args[0].to_std_string();
14
- }
15
- return jspp::AnyValue::make_symbol(description); }, "Symbol", false);
16
-
17
- // Initialize Symbol properties
18
- struct SymbolInit
19
- {
20
- SymbolInit()
21
- {
22
- // Static methods
23
- Symbol.define_data_property("for", jspp::AnyValue::make_function([](const jspp::AnyValue &, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
24
- {
25
- std::string key = "";
26
- if (!args.empty()) key = args[0].to_std_string();
27
- return jspp::AnyValue::from_symbol(jspp::JsSymbol::for_global(key)); }, "for"));
28
-
29
- Symbol.define_data_property("keyFor", jspp::AnyValue::make_function([](const jspp::AnyValue &, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
30
- {
31
- if (args.empty() || !args[0].is_symbol()) throw jspp::Exception::make_exception("Symbol.keyFor requires a symbol", "TypeError");
32
- auto sym = args[0].as_symbol();
33
- auto key = jspp::JsSymbol::key_for(sym);
34
- if (key.has_value()) return jspp::AnyValue::make_string(key.value());
35
- return jspp::Constants::UNDEFINED; }, "keyFor"));
36
-
37
- // Well-known symbols
38
- Symbol.define_data_property("iterator", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::iterator), false, false, false);
39
- Symbol.define_data_property("asyncIterator", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::asyncIterator), false, false, false);
40
- Symbol.define_data_property("hasInstance", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::hasInstance), false, false, false);
41
- Symbol.define_data_property("isConcatSpreadable", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::isConcatSpreadable), false, false, false);
42
- Symbol.define_data_property("match", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::match), false, false, false);
43
- Symbol.define_data_property("matchAll", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::matchAll), false, false, false);
44
- Symbol.define_data_property("replace", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::replace), false, false, false);
45
- Symbol.define_data_property("search", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::search), false, false, false);
46
- Symbol.define_data_property("species", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::species), false, false, false);
47
- Symbol.define_data_property("split", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::split), false, false, false);
48
- Symbol.define_data_property("toPrimitive", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::toPrimitive), false, false, false);
49
- Symbol.define_data_property("toStringTag", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::toStringTag), false, false, false);
50
- Symbol.define_data_property("unscopables", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::unscopables), false, false, false);
51
- }
52
- } symbolInit;
1
+ #pragma once
2
+
3
+ #include "types.hpp"
4
+ #include "utils/well_known_symbols.hpp"
5
+ #include "values/object.hpp"
6
+ #include "any_value.hpp"
7
+
8
+ // Define Symbol as a function
9
+ inline auto Symbol = jspp::AnyValue::make_function([](jspp::AnyValue thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
10
+ {
11
+ std::string description = "";
12
+ if (!args.empty() && !args[0].is_undefined()) {
13
+ description = args[0].to_std_string();
14
+ }
15
+ return jspp::AnyValue::make_symbol(description); }, "Symbol", false);
16
+
17
+ // Initialize Symbol properties
18
+ struct SymbolInit
19
+ {
20
+ SymbolInit()
21
+ {
22
+ // Static methods
23
+ Symbol.define_data_property("for", jspp::AnyValue::make_function([](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
24
+ {
25
+ std::string key = "";
26
+ if (!args.empty()) key = args[0].to_std_string();
27
+ return jspp::AnyValue::from_symbol(jspp::JsSymbol::for_global(key)); }, "for"));
28
+
29
+ Symbol.define_data_property("keyFor", jspp::AnyValue::make_function([](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
30
+ {
31
+ if (args.empty() || !args[0].is_symbol()) throw jspp::Exception::make_exception("Symbol.keyFor requires a symbol", "TypeError");
32
+ auto sym = args[0].as_symbol();
33
+ auto key = jspp::JsSymbol::key_for(sym);
34
+ if (key.has_value()) return jspp::AnyValue::make_string(key.value());
35
+ return jspp::Constants::UNDEFINED; }, "keyFor"));
36
+
37
+ // Well-known symbols
38
+ Symbol.define_data_property("iterator", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::iterator), false, false, false);
39
+ Symbol.define_data_property("asyncIterator", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::asyncIterator), false, false, false);
40
+ Symbol.define_data_property("hasInstance", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::hasInstance), false, false, false);
41
+ Symbol.define_data_property("isConcatSpreadable", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::isConcatSpreadable), false, false, false);
42
+ Symbol.define_data_property("match", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::match), false, false, false);
43
+ Symbol.define_data_property("matchAll", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::matchAll), false, false, false);
44
+ Symbol.define_data_property("replace", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::replace), false, false, false);
45
+ Symbol.define_data_property("search", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::search), false, false, false);
46
+ Symbol.define_data_property("species", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::species), false, false, false);
47
+ Symbol.define_data_property("split", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::split), false, false, false);
48
+ Symbol.define_data_property("toPrimitive", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::toPrimitive), false, false, false);
49
+ Symbol.define_data_property("toStringTag", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::toStringTag), false, false, false);
50
+ Symbol.define_data_property("unscopables", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::unscopables), false, false, false);
51
+ }
52
+ } symbolInit;
@@ -1,92 +1,92 @@
1
- #pragma once
2
-
3
- #include "types.hpp"
4
- #include "any_value.hpp"
5
- #include "scheduler.hpp"
6
- #include "values/function.hpp"
7
- #include "exception.hpp"
8
-
9
- // setTimeout(callback, delay, ...args)
10
- inline auto setTimeout = jspp::AnyValue::make_function([](const jspp::AnyValue& thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue {
11
- if (args.empty() || !args[0].is_function()) {
12
- throw jspp::Exception::make_exception("Callback must be a function", "TypeError");
13
- }
14
-
15
- auto callback = args[0];
16
- double delay = 0;
17
- if (args.size() > 1 && args[1].is_number()) {
18
- delay = args[1].as_double();
19
- }
20
-
21
- // Capture arguments
22
- std::vector<jspp::AnyValue> callArgs;
23
- for (size_t i = 2; i < args.size(); ++i) {
24
- callArgs.push_back(args[i]);
25
- }
26
-
27
- auto task = [callback, callArgs]() {
28
- try {
29
- callback.call(jspp::Constants::UNDEFINED, std::span<const jspp::AnyValue>(callArgs));
30
- } catch (const jspp::Exception& e) {
31
- std::cerr << "Uncaught exception in setTimeout: " << e.what() << "\n";
32
- } catch (const std::exception& e) {
33
- std::cerr << "Uncaught exception in setTimeout: " << e.what() << "\n";
34
- } catch (...) {
35
- std::cerr << "Uncaught unknown exception in setTimeout\n";
36
- }
37
- };
38
-
39
- size_t id = jspp::Scheduler::instance().set_timeout(task, static_cast<size_t>(delay));
40
- return jspp::AnyValue::make_number(static_cast<double>(id));
41
- }, "setTimeout");
42
-
43
- // clearTimeout(id)
44
- inline auto clearTimeout = jspp::AnyValue::make_function([](const jspp::AnyValue& thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue {
45
- if (!args.empty() && args[0].is_number()) {
46
- size_t id = static_cast<size_t>(args[0].as_double());
47
- jspp::Scheduler::instance().clear_timer(id);
48
- }
49
- return jspp::Constants::UNDEFINED;
50
- }, "clearTimeout");
51
-
52
- // setInterval(callback, delay, ...args)
53
- inline auto setInterval = jspp::AnyValue::make_function([](const jspp::AnyValue& thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue {
54
- if (args.empty() || !args[0].is_function()) {
55
- throw jspp::Exception::make_exception("Callback must be a function", "TypeError");
56
- }
57
-
58
- auto callback = args[0];
59
- double delay = 0;
60
- if (args.size() > 1 && args[1].is_number()) {
61
- delay = args[1].as_double();
62
- }
63
-
64
- std::vector<jspp::AnyValue> callArgs;
65
- for (size_t i = 2; i < args.size(); ++i) {
66
- callArgs.push_back(args[i]);
67
- }
68
-
69
- auto task = [callback, callArgs]() {
70
- try {
71
- callback.call(jspp::Constants::UNDEFINED, std::span<const jspp::AnyValue>(callArgs));
72
- } catch (const jspp::Exception& e) {
73
- std::cerr << "Uncaught exception in setInterval: " << e.what() << "\n";
74
- } catch (const std::exception& e) {
75
- std::cerr << "Uncaught exception in setInterval: " << e.what() << "\n";
76
- } catch (...) {
77
- std::cerr << "Uncaught unknown exception in setInterval\n";
78
- }
79
- };
80
-
81
- size_t id = jspp::Scheduler::instance().set_interval(task, static_cast<size_t>(delay));
82
- return jspp::AnyValue::make_number(static_cast<double>(id));
83
- }, "setInterval");
84
-
85
- // clearInterval(id)
86
- inline auto clearInterval = jspp::AnyValue::make_function([](const jspp::AnyValue& thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue {
87
- if (!args.empty() && args[0].is_number()) {
88
- size_t id = static_cast<size_t>(args[0].as_double());
89
- jspp::Scheduler::instance().clear_timer(id);
90
- }
91
- return jspp::Constants::UNDEFINED;
1
+ #pragma once
2
+
3
+ #include "types.hpp"
4
+ #include "any_value.hpp"
5
+ #include "scheduler.hpp"
6
+ #include "values/function.hpp"
7
+ #include "exception.hpp"
8
+
9
+ // setTimeout(callback, delay, ...args)
10
+ inline auto setTimeout = jspp::AnyValue::make_function([](jspp::AnyValue thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue {
11
+ if (args.empty() || !args[0].is_function()) {
12
+ throw jspp::Exception::make_exception("Callback must be a function", "TypeError");
13
+ }
14
+
15
+ auto callback = args[0];
16
+ double delay = 0;
17
+ if (args.size() > 1 && args[1].is_number()) {
18
+ delay = args[1].as_double();
19
+ }
20
+
21
+ // Capture arguments
22
+ std::vector<jspp::AnyValue> callArgs;
23
+ for (size_t i = 2; i < args.size(); ++i) {
24
+ callArgs.push_back(args[i]);
25
+ }
26
+
27
+ auto task = [callback, callArgs]() {
28
+ try {
29
+ callback.call(jspp::Constants::UNDEFINED, std::span<const jspp::AnyValue>(callArgs));
30
+ } catch (const jspp::Exception& e) {
31
+ std::cerr << "Uncaught exception in setTimeout: " << e.what() << "\n";
32
+ } catch (const std::exception& e) {
33
+ std::cerr << "Uncaught exception in setTimeout: " << e.what() << "\n";
34
+ } catch (...) {
35
+ std::cerr << "Uncaught unknown exception in setTimeout\n";
36
+ }
37
+ };
38
+
39
+ size_t id = jspp::Scheduler::instance().set_timeout(task, static_cast<size_t>(delay));
40
+ return jspp::AnyValue::make_number(static_cast<double>(id));
41
+ }, "setTimeout");
42
+
43
+ // clearTimeout(id)
44
+ inline auto clearTimeout = jspp::AnyValue::make_function([](jspp::AnyValue thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue {
45
+ if (!args.empty() && args[0].is_number()) {
46
+ size_t id = static_cast<size_t>(args[0].as_double());
47
+ jspp::Scheduler::instance().clear_timer(id);
48
+ }
49
+ return jspp::Constants::UNDEFINED;
50
+ }, "clearTimeout");
51
+
52
+ // setInterval(callback, delay, ...args)
53
+ inline auto setInterval = jspp::AnyValue::make_function([](jspp::AnyValue thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue {
54
+ if (args.empty() || !args[0].is_function()) {
55
+ throw jspp::Exception::make_exception("Callback must be a function", "TypeError");
56
+ }
57
+
58
+ auto callback = args[0];
59
+ double delay = 0;
60
+ if (args.size() > 1 && args[1].is_number()) {
61
+ delay = args[1].as_double();
62
+ }
63
+
64
+ std::vector<jspp::AnyValue> callArgs;
65
+ for (size_t i = 2; i < args.size(); ++i) {
66
+ callArgs.push_back(args[i]);
67
+ }
68
+
69
+ auto task = [callback, callArgs]() {
70
+ try {
71
+ callback.call(jspp::Constants::UNDEFINED, std::span<const jspp::AnyValue>(callArgs));
72
+ } catch (const jspp::Exception& e) {
73
+ std::cerr << "Uncaught exception in setInterval: " << e.what() << "\n";
74
+ } catch (const std::exception& e) {
75
+ std::cerr << "Uncaught exception in setInterval: " << e.what() << "\n";
76
+ } catch (...) {
77
+ std::cerr << "Uncaught unknown exception in setInterval\n";
78
+ }
79
+ };
80
+
81
+ size_t id = jspp::Scheduler::instance().set_interval(task, static_cast<size_t>(delay));
82
+ return jspp::AnyValue::make_number(static_cast<double>(id));
83
+ }, "setInterval");
84
+
85
+ // clearInterval(id)
86
+ inline auto clearInterval = jspp::AnyValue::make_function([](jspp::AnyValue thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue {
87
+ if (!args.empty() && args[0].is_number()) {
88
+ size_t id = static_cast<size_t>(args[0].as_double());
89
+ jspp::Scheduler::instance().clear_timer(id);
90
+ }
91
+ return jspp::Constants::UNDEFINED;
92
92
  }, "clearInterval");