mustardscript 0.1.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 (99) hide show
  1. package/Cargo.lock +1579 -0
  2. package/Cargo.toml +40 -0
  3. package/LICENSE +201 -0
  4. package/README.md +828 -0
  5. package/SECURITY.md +34 -0
  6. package/crates/mustard/Cargo.toml +31 -0
  7. package/crates/mustard/src/cancellation.rs +28 -0
  8. package/crates/mustard/src/diagnostic.rs +145 -0
  9. package/crates/mustard/src/ir.rs +435 -0
  10. package/crates/mustard/src/lib.rs +21 -0
  11. package/crates/mustard/src/limits.rs +22 -0
  12. package/crates/mustard/src/parser/expressions.rs +723 -0
  13. package/crates/mustard/src/parser/mod.rs +115 -0
  14. package/crates/mustard/src/parser/operators.rs +105 -0
  15. package/crates/mustard/src/parser/patterns.rs +123 -0
  16. package/crates/mustard/src/parser/scope.rs +107 -0
  17. package/crates/mustard/src/parser/statements.rs +298 -0
  18. package/crates/mustard/src/parser/tests/acceptance.rs +339 -0
  19. package/crates/mustard/src/parser/tests/mod.rs +2 -0
  20. package/crates/mustard/src/parser/tests/rejections.rs +107 -0
  21. package/crates/mustard/src/runtime/accounting.rs +613 -0
  22. package/crates/mustard/src/runtime/api.rs +192 -0
  23. package/crates/mustard/src/runtime/async_runtime/mod.rs +5 -0
  24. package/crates/mustard/src/runtime/async_runtime/promises.rs +246 -0
  25. package/crates/mustard/src/runtime/async_runtime/reactions.rs +400 -0
  26. package/crates/mustard/src/runtime/async_runtime/scheduler.rs +224 -0
  27. package/crates/mustard/src/runtime/builtins/arrays.rs +1205 -0
  28. package/crates/mustard/src/runtime/builtins/collections.rs +573 -0
  29. package/crates/mustard/src/runtime/builtins/install.rs +501 -0
  30. package/crates/mustard/src/runtime/builtins/intl.rs +553 -0
  31. package/crates/mustard/src/runtime/builtins/mod.rs +25 -0
  32. package/crates/mustard/src/runtime/builtins/objects.rs +405 -0
  33. package/crates/mustard/src/runtime/builtins/primitives.rs +859 -0
  34. package/crates/mustard/src/runtime/builtins/promises.rs +335 -0
  35. package/crates/mustard/src/runtime/builtins/regexp.rs +356 -0
  36. package/crates/mustard/src/runtime/builtins/strings.rs +803 -0
  37. package/crates/mustard/src/runtime/builtins/support.rs +561 -0
  38. package/crates/mustard/src/runtime/bytecode.rs +123 -0
  39. package/crates/mustard/src/runtime/compiler/assignments.rs +690 -0
  40. package/crates/mustard/src/runtime/compiler/bindings.rs +92 -0
  41. package/crates/mustard/src/runtime/compiler/context.rs +46 -0
  42. package/crates/mustard/src/runtime/compiler/control.rs +342 -0
  43. package/crates/mustard/src/runtime/compiler/expressions.rs +372 -0
  44. package/crates/mustard/src/runtime/compiler/mod.rs +173 -0
  45. package/crates/mustard/src/runtime/compiler/statements.rs +459 -0
  46. package/crates/mustard/src/runtime/conversions/boundary.rs +293 -0
  47. package/crates/mustard/src/runtime/conversions/coercions.rs +217 -0
  48. package/crates/mustard/src/runtime/conversions/errors.rs +118 -0
  49. package/crates/mustard/src/runtime/conversions/mod.rs +14 -0
  50. package/crates/mustard/src/runtime/conversions/operators.rs +334 -0
  51. package/crates/mustard/src/runtime/env.rs +355 -0
  52. package/crates/mustard/src/runtime/exceptions.rs +377 -0
  53. package/crates/mustard/src/runtime/gc.rs +595 -0
  54. package/crates/mustard/src/runtime/mod.rs +318 -0
  55. package/crates/mustard/src/runtime/properties.rs +1762 -0
  56. package/crates/mustard/src/runtime/serialization.rs +127 -0
  57. package/crates/mustard/src/runtime/shared.rs +108 -0
  58. package/crates/mustard/src/runtime/snapshot_validation_tests.rs +93 -0
  59. package/crates/mustard/src/runtime/state.rs +652 -0
  60. package/crates/mustard/src/runtime/tests/async_host.rs +104 -0
  61. package/crates/mustard/src/runtime/tests/collections.rs +50 -0
  62. package/crates/mustard/src/runtime/tests/diagnostics.rs +36 -0
  63. package/crates/mustard/src/runtime/tests/exceptions.rs +122 -0
  64. package/crates/mustard/src/runtime/tests/execution.rs +553 -0
  65. package/crates/mustard/src/runtime/tests/gc.rs +533 -0
  66. package/crates/mustard/src/runtime/tests/mod.rs +56 -0
  67. package/crates/mustard/src/runtime/tests/serialization.rs +170 -0
  68. package/crates/mustard/src/runtime/validation/bytecode.rs +484 -0
  69. package/crates/mustard/src/runtime/validation/mod.rs +14 -0
  70. package/crates/mustard/src/runtime/validation/policy.rs +94 -0
  71. package/crates/mustard/src/runtime/validation/snapshot.rs +406 -0
  72. package/crates/mustard/src/runtime/validation/walk.rs +206 -0
  73. package/crates/mustard/src/runtime/vm.rs +1016 -0
  74. package/crates/mustard/src/span.rs +22 -0
  75. package/crates/mustard/src/structured.rs +107 -0
  76. package/crates/mustard-bridge/Cargo.toml +17 -0
  77. package/crates/mustard-bridge/src/codec.rs +46 -0
  78. package/crates/mustard-bridge/src/dto.rs +99 -0
  79. package/crates/mustard-bridge/src/lib.rs +12 -0
  80. package/crates/mustard-bridge/src/operations.rs +142 -0
  81. package/crates/mustard-node/Cargo.toml +24 -0
  82. package/crates/mustard-node/build.rs +3 -0
  83. package/crates/mustard-node/src/lib.rs +236 -0
  84. package/crates/mustard-sidecar/Cargo.toml +21 -0
  85. package/crates/mustard-sidecar/src/lib.rs +134 -0
  86. package/crates/mustard-sidecar/src/main.rs +36 -0
  87. package/dist/index.js +20 -0
  88. package/dist/install.js +117 -0
  89. package/dist/lib/cancellation.js +124 -0
  90. package/dist/lib/errors.js +46 -0
  91. package/dist/lib/executor.js +555 -0
  92. package/dist/lib/policy.js +292 -0
  93. package/dist/lib/progress.js +356 -0
  94. package/dist/lib/runtime.js +109 -0
  95. package/dist/lib/structured.js +286 -0
  96. package/dist/native-loader.js +227 -0
  97. package/index.d.ts +23 -0
  98. package/mustard.d.ts +220 -0
  99. package/package.json +97 -0
@@ -0,0 +1,501 @@
1
+ use super::*;
2
+
3
+ impl Runtime {
4
+ pub(crate) fn call_builtin(
5
+ &mut self,
6
+ function: BuiltinFunction,
7
+ this_value: Value,
8
+ args: &[Value],
9
+ ) -> MustardResult<Value> {
10
+ match function {
11
+ BuiltinFunction::FunctionCtor => Err(MustardError::runtime(
12
+ "TypeError: Function constructor is unavailable in the supported surface",
13
+ )),
14
+ BuiltinFunction::FunctionCall
15
+ | BuiltinFunction::FunctionApply
16
+ | BuiltinFunction::FunctionBind => Err(MustardError::runtime(
17
+ "internal function helper should be dispatched through call semantics",
18
+ )),
19
+ BuiltinFunction::ArrayCtor => self.call_array_ctor(args),
20
+ BuiltinFunction::ArrayFrom => self.call_array_from(args),
21
+ BuiltinFunction::ArrayOf => self.call_array_of(args),
22
+ BuiltinFunction::ArrayIsArray => {
23
+ Ok(Value::Bool(matches!(args.first(), Some(Value::Array(_)))))
24
+ }
25
+ BuiltinFunction::ArrayPush => self.call_array_push(this_value, args),
26
+ BuiltinFunction::ArrayPop => self.call_array_pop(this_value),
27
+ BuiltinFunction::ArraySlice => self.call_array_slice(this_value, args),
28
+ BuiltinFunction::ArraySplice => self.call_array_splice(this_value, args),
29
+ BuiltinFunction::ArrayConcat => self.call_array_concat(this_value, args),
30
+ BuiltinFunction::ArrayAt => self.call_array_at(this_value, args),
31
+ BuiltinFunction::ArrayJoin => self.call_array_join(this_value, args),
32
+ BuiltinFunction::ArrayIncludes => self.call_array_includes(this_value, args),
33
+ BuiltinFunction::ArrayIndexOf => self.call_array_index_of(this_value, args),
34
+ BuiltinFunction::ArrayLastIndexOf => self.call_array_last_index_of(this_value, args),
35
+ BuiltinFunction::ArrayReverse => self.call_array_reverse(this_value),
36
+ BuiltinFunction::ArrayFill => self.call_array_fill(this_value, args),
37
+ BuiltinFunction::ArraySort => self.call_array_sort(this_value, args),
38
+ BuiltinFunction::ArrayValues => self.call_array_values(this_value),
39
+ BuiltinFunction::ArrayKeys => self.call_array_keys(this_value),
40
+ BuiltinFunction::ArrayEntries => self.call_array_entries(this_value),
41
+ BuiltinFunction::ArrayForEach => self.call_array_for_each(this_value, args),
42
+ BuiltinFunction::ArrayMap => self.call_array_map(this_value, args),
43
+ BuiltinFunction::ArrayFilter => self.call_array_filter(this_value, args),
44
+ BuiltinFunction::ArrayFind => self.call_array_find(this_value, args),
45
+ BuiltinFunction::ArrayFindIndex => self.call_array_find_index(this_value, args),
46
+ BuiltinFunction::ArraySome => self.call_array_some(this_value, args),
47
+ BuiltinFunction::ArrayEvery => self.call_array_every(this_value, args),
48
+ BuiltinFunction::ArrayFlat => self.call_array_flat(this_value, args),
49
+ BuiltinFunction::ArrayFlatMap => self.call_array_flat_map(this_value, args),
50
+ BuiltinFunction::ArrayReduce => self.call_array_reduce(this_value, args),
51
+ BuiltinFunction::ArrayReduceRight => self.call_array_reduce_right(this_value, args),
52
+ BuiltinFunction::ArrayFindLast => self.call_array_find_last(this_value, args),
53
+ BuiltinFunction::ArrayFindLastIndex => {
54
+ self.call_array_find_last_index(this_value, args)
55
+ }
56
+ BuiltinFunction::ObjectCtor => self.call_object_ctor(args),
57
+ BuiltinFunction::ObjectAssign => self.call_object_assign(args),
58
+ BuiltinFunction::ObjectCreate => self.reject_object_create(),
59
+ BuiltinFunction::ObjectFreeze => self.reject_object_freeze(),
60
+ BuiltinFunction::ObjectSeal => self.reject_object_seal(),
61
+ BuiltinFunction::ObjectFromEntries => self.call_object_from_entries(args),
62
+ BuiltinFunction::ObjectKeys => self.call_object_keys(args),
63
+ BuiltinFunction::ObjectValues => self.call_object_values(args),
64
+ BuiltinFunction::ObjectEntries => self.call_object_entries(args),
65
+ BuiltinFunction::ObjectHasOwn => self.call_object_has_own(args),
66
+ BuiltinFunction::MapCtor => Err(MustardError::runtime(
67
+ "TypeError: Map constructor must be called with new",
68
+ )),
69
+ BuiltinFunction::MapGet => self.call_map_get(this_value, args),
70
+ BuiltinFunction::MapSet => self.call_map_set(this_value, args),
71
+ BuiltinFunction::MapHas => self.call_map_has(this_value, args),
72
+ BuiltinFunction::MapDelete => self.call_map_delete(this_value, args),
73
+ BuiltinFunction::MapClear => self.call_map_clear(this_value),
74
+ BuiltinFunction::MapEntries => self.call_map_entries(this_value),
75
+ BuiltinFunction::MapKeys => self.call_map_keys(this_value),
76
+ BuiltinFunction::MapValues => self.call_map_values(this_value),
77
+ BuiltinFunction::MapForEach => self.call_map_for_each(this_value, args),
78
+ BuiltinFunction::SetCtor => Err(MustardError::runtime(
79
+ "TypeError: Set constructor must be called with new",
80
+ )),
81
+ BuiltinFunction::SetAdd => self.call_set_add(this_value, args),
82
+ BuiltinFunction::SetHas => self.call_set_has(this_value, args),
83
+ BuiltinFunction::SetDelete => self.call_set_delete(this_value, args),
84
+ BuiltinFunction::SetClear => self.call_set_clear(this_value),
85
+ BuiltinFunction::SetEntries => self.call_set_entries(this_value),
86
+ BuiltinFunction::SetKeys => self.call_set_keys(this_value),
87
+ BuiltinFunction::SetValues => self.call_set_values(this_value),
88
+ BuiltinFunction::SetForEach => self.call_set_for_each(this_value, args),
89
+ BuiltinFunction::IteratorNext => self.call_iterator_next(this_value),
90
+ BuiltinFunction::PromiseCtor => Err(MustardError::runtime(
91
+ "TypeError: Promise constructor must be called with new",
92
+ )),
93
+ BuiltinFunction::PromiseResolve => {
94
+ let value = args.first().cloned().unwrap_or(Value::Undefined);
95
+ Ok(Value::Promise(self.coerce_to_promise(value)?))
96
+ }
97
+ BuiltinFunction::PromiseReject => {
98
+ let value = args.first().cloned().unwrap_or(Value::Undefined);
99
+ Ok(Value::Promise(self.insert_promise(
100
+ PromiseState::Rejected(PromiseRejection {
101
+ value,
102
+ span: None,
103
+ traceback: self.traceback_snapshots(),
104
+ }),
105
+ )?))
106
+ }
107
+ BuiltinFunction::PromiseResolveFunction(target) => {
108
+ let value = args.first().cloned().unwrap_or(Value::Undefined);
109
+ self.resolve_promise(target, value)?;
110
+ Ok(Value::Undefined)
111
+ }
112
+ BuiltinFunction::PromiseRejectFunction(target) => {
113
+ let value = args.first().cloned().unwrap_or(Value::Undefined);
114
+ self.reject_promise(
115
+ target,
116
+ PromiseRejection {
117
+ value,
118
+ span: None,
119
+ traceback: self.traceback_snapshots(),
120
+ },
121
+ )?;
122
+ Ok(Value::Undefined)
123
+ }
124
+ BuiltinFunction::PromiseThen => self.call_promise_then(this_value, args),
125
+ BuiltinFunction::PromiseCatch => self.call_promise_catch(this_value, args),
126
+ BuiltinFunction::PromiseFinally => self.call_promise_finally(this_value, args),
127
+ BuiltinFunction::PromiseAll => self.call_promise_all(args),
128
+ BuiltinFunction::PromiseRace => self.call_promise_race(args),
129
+ BuiltinFunction::PromiseAny => self.call_promise_any(args),
130
+ BuiltinFunction::PromiseAllSettled => self.call_promise_all_settled(args),
131
+ BuiltinFunction::RegExpCtor => self.construct_regexp(args),
132
+ BuiltinFunction::RegExpExec => self.call_regexp_exec(this_value, args),
133
+ BuiltinFunction::RegExpTest => self.call_regexp_test(this_value, args),
134
+ BuiltinFunction::ErrorCtor => self.call_error_ctor(args, "Error"),
135
+ BuiltinFunction::TypeErrorCtor => self.call_error_ctor(args, "TypeError"),
136
+ BuiltinFunction::ReferenceErrorCtor => self.call_error_ctor(args, "ReferenceError"),
137
+ BuiltinFunction::RangeErrorCtor => self.call_error_ctor(args, "RangeError"),
138
+ BuiltinFunction::SyntaxErrorCtor => self.call_error_ctor(args, "SyntaxError"),
139
+ BuiltinFunction::NumberCtor => self.call_number_ctor(args),
140
+ BuiltinFunction::NumberParseInt => self.call_number_parse_int(args),
141
+ BuiltinFunction::NumberParseFloat => self.call_number_parse_float(args),
142
+ BuiltinFunction::NumberIsNaN => Ok(self.call_number_is_nan(args)),
143
+ BuiltinFunction::NumberIsFinite => Ok(self.call_number_is_finite(args)),
144
+ BuiltinFunction::NumberIsInteger => Ok(self.call_number_is_integer(args)),
145
+ BuiltinFunction::NumberIsSafeInteger => Ok(self.call_number_is_safe_integer(args)),
146
+ BuiltinFunction::DateCtor => Err(MustardError::runtime(
147
+ "TypeError: Date constructor must be called with new",
148
+ )),
149
+ BuiltinFunction::DateNow => Ok(Value::Number(current_time_millis())),
150
+ BuiltinFunction::DateGetTime => self.call_date_get_time(this_value),
151
+ BuiltinFunction::DateValueOf => self.call_date_value_of(this_value),
152
+ BuiltinFunction::DateToISOString => self.call_date_to_iso_string(this_value),
153
+ BuiltinFunction::DateToJSON => self.call_date_to_json(this_value),
154
+ BuiltinFunction::DateGetUTCFullYear => self.call_date_get_utc_full_year(this_value),
155
+ BuiltinFunction::DateGetUTCMonth => self.call_date_get_utc_month(this_value),
156
+ BuiltinFunction::DateGetUTCDate => self.call_date_get_utc_date(this_value),
157
+ BuiltinFunction::DateGetUTCHours => self.call_date_get_utc_hours(this_value),
158
+ BuiltinFunction::DateGetUTCMinutes => self.call_date_get_utc_minutes(this_value),
159
+ BuiltinFunction::DateGetUTCSeconds => self.call_date_get_utc_seconds(this_value),
160
+ BuiltinFunction::IntlDateTimeFormatCtor => self.construct_intl_date_time_format(args),
161
+ BuiltinFunction::IntlNumberFormatCtor => self.construct_intl_number_format(args),
162
+ BuiltinFunction::IntlDateTimeFormatFormat => {
163
+ self.call_intl_date_time_format_format(this_value, args)
164
+ }
165
+ BuiltinFunction::IntlDateTimeFormatResolvedOptions => {
166
+ self.call_intl_date_time_format_resolved_options(this_value)
167
+ }
168
+ BuiltinFunction::IntlNumberFormatFormat => {
169
+ self.call_intl_number_format_format(this_value, args)
170
+ }
171
+ BuiltinFunction::IntlNumberFormatResolvedOptions => {
172
+ self.call_intl_number_format_resolved_options(this_value)
173
+ }
174
+ BuiltinFunction::StringCtor => self.call_string_ctor(args),
175
+ BuiltinFunction::StringTrim => self.call_string_trim(this_value),
176
+ BuiltinFunction::StringTrimStart => self.call_string_trim_start(this_value),
177
+ BuiltinFunction::StringTrimEnd => self.call_string_trim_end(this_value),
178
+ BuiltinFunction::StringIncludes => self.call_string_includes(this_value, args),
179
+ BuiltinFunction::StringStartsWith => self.call_string_starts_with(this_value, args),
180
+ BuiltinFunction::StringEndsWith => self.call_string_ends_with(this_value, args),
181
+ BuiltinFunction::StringIndexOf => self.call_string_index_of(this_value, args),
182
+ BuiltinFunction::StringLastIndexOf => self.call_string_last_index_of(this_value, args),
183
+ BuiltinFunction::StringCharAt => self.call_string_char_at(this_value, args),
184
+ BuiltinFunction::StringAt => self.call_string_at(this_value, args),
185
+ BuiltinFunction::StringSlice => self.call_string_slice(this_value, args),
186
+ BuiltinFunction::StringSubstring => self.call_string_substring(this_value, args),
187
+ BuiltinFunction::StringToLowerCase => self.call_string_to_lower_case(this_value),
188
+ BuiltinFunction::StringToUpperCase => self.call_string_to_upper_case(this_value),
189
+ BuiltinFunction::StringRepeat => self.call_string_repeat(this_value, args),
190
+ BuiltinFunction::StringConcat => self.call_string_concat(this_value, args),
191
+ BuiltinFunction::StringPadStart => self.call_string_pad_start(this_value, args),
192
+ BuiltinFunction::StringPadEnd => self.call_string_pad_end(this_value, args),
193
+ BuiltinFunction::StringSplit => self.call_string_split(this_value, args),
194
+ BuiltinFunction::StringReplace => self.call_string_replace(this_value, args),
195
+ BuiltinFunction::StringReplaceAll => self.call_string_replace_all(this_value, args),
196
+ BuiltinFunction::StringSearch => self.call_string_search(this_value, args),
197
+ BuiltinFunction::StringMatch => self.call_string_match(this_value, args),
198
+ BuiltinFunction::StringMatchAll => self.call_string_match_all(this_value, args),
199
+ BuiltinFunction::StringToString => self.call_string_to_string(this_value),
200
+ BuiltinFunction::StringValueOf => self.call_string_value_of(this_value),
201
+ BuiltinFunction::BooleanCtor => self.call_boolean_ctor(args),
202
+ BuiltinFunction::BooleanToString => self.call_boolean_to_string(this_value),
203
+ BuiltinFunction::BooleanValueOf => self.call_boolean_value_of(this_value),
204
+ BuiltinFunction::NumberToString => self.call_number_to_string(this_value),
205
+ BuiltinFunction::NumberValueOf => self.call_number_value_of(this_value),
206
+ BuiltinFunction::MathAbs => self.call_math_abs(args),
207
+ BuiltinFunction::MathMax => self.call_math_max(args),
208
+ BuiltinFunction::MathMin => self.call_math_min(args),
209
+ BuiltinFunction::MathFloor => self.call_math_floor(args),
210
+ BuiltinFunction::MathCeil => self.call_math_ceil(args),
211
+ BuiltinFunction::MathRound => self.call_math_round(args),
212
+ BuiltinFunction::MathPow => self.call_math_pow(args),
213
+ BuiltinFunction::MathSqrt => self.call_math_sqrt(args),
214
+ BuiltinFunction::MathTrunc => self.call_math_trunc(args),
215
+ BuiltinFunction::MathSign => self.call_math_sign(args),
216
+ BuiltinFunction::MathLog => self.call_math_log(args),
217
+ BuiltinFunction::MathExp => self.call_math_exp(args),
218
+ BuiltinFunction::MathLog2 => self.call_math_log2(args),
219
+ BuiltinFunction::MathLog10 => self.call_math_log10(args),
220
+ BuiltinFunction::MathSin => self.call_math_sin(args),
221
+ BuiltinFunction::MathCos => self.call_math_cos(args),
222
+ BuiltinFunction::MathAtan2 => self.call_math_atan2(args),
223
+ BuiltinFunction::MathHypot => self.call_math_hypot(args),
224
+ BuiltinFunction::MathCbrt => self.call_math_cbrt(args),
225
+ BuiltinFunction::MathRandom => Ok(self.call_math_random()),
226
+ BuiltinFunction::JsonStringify => self.call_json_stringify(args),
227
+ BuiltinFunction::JsonParse => self.call_json_parse(args),
228
+ }
229
+ }
230
+
231
+ pub(crate) fn install_builtins(&mut self) -> MustardResult<()> {
232
+ let global_object = self.insert_object(IndexMap::new(), ObjectKind::Global)?;
233
+ for function in [
234
+ BuiltinFunction::FunctionCtor,
235
+ BuiltinFunction::ObjectCtor,
236
+ BuiltinFunction::MapCtor,
237
+ BuiltinFunction::SetCtor,
238
+ BuiltinFunction::ArrayCtor,
239
+ BuiltinFunction::DateCtor,
240
+ BuiltinFunction::PromiseCtor,
241
+ BuiltinFunction::RegExpCtor,
242
+ BuiltinFunction::StringCtor,
243
+ BuiltinFunction::ErrorCtor,
244
+ BuiltinFunction::TypeErrorCtor,
245
+ BuiltinFunction::ReferenceErrorCtor,
246
+ BuiltinFunction::RangeErrorCtor,
247
+ BuiltinFunction::SyntaxErrorCtor,
248
+ BuiltinFunction::NumberCtor,
249
+ BuiltinFunction::BooleanCtor,
250
+ BuiltinFunction::IntlDateTimeFormatCtor,
251
+ BuiltinFunction::IntlNumberFormatCtor,
252
+ ] {
253
+ self.register_builtin_prototype(function)?;
254
+ }
255
+ self.define_global(
256
+ "globalThis".to_string(),
257
+ Value::Object(global_object),
258
+ false,
259
+ )?;
260
+ self.define_global(
261
+ "Object".to_string(),
262
+ Value::BuiltinFunction(BuiltinFunction::ObjectCtor),
263
+ false,
264
+ )?;
265
+ self.define_global(
266
+ "Map".to_string(),
267
+ Value::BuiltinFunction(BuiltinFunction::MapCtor),
268
+ false,
269
+ )?;
270
+ self.define_global(
271
+ "Set".to_string(),
272
+ Value::BuiltinFunction(BuiltinFunction::SetCtor),
273
+ false,
274
+ )?;
275
+ self.define_global(
276
+ "Array".to_string(),
277
+ Value::BuiltinFunction(BuiltinFunction::ArrayCtor),
278
+ false,
279
+ )?;
280
+ self.define_global(
281
+ "Date".to_string(),
282
+ Value::BuiltinFunction(BuiltinFunction::DateCtor),
283
+ false,
284
+ )?;
285
+ self.define_global(
286
+ "Promise".to_string(),
287
+ Value::BuiltinFunction(BuiltinFunction::PromiseCtor),
288
+ false,
289
+ )?;
290
+ self.define_global(
291
+ "RegExp".to_string(),
292
+ Value::BuiltinFunction(BuiltinFunction::RegExpCtor),
293
+ false,
294
+ )?;
295
+ self.define_global(
296
+ "String".to_string(),
297
+ Value::BuiltinFunction(BuiltinFunction::StringCtor),
298
+ false,
299
+ )?;
300
+ self.define_global(
301
+ "Error".to_string(),
302
+ Value::BuiltinFunction(BuiltinFunction::ErrorCtor),
303
+ false,
304
+ )?;
305
+ self.define_global(
306
+ "TypeError".to_string(),
307
+ Value::BuiltinFunction(BuiltinFunction::TypeErrorCtor),
308
+ false,
309
+ )?;
310
+ self.define_global(
311
+ "ReferenceError".to_string(),
312
+ Value::BuiltinFunction(BuiltinFunction::ReferenceErrorCtor),
313
+ false,
314
+ )?;
315
+ self.define_global(
316
+ "RangeError".to_string(),
317
+ Value::BuiltinFunction(BuiltinFunction::RangeErrorCtor),
318
+ false,
319
+ )?;
320
+ self.define_global(
321
+ "SyntaxError".to_string(),
322
+ Value::BuiltinFunction(BuiltinFunction::SyntaxErrorCtor),
323
+ false,
324
+ )?;
325
+ self.define_global(
326
+ "Number".to_string(),
327
+ Value::BuiltinFunction(BuiltinFunction::NumberCtor),
328
+ false,
329
+ )?;
330
+ self.define_global("NaN".to_string(), Value::Number(f64::NAN), false)?;
331
+ self.define_global("Infinity".to_string(), Value::Number(f64::INFINITY), false)?;
332
+ self.define_global(
333
+ "parseInt".to_string(),
334
+ Value::BuiltinFunction(BuiltinFunction::NumberParseInt),
335
+ false,
336
+ )?;
337
+ self.define_global(
338
+ "parseFloat".to_string(),
339
+ Value::BuiltinFunction(BuiltinFunction::NumberParseFloat),
340
+ false,
341
+ )?;
342
+ self.define_global(
343
+ "isNaN".to_string(),
344
+ Value::BuiltinFunction(BuiltinFunction::NumberIsNaN),
345
+ false,
346
+ )?;
347
+ self.define_global(
348
+ "isFinite".to_string(),
349
+ Value::BuiltinFunction(BuiltinFunction::NumberIsFinite),
350
+ false,
351
+ )?;
352
+ self.define_global(
353
+ "Boolean".to_string(),
354
+ Value::BuiltinFunction(BuiltinFunction::BooleanCtor),
355
+ false,
356
+ )?;
357
+ let intl = self.insert_object(
358
+ IndexMap::from([
359
+ (
360
+ "DateTimeFormat".to_string(),
361
+ Value::BuiltinFunction(BuiltinFunction::IntlDateTimeFormatCtor),
362
+ ),
363
+ (
364
+ "NumberFormat".to_string(),
365
+ Value::BuiltinFunction(BuiltinFunction::IntlNumberFormatCtor),
366
+ ),
367
+ ]),
368
+ ObjectKind::Intl,
369
+ )?;
370
+ self.define_global("Intl".to_string(), Value::Object(intl), false)?;
371
+
372
+ let math = self.insert_object(
373
+ IndexMap::from([
374
+ ("E".to_string(), Value::Number(std::f64::consts::E)),
375
+ ("LN2".to_string(), Value::Number(std::f64::consts::LN_2)),
376
+ ("LN10".to_string(), Value::Number(std::f64::consts::LN_10)),
377
+ ("LOG2E".to_string(), Value::Number(std::f64::consts::LOG2_E)),
378
+ (
379
+ "LOG10E".to_string(),
380
+ Value::Number(std::f64::consts::LOG10_E),
381
+ ),
382
+ ("PI".to_string(), Value::Number(std::f64::consts::PI)),
383
+ ("SQRT2".to_string(), Value::Number(std::f64::consts::SQRT_2)),
384
+ (
385
+ "SQRT1_2".to_string(),
386
+ Value::Number(std::f64::consts::FRAC_1_SQRT_2),
387
+ ),
388
+ (
389
+ "abs".to_string(),
390
+ Value::BuiltinFunction(BuiltinFunction::MathAbs),
391
+ ),
392
+ (
393
+ "max".to_string(),
394
+ Value::BuiltinFunction(BuiltinFunction::MathMax),
395
+ ),
396
+ (
397
+ "min".to_string(),
398
+ Value::BuiltinFunction(BuiltinFunction::MathMin),
399
+ ),
400
+ (
401
+ "floor".to_string(),
402
+ Value::BuiltinFunction(BuiltinFunction::MathFloor),
403
+ ),
404
+ (
405
+ "ceil".to_string(),
406
+ Value::BuiltinFunction(BuiltinFunction::MathCeil),
407
+ ),
408
+ (
409
+ "round".to_string(),
410
+ Value::BuiltinFunction(BuiltinFunction::MathRound),
411
+ ),
412
+ (
413
+ "pow".to_string(),
414
+ Value::BuiltinFunction(BuiltinFunction::MathPow),
415
+ ),
416
+ (
417
+ "sqrt".to_string(),
418
+ Value::BuiltinFunction(BuiltinFunction::MathSqrt),
419
+ ),
420
+ (
421
+ "trunc".to_string(),
422
+ Value::BuiltinFunction(BuiltinFunction::MathTrunc),
423
+ ),
424
+ (
425
+ "sign".to_string(),
426
+ Value::BuiltinFunction(BuiltinFunction::MathSign),
427
+ ),
428
+ (
429
+ "log".to_string(),
430
+ Value::BuiltinFunction(BuiltinFunction::MathLog),
431
+ ),
432
+ (
433
+ "exp".to_string(),
434
+ Value::BuiltinFunction(BuiltinFunction::MathExp),
435
+ ),
436
+ (
437
+ "log2".to_string(),
438
+ Value::BuiltinFunction(BuiltinFunction::MathLog2),
439
+ ),
440
+ (
441
+ "log10".to_string(),
442
+ Value::BuiltinFunction(BuiltinFunction::MathLog10),
443
+ ),
444
+ (
445
+ "sin".to_string(),
446
+ Value::BuiltinFunction(BuiltinFunction::MathSin),
447
+ ),
448
+ (
449
+ "cos".to_string(),
450
+ Value::BuiltinFunction(BuiltinFunction::MathCos),
451
+ ),
452
+ (
453
+ "atan2".to_string(),
454
+ Value::BuiltinFunction(BuiltinFunction::MathAtan2),
455
+ ),
456
+ (
457
+ "hypot".to_string(),
458
+ Value::BuiltinFunction(BuiltinFunction::MathHypot),
459
+ ),
460
+ (
461
+ "cbrt".to_string(),
462
+ Value::BuiltinFunction(BuiltinFunction::MathCbrt),
463
+ ),
464
+ (
465
+ "random".to_string(),
466
+ Value::BuiltinFunction(BuiltinFunction::MathRandom),
467
+ ),
468
+ ]),
469
+ ObjectKind::Math,
470
+ )?;
471
+ self.define_global("Math".to_string(), Value::Object(math), false)?;
472
+
473
+ let json = self.insert_object(
474
+ IndexMap::from([
475
+ (
476
+ "stringify".to_string(),
477
+ Value::BuiltinFunction(BuiltinFunction::JsonStringify),
478
+ ),
479
+ (
480
+ "parse".to_string(),
481
+ Value::BuiltinFunction(BuiltinFunction::JsonParse),
482
+ ),
483
+ ]),
484
+ ObjectKind::Json,
485
+ )?;
486
+ self.define_global("JSON".to_string(), Value::Object(json), false)?;
487
+
488
+ let console = self.insert_object(IndexMap::new(), ObjectKind::Console)?;
489
+ self.define_global("console".to_string(), Value::Object(console), false)?;
490
+ Ok(())
491
+ }
492
+
493
+ fn register_builtin_prototype(&mut self, function: BuiltinFunction) -> MustardResult<()> {
494
+ let prototype = self.insert_object(
495
+ IndexMap::new(),
496
+ ObjectKind::FunctionPrototype(Value::BuiltinFunction(function)),
497
+ )?;
498
+ self.builtin_prototypes.insert(function, prototype);
499
+ Ok(())
500
+ }
501
+ }