Skip to content

Commit 5bb0754

Browse files
committed
Change constructor to function for builtIn
Handle toString for lazyBuiltIn objects
1 parent 04e809d commit 5bb0754

File tree

7 files changed

+186
-132
lines changed

7 files changed

+186
-132
lines changed

core/engine/src/builtins/builder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::{
55
native_function::{NativeFunctionObject, NativeFunctionPointer},
66
object::{
77
shape::{property_table::PropertyTableInner, slot::SlotAttributes},
8-
BuiltIn, FunctionBinding, JsFunction, JsPrototype, CONSTRUCTOR, PROTOTYPE,
8+
FunctionBinding, JsFunction, JsPrototype, CONSTRUCTOR, PROTOTYPE,
99
},
1010
property::{Attribute, PropertyDescriptor, PropertyKey},
1111
realm::Realm,

core/engine/src/builtins/function/mod.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use crate::{
2626
get_prototype_from_constructor, CallValue, InternalObjectMethods,
2727
ORDINARY_INTERNAL_METHODS,
2828
},
29-
JsData, JsFunction, JsObject, PrivateElement, PrivateName,
29+
JsData, JsFunction, JsObject, LazyBuiltIn, PrivateElement, PrivateName,
3030
},
3131
property::{Attribute, PropertyDescriptor, PropertyKey},
3232
realm::Realm,
@@ -859,6 +859,13 @@ impl BuiltInFunctionObject {
859859
);
860860
} else if object_borrow.is::<Proxy>() || object_borrow.is::<BoundFunction>() {
861861
return Ok(js_string!("function () { [native code] }").into());
862+
} else if object_borrow.is::<LazyBuiltIn>() {
863+
let name = object_borrow
864+
.downcast_ref::<LazyBuiltIn>()
865+
.map_or_else(|| js_string!(), |built_in| built_in.name.clone());
866+
return Ok(
867+
js_string!(js_str!("function "), &name, js_str!("() { [native code] }")).into(),
868+
);
862869
}
863870

864871
let function = object_borrow

core/engine/src/builtins/mod.rs

Lines changed: 97 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -195,108 +195,107 @@ impl Realm {
195195
///
196196
/// [spec]: https://tc39.es/ecma262/#sec-createintrinsics
197197
pub(crate) fn initialize(&self) {
198-
// BuiltInFunctionObject::init(self);
199-
// OrdinaryObject::init(self);
200-
// Iterator::init(self);
201-
// AsyncIterator::init(self);
202-
// AsyncFromSyncIterator::init(self);
203-
// ForInIterator::init(self);
204-
// Math::init(self);
205-
// Json::init(self);
206-
// Array::init(self);
207-
// ArrayIterator::init(self);
208-
// Proxy::init(self);
209-
// ArrayBuffer::init(self);
210-
// SharedArrayBuffer::init(self);
211-
// BigInt::init(self);
212-
// Boolean::init(self);
198+
BuiltInFunctionObject::init(self);
199+
OrdinaryObject::init(self);
200+
Iterator::init(self);
201+
AsyncIterator::init(self);
202+
AsyncFromSyncIterator::init(self);
203+
ForInIterator::init(self);
204+
Math::init(self);
205+
Json::init(self);
206+
ArrayIterator::init(self);
207+
Proxy::init(self);
208+
ArrayBuffer::init(self);
209+
SharedArrayBuffer::init(self);
210+
BigInt::init(self);
211+
Boolean::init(self);
213212
// Date::init(self);
214-
// DataView::init(self);
215-
// Map::init(self);
216-
// MapIterator::init(self);
217-
// IsFinite::init(self);
218-
// IsNaN::init(self);
219-
// ParseInt::init(self);
220-
// ParseFloat::init(self);
221-
// Number::init(self);
222-
// Eval::init(self);
223-
// Set::init(self);
224-
// SetIterator::init(self);
225-
// String::init(self);
226-
// StringIterator::init(self);
227-
// RegExp::init(self);
228-
// RegExpStringIterator::init(self);
229-
// BuiltinTypedArray::init(self);
230-
// Int8Array::init(self);
231-
// Uint8Array::init(self);
232-
// Uint8ClampedArray::init(self);
233-
// Int16Array::init(self);
234-
// Uint16Array::init(self);
235-
// Int32Array::init(self);
236-
// Uint32Array::init(self);
237-
// BigInt64Array::init(self);
238-
// BigUint64Array::init(self);
239-
// Float32Array::init(self);
240-
// Float64Array::init(self);
241-
// Symbol::init(self);
242-
// Error::init(self);
243-
// RangeError::init(self);
244-
// ReferenceError::init(self);
245-
// TypeError::init(self);
246-
// ThrowTypeError::init(self);
247-
// SyntaxError::init(self);
248-
// EvalError::init(self);
249-
// UriError::init(self);
250-
// AggregateError::init(self);
251-
// Reflect::init(self);
252-
// Generator::init(self);
253-
// GeneratorFunction::init(self);
254-
// Promise::init(self);
255-
// AsyncFunction::init(self);
256-
// AsyncGenerator::init(self);
257-
// AsyncGeneratorFunction::init(self);
258-
// EncodeUri::init(self);
259-
// EncodeUriComponent::init(self);
260-
// DecodeUri::init(self);
261-
// DecodeUriComponent::init(self);
262-
// WeakRef::init(self);
263-
// WeakMap::init(self);
264-
// WeakSet::init(self);
265-
// Atomics::init(self);
213+
DataView::init(self);
214+
Map::init(self);
215+
MapIterator::init(self);
216+
IsFinite::init(self);
217+
IsNaN::init(self);
218+
ParseInt::init(self);
219+
ParseFloat::init(self);
220+
Number::init(self);
221+
Eval::init(self);
222+
Set::init(self);
223+
SetIterator::init(self);
224+
String::init(self);
225+
StringIterator::init(self);
226+
RegExp::init(self);
227+
RegExpStringIterator::init(self);
228+
BuiltinTypedArray::init(self);
229+
Int8Array::init(self);
230+
Uint8Array::init(self);
231+
Uint8ClampedArray::init(self);
232+
Int16Array::init(self);
233+
Uint16Array::init(self);
234+
Int32Array::init(self);
235+
Uint32Array::init(self);
236+
BigInt64Array::init(self);
237+
BigUint64Array::init(self);
238+
Float32Array::init(self);
239+
Float64Array::init(self);
240+
Symbol::init(self);
241+
Error::init(self);
242+
RangeError::init(self);
243+
ReferenceError::init(self);
244+
TypeError::init(self);
245+
ThrowTypeError::init(self);
246+
SyntaxError::init(self);
247+
EvalError::init(self);
248+
UriError::init(self);
249+
AggregateError::init(self);
250+
Reflect::init(self);
251+
Generator::init(self);
252+
GeneratorFunction::init(self);
253+
Promise::init(self);
254+
AsyncFunction::init(self);
255+
AsyncGenerator::init(self);
256+
AsyncGeneratorFunction::init(self);
257+
EncodeUri::init(self);
258+
EncodeUriComponent::init(self);
259+
DecodeUri::init(self);
260+
DecodeUriComponent::init(self);
261+
WeakRef::init(self);
262+
WeakMap::init(self);
263+
WeakSet::init(self);
264+
Atomics::init(self);
266265

267-
// #[cfg(feature = "annex-b")]
268-
// {
269-
// escape::Escape::init(self);
270-
// escape::Unescape::init(self);
271-
// }
266+
#[cfg(feature = "annex-b")]
267+
{
268+
escape::Escape::init(self);
269+
escape::Unescape::init(self);
270+
}
272271

273-
// #[cfg(feature = "intl")]
274-
// {
275-
// intl::Intl::init(self);
276-
// intl::Collator::init(self);
277-
// intl::ListFormat::init(self);
278-
// intl::Locale::init(self);
279-
// intl::DateTimeFormat::init(self);
280-
// intl::Segmenter::init(self);
281-
// intl::segmenter::Segments::init(self);
282-
// intl::segmenter::SegmentIterator::init(self);
283-
// intl::PluralRules::init(self);
284-
// intl::NumberFormat::init(self);
285-
// }
272+
#[cfg(feature = "intl")]
273+
{
274+
intl::Intl::init(self);
275+
intl::Collator::init(self);
276+
intl::ListFormat::init(self);
277+
intl::Locale::init(self);
278+
intl::DateTimeFormat::init(self);
279+
intl::Segmenter::init(self);
280+
intl::segmenter::Segments::init(self);
281+
intl::segmenter::SegmentIterator::init(self);
282+
intl::PluralRules::init(self);
283+
intl::NumberFormat::init(self);
284+
}
286285

287-
// #[cfg(feature = "temporal")]
288-
// {
289-
// temporal::Temporal::init(self);
290-
// temporal::Now::init(self);
291-
// temporal::Instant::init(self);
292-
// temporal::Duration::init(self);
293-
// temporal::PlainDate::init(self);
294-
// temporal::PlainTime::init(self);
295-
// temporal::PlainDateTime::init(self);
296-
// temporal::PlainMonthDay::init(self);
297-
// temporal::PlainYearMonth::init(self);
298-
// temporal::ZonedDateTime::init(self);
299-
// }
286+
#[cfg(feature = "temporal")]
287+
{
288+
temporal::Temporal::init(self);
289+
temporal::Now::init(self);
290+
temporal::Instant::init(self);
291+
temporal::Duration::init(self);
292+
temporal::PlainDate::init(self);
293+
temporal::PlainTime::init(self);
294+
temporal::PlainDateTime::init(self);
295+
temporal::PlainMonthDay::init(self);
296+
temporal::PlainYearMonth::init(self);
297+
temporal::ZonedDateTime::init(self);
298+
}
300299
}
301300
}
302301

core/engine/src/context/intrinsics.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
33
use boa_gc::{Finalize, Trace, WeakGc};
44
use boa_macros::js_str;
5+
use boa_string::JsString;
56

67
use crate::{
78
builtins::{
8-
iterable::IteratorPrototypes, uri::UriFunctions, Array, IntrinsicObject, OrdinaryObject,
9+
iterable::IteratorPrototypes, uri::UriFunctions, Array, BuiltInObject, Date,
10+
IntrinsicObject, OrdinaryObject,
911
},
1012
js_string,
1113
object::{
@@ -43,7 +45,7 @@ impl Intrinsics {
4345
/// To initialize all the intrinsics with their spec properties, see [`Realm::initialize`].
4446
///
4547
/// [`Realm::initialize`]: crate::realm::Realm::initialize
46-
pub(crate) fn uninit(root_shape: &RootShape, realm_inner: WeakGc<RealmInner>) -> Option<Self> {
48+
pub(crate) fn uninit(root_shape: &RootShape, realm_inner: &WeakGc<RealmInner>) -> Option<Self> {
4749
let constructors = StandardConstructors::new(realm_inner);
4850
let templates = ObjectTemplates::new(root_shape, &constructors);
4951

@@ -99,9 +101,9 @@ impl StandardConstructor {
99101
}
100102

101103
/// Similar to `with_prototype`, but the prototype is lazily initialized.
102-
fn with_lazy(init: fn(&Realm) -> (), realm_inner: WeakGc<RealmInner>) -> Self {
104+
fn lazy(init: fn(&Realm) -> (), name: JsString, realm_inner: WeakGc<RealmInner>) -> Self {
103105
Self {
104-
constructor: JsFunction::lazy_intrinsic_function(true, init, realm_inner),
106+
constructor: JsFunction::lazy_intrinsic_function(true, init, name, realm_inner),
105107
prototype: JsObject::default(),
106108
}
107109
}
@@ -215,22 +217,22 @@ pub struct StandardConstructors {
215217
}
216218

217219
impl StandardConstructors {
218-
fn new(realm_inner: WeakGc<RealmInner>) -> Self {
220+
fn new(realm_inner: &WeakGc<RealmInner>) -> Self {
219221
Self {
220222
object: StandardConstructor::with_prototype(JsObject::from_object_and_vtable(
221223
Object::<OrdinaryObject>::default(),
222224
&IMMUTABLE_PROTOTYPE_EXOTIC_INTERNAL_METHODS,
223225
)),
224226
async_generator_function: StandardConstructor::default(),
225227
proxy: StandardConstructor::default(),
226-
date: StandardConstructor::default(),
228+
date: StandardConstructor::lazy(Date::init, Date::NAME, realm_inner.clone()),
227229
function: StandardConstructor {
228230
constructor: JsFunction::empty_intrinsic_function(true),
229231
prototype: JsFunction::empty_intrinsic_function(false).into(),
230232
},
231233
async_function: StandardConstructor::default(),
232234
generator_function: StandardConstructor::default(),
233-
array: StandardConstructor::with_lazy(Array::init, realm_inner),
235+
array: StandardConstructor::lazy(Array::init, Array::NAME, realm_inner.clone()),
234236
bigint: StandardConstructor::default(),
235237
number: StandardConstructor::with_prototype(JsObject::from_proto_and_data(None, 0.0)),
236238
boolean: StandardConstructor::with_prototype(JsObject::from_proto_and_data(

core/engine/src/object/builtins/jsfunction.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@ use crate::{
55
value::TryFromJs, Context, JsNativeError, JsResult, JsValue, NativeFunction, TryIntoJsResult,
66
};
77
use boa_gc::{Finalize, Trace, WeakGc};
8+
use boa_string::JsString;
89
use std::cell::Cell;
910
use std::marker::PhantomData;
1011
use std::ops::Deref;
1112

12-
use super::lazy_builtin::{BuiltIn, BuiltinKind};
13+
use super::lazy_builtin::{BuiltinKind, LazyBuiltIn};
1314

1415
/// A trait for converting a tuple of Rust values into a vector of `JsValue`,
1516
/// to be used as arguments for a JavaScript function.
@@ -144,15 +145,23 @@ impl JsFunction {
144145
pub(crate) fn lazy_intrinsic_function(
145146
constructor: bool,
146147
init: fn(&Realm),
148+
name: JsString,
147149
realm_inner: WeakGc<RealmInner>,
148150
) -> Self {
151+
let kind = if constructor {
152+
BuiltinKind::Function(Self::empty_intrinsic_function(constructor))
153+
} else {
154+
BuiltinKind::Ordinary
155+
};
156+
149157
Self {
150158
inner: JsObject::from_proto_and_data(
151159
None,
152-
BuiltIn {
160+
LazyBuiltIn {
153161
init,
154162
is_initialized: Cell::new(false),
155-
kind: BuiltinKind::Constructor(Self::empty_intrinsic_function(constructor)),
163+
kind,
164+
name,
156165
realm_inner: Some(realm_inner),
157166
},
158167
),

0 commit comments

Comments
 (0)