@ugo-studio/jspp 0.2.9 → 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.
- package/dist/core/codegen/class-handlers.js +6 -6
- package/dist/core/codegen/statement-handlers.js +1 -1
- package/package.json +1 -1
- package/src/prelude/any_value.hpp +362 -362
- package/src/prelude/any_value_access.hpp +170 -170
- package/src/prelude/any_value_defines.hpp +189 -189
- package/src/prelude/any_value_helpers.hpp +374 -374
- package/src/prelude/library/array.hpp +185 -185
- package/src/prelude/library/console.hpp +111 -111
- package/src/prelude/library/error.hpp +112 -112
- package/src/prelude/library/function.hpp +10 -10
- package/src/prelude/library/math.hpp +307 -307
- package/src/prelude/library/object.hpp +275 -275
- package/src/prelude/library/process.hpp +39 -39
- package/src/prelude/library/promise.hpp +123 -123
- package/src/prelude/library/symbol.hpp +52 -52
- package/src/prelude/library/timer.hpp +91 -91
- package/src/prelude/types.hpp +178 -178
- package/src/prelude/utils/access.hpp +411 -411
- package/src/prelude/utils/operators.hpp +336 -336
- package/src/prelude/values/array.hpp +0 -1
- package/src/prelude/values/async_iterator.hpp +83 -83
- package/src/prelude/values/function.hpp +82 -82
- package/src/prelude/values/helpers/array.hpp +198 -208
- package/src/prelude/values/helpers/async_iterator.hpp +275 -275
- package/src/prelude/values/helpers/function.hpp +108 -108
- package/src/prelude/values/helpers/iterator.hpp +144 -144
- package/src/prelude/values/helpers/promise.hpp +253 -253
- package/src/prelude/values/helpers/string.hpp +37 -61
- package/src/prelude/values/promise.hpp +72 -72
- package/src/prelude/values/prototypes/array.hpp +14 -2
- package/src/prelude/values/prototypes/iterator.hpp +201 -201
- package/src/prelude/values/prototypes/promise.hpp +196 -196
- package/src/prelude/values/prototypes/string.hpp +564 -542
- package/src/prelude/values/string.hpp +25 -26
|
@@ -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([](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
|
+
#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([](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
|
+
#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([](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;
|
|
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");
|