1#![allow(clippy::unnecessary_wraps)]
5
6pub mod array;
7pub mod bigint;
8pub mod boolean;
9#[cfg(feature = "console")]
10pub mod console;
11pub mod date;
12pub mod error;
13pub mod function;
14pub mod global_this;
15pub mod infinity;
16pub mod iterable;
17pub mod json;
18pub mod map;
19pub mod math;
20pub mod nan;
21pub mod number;
22pub mod object;
23pub mod reflect;
24pub mod regexp;
25pub mod set;
26pub mod string;
27pub mod symbol;
28pub mod undefined;
29
30pub(crate) use self::{
31 array::{array_iterator::ArrayIterator, Array},
32 bigint::BigInt,
33 boolean::Boolean,
34 date::Date,
35 error::{Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError, UriError},
36 function::BuiltInFunctionObject,
37 global_this::GlobalThis,
38 infinity::Infinity,
39 json::Json,
40 map::map_iterator::MapIterator,
41 map::Map,
42 math::Math,
43 nan::NaN,
44 number::Number,
45 object::for_in_iterator::ForInIterator,
46 object::Object as BuiltInObjectObject,
47 reflect::Reflect,
48 regexp::RegExp,
49 set::set_iterator::SetIterator,
50 set::Set,
51 string::String,
52 symbol::Symbol,
53 undefined::Undefined,
54};
55use crate::{
56 property::{Attribute, PropertyDescriptor},
57 Context, JsValue,
58};
59
60pub(crate) trait BuiltIn {
61 const NAME: &'static str;
63
64 fn attribute() -> Attribute;
65 fn init(context: &mut Context) -> (&'static str, JsValue, Attribute);
66}
67
68#[inline]
70pub fn init(context: &mut Context) {
71 let globals = [
72 Undefined::init,
74 Infinity::init,
75 NaN::init,
76 GlobalThis::init,
77 BuiltInFunctionObject::init,
78 BuiltInObjectObject::init,
79 Math::init,
80 Json::init,
81 Array::init,
82 BigInt::init,
83 Boolean::init,
84 Date::init,
85 Map::init,
86 Number::init,
87 Set::init,
88 String::init,
89 RegExp::init,
90 Symbol::init,
91 Error::init,
92 RangeError::init,
93 ReferenceError::init,
94 TypeError::init,
95 SyntaxError::init,
96 EvalError::init,
97 UriError::init,
98 Reflect::init,
99 #[cfg(feature = "console")]
100 console::Console::init,
101 ];
102
103 let global_object = context.global_object();
104
105 for init in &globals {
106 let (name, value, attribute) = init(context);
107 let property = PropertyDescriptor::builder()
108 .value(value)
109 .writable(attribute.writable())
110 .enumerable(attribute.enumerable())
111 .configurable(attribute.configurable());
112 global_object.borrow_mut().insert(name, property);
113 }
114}
115
116pub trait JsArgs {
117 fn get_or_undefined(&self, index: usize) -> &JsValue;
129}
130
131impl JsArgs for [JsValue] {
132 fn get_or_undefined(&self, index: usize) -> &JsValue {
133 const UNDEFINED: &JsValue = &JsValue::Undefined;
134 self.get(index).unwrap_or(UNDEFINED)
135 }
136}