1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
pub mod array;
pub mod bigint;
pub mod boolean;
#[cfg(feature = "console")]
pub mod console;
pub mod date;
pub mod error;
pub mod function;
pub mod global_this;
pub mod infinity;
pub mod iterable;
pub mod json;
pub mod map;
pub mod math;
pub mod nan;
pub mod number;
pub mod object;
pub mod regexp;
pub mod string;
pub mod symbol;
pub mod undefined;
pub(crate) use self::{
array::{array_iterator::ArrayIterator, Array},
bigint::BigInt,
boolean::Boolean,
date::Date,
error::{Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, UriError},
function::BuiltInFunctionObject,
global_this::GlobalThis,
infinity::Infinity,
json::Json,
map::map_iterator::MapIterator,
map::Map,
math::Math,
nan::NaN,
number::Number,
object::for_in_iterator::ForInIterator,
object::Object as BuiltInObjectObject,
regexp::RegExp,
string::String,
symbol::Symbol,
undefined::Undefined,
};
use crate::{
property::{Attribute, DataDescriptor},
Context, Value,
};
pub(crate) trait BuiltIn {
const NAME: &'static str;
fn attribute() -> Attribute;
fn init(context: &mut Context) -> (&'static str, Value, Attribute);
}
#[inline]
pub fn init(context: &mut Context) {
let globals = [
Undefined::init,
Infinity::init,
NaN::init,
GlobalThis::init,
BuiltInFunctionObject::init,
BuiltInObjectObject::init,
Math::init,
Json::init,
Array::init,
BigInt::init,
Boolean::init,
Date::init,
Map::init,
Number::init,
String::init,
RegExp::init,
Symbol::init,
Error::init,
RangeError::init,
ReferenceError::init,
TypeError::init,
SyntaxError::init,
EvalError::init,
UriError::init,
#[cfg(feature = "console")]
console::Console::init,
];
let global_object = context.global_object().clone();
for init in &globals {
let (name, value, attribute) = init(context);
let property = DataDescriptor::new(value, attribute);
global_object.borrow_mut().insert(name, property);
}
}