pub mod array;
pub mod array_buffer;
pub mod async_function;
pub mod async_generator;
pub mod async_generator_function;
pub mod bigint;
pub mod boolean;
pub mod dataview;
pub mod date;
pub mod error;
pub mod eval;
pub mod function;
pub mod generator;
pub mod generator_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 promise;
pub mod proxy;
pub mod reflect;
pub mod regexp;
pub mod set;
pub mod string;
pub mod symbol;
pub mod typed_array;
pub mod undefined;
pub mod uri;
#[cfg(feature = "console")]
pub mod console;
#[cfg(feature = "intl")]
pub mod intl;
pub(crate) use self::{
array::{array_iterator::ArrayIterator, Array},
async_function::AsyncFunction,
bigint::BigInt,
boolean::Boolean,
dataview::DataView,
date::Date,
error::{
AggregateError, Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError,
UriError,
},
eval::Eval,
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,
promise::Promise,
proxy::Proxy,
reflect::Reflect,
regexp::RegExp,
set::set_iterator::SetIterator,
set::Set,
string::String,
symbol::Symbol,
typed_array::{
BigInt64Array, BigUint64Array, Float32Array, Float64Array, Int16Array, Int32Array,
Int8Array, Uint16Array, Uint32Array, Uint8Array, Uint8ClampedArray,
},
undefined::Undefined,
};
use crate::{
builtins::{
array_buffer::ArrayBuffer, async_generator::AsyncGenerator,
async_generator_function::AsyncGeneratorFunction, generator::Generator,
generator_function::GeneratorFunction, typed_array::TypedArray, uri::Uri,
},
property::{Attribute, PropertyDescriptor},
Context, JsValue,
};
pub(crate) trait BuiltIn {
const NAME: &'static str;
const ATTRIBUTE: Attribute = Attribute::WRITABLE
.union(Attribute::NON_ENUMERABLE)
.union(Attribute::CONFIGURABLE);
fn init(context: &mut Context) -> Option<JsValue>;
}
#[inline]
fn init_builtin<B: BuiltIn>(context: &mut Context) {
if let Some(value) = B::init(context) {
let property = PropertyDescriptor::builder()
.value(value)
.writable(B::ATTRIBUTE.writable())
.enumerable(B::ATTRIBUTE.enumerable())
.configurable(B::ATTRIBUTE.configurable())
.build();
context
.global_bindings_mut()
.insert(B::NAME.into(), property);
}
}
#[inline]
pub fn init(context: &mut Context) {
macro_rules! globals {
($( $builtin:ty ),*) => {
$(init_builtin::<$builtin>(context)
);*
}
}
globals! {
Undefined,
Infinity,
NaN,
GlobalThis,
BuiltInFunctionObject,
BuiltInObjectObject,
Math,
Json,
Array,
Proxy,
ArrayBuffer,
BigInt,
Boolean,
Date,
DataView,
Map,
Number,
Eval,
Set,
String,
RegExp,
TypedArray,
Int8Array,
Uint8Array,
Uint8ClampedArray,
Int16Array,
Uint16Array,
Int32Array,
Uint32Array,
BigInt64Array,
BigUint64Array,
Float32Array,
Float64Array,
Symbol,
Error,
RangeError,
ReferenceError,
TypeError,
SyntaxError,
EvalError,
UriError,
AggregateError,
Reflect,
Generator,
GeneratorFunction,
Promise,
AsyncFunction,
AsyncGenerator,
AsyncGeneratorFunction,
Uri
};
#[cfg(feature = "intl")]
init_builtin::<intl::Intl>(context);
#[cfg(feature = "console")]
init_builtin::<console::Console>(context);
}
pub trait JsArgs {
fn get_or_undefined(&self, index: usize) -> &JsValue;
}
impl JsArgs for [JsValue] {
fn get_or_undefined(&self, index: usize) -> &JsValue {
const UNDEFINED: &JsValue = &JsValue::Undefined;
self.get(index).unwrap_or(UNDEFINED)
}
}