@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.
- package/dist/analysis/typeAnalyzer.js +42 -27
- package/dist/core/codegen/class-handlers.js +6 -6
- package/dist/core/codegen/control-flow-handlers.js +4 -4
- package/dist/core/codegen/declaration-handlers.js +21 -3
- package/dist/core/codegen/destructuring-handlers.js +187 -0
- package/dist/core/codegen/expression-handlers.js +7 -0
- package/dist/core/codegen/function-handlers.js +58 -36
- package/dist/core/codegen/helpers.js +288 -52
- package/dist/core/codegen/index.js +7 -4
- package/dist/core/codegen/statement-handlers.js +43 -23
- package/package.json +1 -1
- package/scripts/precompile-headers.ts +13 -5
- package/src/prelude/any_value.hpp +362 -361
- 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 -365
- 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/performance.hpp +1 -1
- 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 -393
- package/src/prelude/utils/operators.hpp +336 -329
- package/src/prelude/values/array.hpp +0 -1
- package/src/prelude/values/async_iterator.hpp +83 -81
- 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 -271
- package/src/prelude/values/helpers/function.hpp +108 -108
- package/src/prelude/values/helpers/iterator.hpp +144 -107
- package/src/prelude/values/helpers/promise.hpp +253 -253
- package/src/prelude/values/helpers/string.hpp +37 -47
- package/src/prelude/values/iterator.hpp +32 -5
- package/src/prelude/values/promise.hpp +72 -72
- package/src/prelude/values/prototypes/array.hpp +54 -42
- package/src/prelude/values/prototypes/iterator.hpp +201 -74
- 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,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([](
|
|
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([](
|
|
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](
|
|
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](
|
|
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([](
|
|
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([](
|
|
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([](
|
|
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](
|
|
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](
|
|
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([](
|
|
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([](
|
|
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([](
|
|
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([](
|
|
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([](
|
|
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([](
|
|
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([](
|
|
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");
|