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}