From a97435f612785e1ae9e23db32dc98caf0478f83f Mon Sep 17 00:00:00 2001 From: Aapo Alasuutari Date: Sat, 13 Apr 2024 20:21:05 +0300 Subject: [PATCH] feat(ecmascript): Fill out Value enum --- nova_vm/src/builtin_strings | 1 + .../builtins/ecmascript_function.rs | 20 + .../function_objects/function_prototype.rs | 10 + .../object_objects/object_prototype.rs | 15 +- .../environments/function_environment.rs | 20 + .../ecmascript/execution/realm/intrinsics.rs | 4 +- .../src/ecmascript/types/language/function.rs | 146 +++- .../src/ecmascript/types/language/object.rs | 777 +++++++++++++++++- .../src/ecmascript/types/language/value.rs | 128 ++- nova_vm/src/engine/bytecode/vm.rs | 47 +- nova_vm/src/heap/heap_bits.rs | 331 ++++---- 11 files changed, 1331 insertions(+), 168 deletions(-) diff --git a/nova_vm/src/builtin_strings b/nova_vm/src/builtin_strings index b98a1b9e8..d8414a93a 100644 --- a/nova_vm/src/builtin_strings +++ b/nova_vm/src/builtin_strings @@ -1,4 +1,5 @@ -0 +[object Arguments] [object Array] [object Boolean] [object Date] diff --git a/nova_vm/src/ecmascript/builtins/ecmascript_function.rs b/nova_vm/src/ecmascript/builtins/ecmascript_function.rs index fadf9a933..2a1aee430 100644 --- a/nova_vm/src/ecmascript/builtins/ecmascript_function.rs +++ b/nova_vm/src/ecmascript/builtins/ecmascript_function.rs @@ -597,6 +597,16 @@ pub(crate) fn make_constructor( // 2. Else, // a. Set F.[[Construct]] to the definition specified in 10.3.2. } + Function::BuiltinGeneratorFunction => todo!(), + Function::BuiltinConstructorFunction => todo!(), + Function::BuiltinPromiseResolveFunction => todo!(), + Function::BuiltinPromiseRejectFunction => todo!(), + Function::BuiltinPromiseCollectorFunction => todo!(), + Function::BuiltinProxyRevokerFunction => todo!(), + Function::ECMAScriptAsyncFunction => todo!(), + Function::ECMAScriptAsyncGeneratorFunction => todo!(), + Function::ECMAScriptConstructorFunction => todo!(), + Function::ECMAScriptGeneratorFunction => todo!(), } // 5. If prototype is not present, then let prototype = prototype.unwrap_or_else(|| { @@ -685,6 +695,16 @@ pub(crate) fn set_function_name( function.name = Some(name); // 7. Return UNUSED. } + Function::BuiltinGeneratorFunction => todo!(), + Function::BuiltinConstructorFunction => todo!(), + Function::BuiltinPromiseResolveFunction => todo!(), + Function::BuiltinPromiseRejectFunction => todo!(), + Function::BuiltinPromiseCollectorFunction => todo!(), + Function::BuiltinProxyRevokerFunction => todo!(), + Function::ECMAScriptAsyncFunction => todo!(), + Function::ECMAScriptAsyncGeneratorFunction => todo!(), + Function::ECMAScriptConstructorFunction => todo!(), + Function::ECMAScriptGeneratorFunction => todo!(), } } diff --git a/nova_vm/src/ecmascript/builtins/fundamental_objects/function_objects/function_prototype.rs b/nova_vm/src/ecmascript/builtins/fundamental_objects/function_objects/function_prototype.rs index e1c8b69f1..80ffe417c 100644 --- a/nova_vm/src/ecmascript/builtins/fundamental_objects/function_objects/function_prototype.rs +++ b/nova_vm/src/ecmascript/builtins/fundamental_objects/function_objects/function_prototype.rs @@ -175,6 +175,16 @@ impl FunctionPrototype { ); Ok(Value::from_string(agent, initial_name)) } + Function::BuiltinGeneratorFunction => todo!(), + Function::BuiltinConstructorFunction => todo!(), + Function::BuiltinPromiseResolveFunction => todo!(), + Function::BuiltinPromiseRejectFunction => todo!(), + Function::BuiltinPromiseCollectorFunction => todo!(), + Function::BuiltinProxyRevokerFunction => todo!(), + Function::ECMAScriptAsyncFunction => todo!(), + Function::ECMAScriptAsyncGeneratorFunction => todo!(), + Function::ECMAScriptConstructorFunction => todo!(), + Function::ECMAScriptGeneratorFunction => todo!(), } // NOTE: NativeFunction means the following string: diff --git a/nova_vm/src/ecmascript/builtins/fundamental_objects/object_objects/object_prototype.rs b/nova_vm/src/ecmascript/builtins/fundamental_objects/object_objects/object_prototype.rs index 1073d0a9d..3f562770d 100644 --- a/nova_vm/src/ecmascript/builtins/fundamental_objects/object_objects/object_prototype.rs +++ b/nova_vm/src/ecmascript/builtins/fundamental_objects/object_objects/object_prototype.rs @@ -140,14 +140,17 @@ impl ObjectPrototype { Value::Null => Ok(BUILTIN_STRING_MEMORY._object_Null_.into_value()), // 9. Else if O has a [[BooleanData]] internal slot, let builtinTag be "Boolean". // 17. Return the string-concatenation of "[object ", tag, and "]". - Value::Boolean(_) => Ok(BUILTIN_STRING_MEMORY._object_Boolean_.into_value()), + Value::Boolean(_) | Value::BooleanObject => { + Ok(BUILTIN_STRING_MEMORY._object_Boolean_.into_value()) + } // 6. Else if O has a [[ParameterMap]] internal slot, let builtinTag be "Arguments". + Value::Arguments => Ok(BUILTIN_STRING_MEMORY._object_Arguments_.into_value()), // 11. Else if O has a [[StringData]] internal slot, let builtinTag be "String". - Value::String(_) | Value::SmallString(_) => { + Value::String(_) | Value::SmallString(_) | Value::StringObject => { Ok(BUILTIN_STRING_MEMORY._object_String_.into_value()) } // 10. Else if O has a [[NumberData]] internal slot, let builtinTag be "Number". - Value::Number(_) | Value::Integer(_) | Value::Float(_) => { + Value::Number(_) | Value::Integer(_) | Value::Float(_) | Value::NumberObject => { Ok(BUILTIN_STRING_MEMORY._object_Error_.into_value()) } Value::Object(_) => todo!(), @@ -162,9 +165,13 @@ impl ObjectPrototype { Value::BoundFunction(_) | Value::BuiltinFunction(_) | Value::ECMAScriptFunction(_) => { Ok(BUILTIN_STRING_MEMORY._object_Function_.into_value()) } + // TODO: Check for [[Call]] slot of Proxy + Value::Proxy => todo!(), + // TODO: Check for [[Call]] slot of EmbedderObject + Value::EmbedderObject => todo!(), // 13. Else if O has a [[RegExpMatcher]] internal slot, let builtinTag be "RegExp". Value::RegExp(_) => Ok(BUILTIN_STRING_MEMORY._object_RegExp_.into_value()), - Value::Symbol(_) | Value::BigInt(_) | Value::SmallBigInt(_) | Value::ArrayBuffer(_) => { + _ => { // 14. Else, let builtinTag be "Object". let builtin_tag = BUILTIN_STRING_MEMORY.Object; // 3. Let O be ! ToObject(this value). diff --git a/nova_vm/src/ecmascript/execution/environments/function_environment.rs b/nova_vm/src/ecmascript/execution/environments/function_environment.rs index caf661134..9247fe3ec 100644 --- a/nova_vm/src/ecmascript/execution/environments/function_environment.rs +++ b/nova_vm/src/ecmascript/execution/environments/function_environment.rs @@ -302,6 +302,16 @@ impl FunctionEnvironmentIndex { .unwrap(); data.ecmascript_function.home_object.is_some() } + Function::BuiltinGeneratorFunction => todo!(), + Function::BuiltinConstructorFunction => todo!(), + Function::BuiltinPromiseResolveFunction => todo!(), + Function::BuiltinPromiseRejectFunction => todo!(), + Function::BuiltinPromiseCollectorFunction => todo!(), + Function::BuiltinProxyRevokerFunction => todo!(), + Function::ECMAScriptAsyncFunction => todo!(), + Function::ECMAScriptAsyncGeneratorFunction => todo!(), + Function::ECMAScriptConstructorFunction => todo!(), + Function::ECMAScriptGeneratorFunction => todo!(), } } @@ -327,6 +337,16 @@ impl FunctionEnvironmentIndex { .unwrap(); data.ecmascript_function.home_object } + Function::BuiltinGeneratorFunction => todo!(), + Function::BuiltinConstructorFunction => todo!(), + Function::BuiltinPromiseResolveFunction => todo!(), + Function::BuiltinPromiseRejectFunction => todo!(), + Function::BuiltinPromiseCollectorFunction => todo!(), + Function::BuiltinProxyRevokerFunction => todo!(), + Function::ECMAScriptAsyncFunction => todo!(), + Function::ECMAScriptAsyncGeneratorFunction => todo!(), + Function::ECMAScriptConstructorFunction => todo!(), + Function::ECMAScriptGeneratorFunction => todo!(), }; // 2. If home is undefined, return undefined. let Some(home) = home else { diff --git a/nova_vm/src/ecmascript/execution/realm/intrinsics.rs b/nova_vm/src/ecmascript/execution/realm/intrinsics.rs index a8a16f0af..f44d1b8b5 100644 --- a/nova_vm/src/ecmascript/execution/realm/intrinsics.rs +++ b/nova_vm/src/ecmascript/execution/realm/intrinsics.rs @@ -57,8 +57,8 @@ use super::RealmIdentifier; #[derive(Debug, Clone)] pub(crate) struct Intrinsics { - object_index_base: ObjectIndex, - builtin_function_index_base: BuiltinFunctionIndex, + pub(crate) object_index_base: ObjectIndex, + pub(crate) builtin_function_index_base: BuiltinFunctionIndex, } /// Enumeration of intrinsics intended to be used as the \[\[Prototype\]\] value of diff --git a/nova_vm/src/ecmascript/types/language/function.rs b/nova_vm/src/ecmascript/types/language/function.rs index 0c48376a5..9c303e489 100644 --- a/nova_vm/src/ecmascript/types/language/function.rs +++ b/nova_vm/src/ecmascript/types/language/function.rs @@ -3,8 +3,14 @@ pub mod into_function; use super::{ value::{ - BOUND_FUNCTION_DISCRIMINANT, BUILTIN_FUNCTION_DISCRIMINANT, - ECMASCRIPT_FUNCTION_DISCRIMINANT, + BOUND_FUNCTION_DISCRIMINANT, BUILTIN_CONSTRUCTOR_FUNCTION_DISCRIMINANT, + BUILTIN_FUNCTION_DISCRIMINANT, BUILTIN_GENERATOR_FUNCTION_DISCRIMINANT, + BUILTIN_PROMISE_COLLECTOR_FUNCTION_DISCRIMINANT, + BUILTIN_PROMISE_REJECT_FUNCTION_DISCRIMINANT, + BUILTIN_PROMISE_RESOLVE_FUNCTION_DISCRIMINANT, BUILTIN_PROXY_REVOKER_FUNCTION, + ECMASCRIPT_ASYNC_FUNCTION_DISCRIMINANT, ECMASCRIPT_ASYNC_GENERATOR_FUNCTION_DISCRIMINANT, + ECMASCRIPT_CONSTRUCTOR_FUNCTION_DISCRIMINANT, ECMASCRIPT_FUNCTION_DISCRIMINANT, + ECMASCRIPT_GENERATOR_FUNCTION_DISCRIMINANT, }, InternalMethods, IntoObject, IntoValue, Object, OrdinaryObject, OrdinaryObjectInternalSlots, PropertyKey, Value, @@ -31,6 +37,16 @@ pub enum Function { BoundFunction(BoundFunctionIndex) = BOUND_FUNCTION_DISCRIMINANT, BuiltinFunction(BuiltinFunctionIndex) = BUILTIN_FUNCTION_DISCRIMINANT, ECMAScriptFunction(ECMAScriptFunctionIndex) = ECMASCRIPT_FUNCTION_DISCRIMINANT, + BuiltinGeneratorFunction = BUILTIN_GENERATOR_FUNCTION_DISCRIMINANT, + BuiltinConstructorFunction = BUILTIN_CONSTRUCTOR_FUNCTION_DISCRIMINANT, + BuiltinPromiseResolveFunction = BUILTIN_PROMISE_RESOLVE_FUNCTION_DISCRIMINANT, + BuiltinPromiseRejectFunction = BUILTIN_PROMISE_REJECT_FUNCTION_DISCRIMINANT, + BuiltinPromiseCollectorFunction = BUILTIN_PROMISE_COLLECTOR_FUNCTION_DISCRIMINANT, + BuiltinProxyRevokerFunction = BUILTIN_PROXY_REVOKER_FUNCTION, + ECMAScriptAsyncFunction = ECMASCRIPT_ASYNC_FUNCTION_DISCRIMINANT, + ECMAScriptAsyncGeneratorFunction = ECMASCRIPT_ASYNC_GENERATOR_FUNCTION_DISCRIMINANT, + ECMAScriptConstructorFunction = ECMASCRIPT_CONSTRUCTOR_FUNCTION_DISCRIMINANT, + ECMAScriptGeneratorFunction = ECMASCRIPT_GENERATOR_FUNCTION_DISCRIMINANT, } impl std::fmt::Debug for Function { @@ -39,6 +55,16 @@ impl std::fmt::Debug for Function { Function::BoundFunction(d) => write!(f, "BoundFunction({:?})", d), Function::BuiltinFunction(d) => write!(f, "BuiltinFunction({:?})", d), Function::ECMAScriptFunction(d) => write!(f, "ECMAScriptFunction({:?})", d), + Function::BuiltinGeneratorFunction => todo!(), + Function::BuiltinConstructorFunction => todo!(), + Function::BuiltinPromiseResolveFunction => todo!(), + Function::BuiltinPromiseRejectFunction => todo!(), + Function::BuiltinPromiseCollectorFunction => todo!(), + Function::BuiltinProxyRevokerFunction => todo!(), + Function::ECMAScriptAsyncFunction => todo!(), + Function::ECMAScriptAsyncGeneratorFunction => todo!(), + Function::ECMAScriptConstructorFunction => todo!(), + Function::ECMAScriptGeneratorFunction => todo!(), } } } @@ -80,6 +106,20 @@ impl TryFrom for Function { Object::BoundFunction(d) => Ok(Function::from(d)), Object::BuiltinFunction(d) => Ok(Function::from(d)), Object::ECMAScriptFunction(d) => Ok(Function::from(d)), + Object::BuiltinGeneratorFunction => Ok(Function::BuiltinGeneratorFunction), + Object::BuiltinConstructorFunction => Ok(Function::BuiltinConstructorFunction), + Object::BuiltinPromiseResolveFunction => Ok(Function::BuiltinPromiseResolveFunction), + Object::BuiltinPromiseRejectFunction => Ok(Function::BuiltinPromiseResolveFunction), + Object::BuiltinPromiseCollectorFunction => { + Ok(Function::BuiltinPromiseCollectorFunction) + } + Object::BuiltinProxyRevokerFunction => Ok(Function::BuiltinProxyRevokerFunction), + Object::ECMAScriptAsyncFunction => Ok(Function::ECMAScriptAsyncFunction), + Object::ECMAScriptAsyncGeneratorFunction => { + Ok(Function::ECMAScriptAsyncGeneratorFunction) + } + Object::ECMAScriptConstructorFunction => Ok(Function::ECMAScriptConstructorFunction), + Object::ECMAScriptGeneratorFunction => Ok(Function::ECMAScriptGeneratorFunction), _ => Err(()), } } @@ -92,6 +132,18 @@ impl TryFrom for Function { Value::BoundFunction(d) => Ok(Function::from(d)), Value::BuiltinFunction(d) => Ok(Function::from(d)), Value::ECMAScriptFunction(d) => Ok(Function::from(d)), + Value::BuiltinGeneratorFunction => Ok(Function::BuiltinGeneratorFunction), + Value::BuiltinConstructorFunction => Ok(Function::BuiltinConstructorFunction), + Value::BuiltinPromiseResolveFunction => Ok(Function::BuiltinPromiseResolveFunction), + Value::BuiltinPromiseRejectFunction => Ok(Function::BuiltinPromiseRejectFunction), + Value::BuiltinPromiseCollectorFunction => Ok(Function::BuiltinPromiseCollectorFunction), + Value::BuiltinProxyRevokerFunction => Ok(Function::BuiltinProxyRevokerFunction), + Value::ECMAScriptAsyncFunction => Ok(Function::ECMAScriptAsyncFunction), + Value::ECMAScriptAsyncGeneratorFunction => { + Ok(Function::ECMAScriptAsyncGeneratorFunction) + } + Value::ECMAScriptConstructorFunction => Ok(Function::ECMAScriptConstructorFunction), + Value::ECMAScriptGeneratorFunction => Ok(Function::ECMAScriptGeneratorFunction), _ => Err(()), } } @@ -103,6 +155,16 @@ impl From for Object { Function::BoundFunction(d) => Object::from(d), Function::BuiltinFunction(d) => Object::from(d), Function::ECMAScriptFunction(d) => Object::from(d), + Function::BuiltinGeneratorFunction => Object::BuiltinGeneratorFunction, + Function::BuiltinConstructorFunction => Object::BuiltinConstructorFunction, + Function::BuiltinPromiseResolveFunction => Object::BuiltinPromiseResolveFunction, + Function::BuiltinPromiseRejectFunction => Object::BuiltinPromiseRejectFunction, + Function::BuiltinPromiseCollectorFunction => Object::BuiltinPromiseCollectorFunction, + Function::BuiltinProxyRevokerFunction => Object::BuiltinProxyRevokerFunction, + Function::ECMAScriptAsyncFunction => Object::ECMAScriptAsyncFunction, + Function::ECMAScriptAsyncGeneratorFunction => Object::ECMAScriptAsyncGeneratorFunction, + Function::ECMAScriptConstructorFunction => Object::ECMAScriptConstructorFunction, + Function::ECMAScriptGeneratorFunction => Object::ECMAScriptGeneratorFunction, } } } @@ -113,6 +175,16 @@ impl From for Value { Function::BoundFunction(d) => Value::BoundFunction(d), Function::BuiltinFunction(d) => Value::BuiltinFunction(d), Function::ECMAScriptFunction(d) => Value::ECMAScriptFunction(d), + Function::BuiltinGeneratorFunction => Value::BuiltinGeneratorFunction, + Function::BuiltinConstructorFunction => Value::BuiltinConstructorFunction, + Function::BuiltinPromiseResolveFunction => Value::BuiltinPromiseResolveFunction, + Function::BuiltinPromiseRejectFunction => Value::BuiltinPromiseRejectFunction, + Function::BuiltinPromiseCollectorFunction => Value::BuiltinPromiseCollectorFunction, + Function::BuiltinProxyRevokerFunction => Value::BuiltinProxyRevokerFunction, + Function::ECMAScriptAsyncFunction => Value::ECMAScriptAsyncFunction, + Function::ECMAScriptAsyncGeneratorFunction => Value::ECMAScriptAsyncGeneratorFunction, + Function::ECMAScriptConstructorFunction => Value::ECMAScriptConstructorFunction, + Function::ECMAScriptGeneratorFunction => Value::ECMAScriptGeneratorFunction, } } } @@ -129,6 +201,16 @@ impl OrdinaryObjectInternalSlots for Function { Function::BoundFunction(d) => agent.heap.get(d).object_index, Function::BuiltinFunction(d) => agent.heap.get(d).object_index, Function::ECMAScriptFunction(d) => agent.heap.get(d).object_index, + Function::BuiltinGeneratorFunction => todo!(), + Function::BuiltinConstructorFunction => todo!(), + Function::BuiltinPromiseResolveFunction => todo!(), + Function::BuiltinPromiseRejectFunction => todo!(), + Function::BuiltinPromiseCollectorFunction => todo!(), + Function::BuiltinProxyRevokerFunction => todo!(), + Function::ECMAScriptAsyncFunction => todo!(), + Function::ECMAScriptAsyncGeneratorFunction => todo!(), + Function::ECMAScriptConstructorFunction => todo!(), + Function::ECMAScriptGeneratorFunction => todo!(), } { OrdinaryObject::from(object_index).extensible(agent) } else { @@ -141,6 +223,16 @@ impl OrdinaryObjectInternalSlots for Function { Function::BoundFunction(d) => agent.heap.get(d).object_index, Function::BuiltinFunction(d) => agent.heap.get(d).object_index, Function::ECMAScriptFunction(d) => agent.heap.get(d).object_index, + Function::BuiltinGeneratorFunction => todo!(), + Function::BuiltinConstructorFunction => todo!(), + Function::BuiltinPromiseResolveFunction => todo!(), + Function::BuiltinPromiseRejectFunction => todo!(), + Function::BuiltinPromiseCollectorFunction => todo!(), + Function::BuiltinProxyRevokerFunction => todo!(), + Function::ECMAScriptAsyncFunction => todo!(), + Function::ECMAScriptAsyncGeneratorFunction => todo!(), + Function::ECMAScriptConstructorFunction => todo!(), + Function::ECMAScriptGeneratorFunction => todo!(), } { OrdinaryObject::from(object_index).set_extensible(agent, value) } else if !value { @@ -154,6 +246,16 @@ impl OrdinaryObjectInternalSlots for Function { Function::BoundFunction(d) => agent.heap.get(d).object_index, Function::BuiltinFunction(d) => agent.heap.get(d).object_index, Function::ECMAScriptFunction(d) => agent.heap.get(d).object_index, + Function::BuiltinGeneratorFunction => todo!(), + Function::BuiltinConstructorFunction => todo!(), + Function::BuiltinPromiseResolveFunction => todo!(), + Function::BuiltinPromiseRejectFunction => todo!(), + Function::BuiltinPromiseCollectorFunction => todo!(), + Function::BuiltinProxyRevokerFunction => todo!(), + Function::ECMAScriptAsyncFunction => todo!(), + Function::ECMAScriptAsyncGeneratorFunction => todo!(), + Function::ECMAScriptConstructorFunction => todo!(), + Function::ECMAScriptGeneratorFunction => todo!(), } { OrdinaryObject::from(object_index).prototype(agent) } else { @@ -172,6 +274,16 @@ impl OrdinaryObjectInternalSlots for Function { Function::BoundFunction(d) => agent.heap.get(d).object_index, Function::BuiltinFunction(d) => agent.heap.get(d).object_index, Function::ECMAScriptFunction(d) => agent.heap.get(d).object_index, + Function::BuiltinGeneratorFunction => todo!(), + Function::BuiltinConstructorFunction => todo!(), + Function::BuiltinPromiseResolveFunction => todo!(), + Function::BuiltinPromiseRejectFunction => todo!(), + Function::BuiltinPromiseCollectorFunction => todo!(), + Function::BuiltinProxyRevokerFunction => todo!(), + Function::ECMAScriptAsyncFunction => todo!(), + Function::ECMAScriptAsyncGeneratorFunction => todo!(), + Function::ECMAScriptConstructorFunction => todo!(), + Function::ECMAScriptGeneratorFunction => todo!(), } { OrdinaryObject::from(object_index).set_prototype(agent, prototype) } else if prototype @@ -236,6 +348,16 @@ impl InternalMethods for Function { Function::ECMAScriptFunction(x) => { ECMAScriptFunction::from(x).get(agent, property_key, receiver) } + Function::BuiltinGeneratorFunction => todo!(), + Function::BuiltinConstructorFunction => todo!(), + Function::BuiltinPromiseResolveFunction => todo!(), + Function::BuiltinPromiseRejectFunction => todo!(), + Function::BuiltinPromiseCollectorFunction => todo!(), + Function::BuiltinProxyRevokerFunction => todo!(), + Function::ECMAScriptAsyncFunction => todo!(), + Function::ECMAScriptAsyncGeneratorFunction => todo!(), + Function::ECMAScriptConstructorFunction => todo!(), + Function::ECMAScriptGeneratorFunction => todo!(), } } @@ -271,6 +393,16 @@ impl InternalMethods for Function { Function::ECMAScriptFunction(idx) => { ECMAScriptFunction::from(idx).call(agent, this_argument, arguments_list) } + Function::BuiltinGeneratorFunction => todo!(), + Function::BuiltinConstructorFunction => todo!(), + Function::BuiltinPromiseResolveFunction => todo!(), + Function::BuiltinPromiseRejectFunction => todo!(), + Function::BuiltinPromiseCollectorFunction => todo!(), + Function::BuiltinProxyRevokerFunction => todo!(), + Function::ECMAScriptAsyncFunction => todo!(), + Function::ECMAScriptAsyncGeneratorFunction => todo!(), + Function::ECMAScriptConstructorFunction => todo!(), + Function::ECMAScriptGeneratorFunction => todo!(), } } @@ -288,6 +420,16 @@ impl InternalMethods for Function { Function::ECMAScriptFunction(idx) => { ECMAScriptFunction::from(idx).construct(agent, arguments_list, new_target) } + Function::BuiltinGeneratorFunction => todo!(), + Function::BuiltinConstructorFunction => todo!(), + Function::BuiltinPromiseResolveFunction => todo!(), + Function::BuiltinPromiseRejectFunction => todo!(), + Function::BuiltinPromiseCollectorFunction => todo!(), + Function::BuiltinProxyRevokerFunction => todo!(), + Function::ECMAScriptAsyncFunction => todo!(), + Function::ECMAScriptAsyncGeneratorFunction => todo!(), + Function::ECMAScriptConstructorFunction => todo!(), + Function::ECMAScriptGeneratorFunction => todo!(), } } } diff --git a/nova_vm/src/ecmascript/types/language/object.rs b/nova_vm/src/ecmascript/types/language/object.rs index 459006ba7..77a6c1d35 100644 --- a/nova_vm/src/ecmascript/types/language/object.rs +++ b/nova_vm/src/ecmascript/types/language/object.rs @@ -8,9 +8,26 @@ use std::ops::Deref; use super::{ value::{ - ARRAY_BUFFER_DISCRIMINANT, ARRAY_DISCRIMINANT, BOUND_FUNCTION_DISCRIMINANT, - BUILTIN_FUNCTION_DISCRIMINANT, DATE_DISCRIMINANT, ECMASCRIPT_FUNCTION_DISCRIMINANT, - ERROR_DISCRIMINANT, OBJECT_DISCRIMINANT, + ARGUMENTS_DISCRIMINANT, ARRAY_BUFFER_DISCRIMINANT, ARRAY_DISCRIMINANT, + ASYNC_FROM_SYNC_ITERATOR_DISCRIMINANT, ASYNC_ITERATOR_DISCRIMINANT, + BIGINT_64_ARRAY_DISCRIMINANT, BIGINT_OBJECT_DISCRIMINANT, BIGUINT_64_ARRAY_DISCRIMINANT, + BOOLEAN_OBJECT_DISCRIMINANT, BOUND_FUNCTION_DISCRIMINANT, + BUILTIN_CONSTRUCTOR_FUNCTION_DISCRIMINANT, BUILTIN_FUNCTION_DISCRIMINANT, + BUILTIN_GENERATOR_FUNCTION_DISCRIMINANT, BUILTIN_PROMISE_COLLECTOR_FUNCTION_DISCRIMINANT, + BUILTIN_PROMISE_REJECT_FUNCTION_DISCRIMINANT, + BUILTIN_PROMISE_RESOLVE_FUNCTION_DISCRIMINANT, BUILTIN_PROXY_REVOKER_FUNCTION, + DATA_VIEW_DISCRIMINANT, DATE_DISCRIMINANT, ECMASCRIPT_ASYNC_FUNCTION_DISCRIMINANT, + ECMASCRIPT_ASYNC_GENERATOR_FUNCTION_DISCRIMINANT, + ECMASCRIPT_CONSTRUCTOR_FUNCTION_DISCRIMINANT, ECMASCRIPT_FUNCTION_DISCRIMINANT, + ECMASCRIPT_GENERATOR_FUNCTION_DISCRIMINANT, EMBEDDER_OBJECT_DISCRIMINANT, + ERROR_DISCRIMINANT, FINALIZATION_REGISTRY_DISCRIMINANT, FLOAT_32_ARRAY_DISCRIMINANT, + FLOAT_64_ARRAY_DISCRIMINANT, INT_16_ARRAY_DISCRIMINANT, INT_32_ARRAY_DISCRIMINANT, + INT_8_ARRAY_DISCRIMINANT, ITERATOR_DISCRIMINANT, MAP_DISCRIMINANT, MODULE_DISCRIMINANT, + NUMBER_OBJECT_DISCRIMINANT, OBJECT_DISCRIMINANT, PROMISE_DISCRIMINANT, PROXY_DISCRIMINANT, + REGEXP_DISCRIMINANT, SET_DISCRIMINANT, SHARED_ARRAY_BUFFER_DISCRIMINANT, + STRING_OBJECT_DISCRIMINANT, SYMBOL_OBJECT_DISCRIMINANT, UINT_16_ARRAY_DISCRIMINANT, + UINT_32_ARRAY_DISCRIMINANT, UINT_8_ARRAY_DISCRIMINANT, UINT_8_CLAMPED_ARRAY_DISCRIMINANT, + WEAK_MAP_DISCRIMINANT, WEAK_REF_DISCRIMINANT, WEAK_SET_DISCRIMINANT, }, Function, IntoValue, Value, }; @@ -26,7 +43,7 @@ use crate::{ heap::{ indexes::{ ArrayBufferIndex, ArrayIndex, BoundFunctionIndex, BuiltinFunctionIndex, DateIndex, - ECMAScriptFunctionIndex, ErrorIndex, ObjectIndex, + ECMAScriptFunctionIndex, ErrorIndex, ObjectIndex, RegExpIndex, }, GetHeapData, }, @@ -46,14 +63,56 @@ pub use property_storage::PropertyStorage; #[repr(u8)] pub enum Object { Object(ObjectIndex) = OBJECT_DISCRIMINANT, + BoundFunction(BoundFunctionIndex) = BOUND_FUNCTION_DISCRIMINANT, + BuiltinFunction(BuiltinFunctionIndex) = BUILTIN_FUNCTION_DISCRIMINANT, + ECMAScriptFunction(ECMAScriptFunctionIndex) = ECMASCRIPT_FUNCTION_DISCRIMINANT, + BuiltinGeneratorFunction = BUILTIN_GENERATOR_FUNCTION_DISCRIMINANT, + BuiltinConstructorFunction = BUILTIN_CONSTRUCTOR_FUNCTION_DISCRIMINANT, + BuiltinPromiseResolveFunction = BUILTIN_PROMISE_RESOLVE_FUNCTION_DISCRIMINANT, + BuiltinPromiseRejectFunction = BUILTIN_PROMISE_REJECT_FUNCTION_DISCRIMINANT, + BuiltinPromiseCollectorFunction = BUILTIN_PROMISE_COLLECTOR_FUNCTION_DISCRIMINANT, + BuiltinProxyRevokerFunction = BUILTIN_PROXY_REVOKER_FUNCTION, + ECMAScriptAsyncFunction = ECMASCRIPT_ASYNC_FUNCTION_DISCRIMINANT, + ECMAScriptAsyncGeneratorFunction = ECMASCRIPT_ASYNC_GENERATOR_FUNCTION_DISCRIMINANT, + ECMAScriptConstructorFunction = ECMASCRIPT_CONSTRUCTOR_FUNCTION_DISCRIMINANT, + ECMAScriptGeneratorFunction = ECMASCRIPT_GENERATOR_FUNCTION_DISCRIMINANT, + BigIntObject = BIGINT_OBJECT_DISCRIMINANT, + BooleanObject = BOOLEAN_OBJECT_DISCRIMINANT, + NumberObject = NUMBER_OBJECT_DISCRIMINANT, + StringObject = STRING_OBJECT_DISCRIMINANT, + SymbolObject = SYMBOL_OBJECT_DISCRIMINANT, + Arguments = ARGUMENTS_DISCRIMINANT, Array(ArrayIndex) = ARRAY_DISCRIMINANT, ArrayBuffer(ArrayBufferIndex) = ARRAY_BUFFER_DISCRIMINANT, + DataView = DATA_VIEW_DISCRIMINANT, Date(DateIndex) = DATE_DISCRIMINANT, Error(ErrorIndex) = ERROR_DISCRIMINANT, - BoundFunction(BoundFunctionIndex) = BOUND_FUNCTION_DISCRIMINANT, - BuiltinFunction(BuiltinFunctionIndex) = BUILTIN_FUNCTION_DISCRIMINANT, - ECMAScriptFunction(ECMAScriptFunctionIndex) = ECMASCRIPT_FUNCTION_DISCRIMINANT, - //RegExp(RegExpIndex) = REGEXP_DISCRIMINANT, + FinalizationRegistry = FINALIZATION_REGISTRY_DISCRIMINANT, + Map = MAP_DISCRIMINANT, + Promise = PROMISE_DISCRIMINANT, + Proxy = PROXY_DISCRIMINANT, + RegExp(RegExpIndex) = REGEXP_DISCRIMINANT, + Set = SET_DISCRIMINANT, + SharedArrayBuffer = SHARED_ARRAY_BUFFER_DISCRIMINANT, + WeakMap = WEAK_MAP_DISCRIMINANT, + WeakRef = WEAK_REF_DISCRIMINANT, + WeakSet = WEAK_SET_DISCRIMINANT, + Int8Array = INT_8_ARRAY_DISCRIMINANT, + Uint8Array = UINT_8_ARRAY_DISCRIMINANT, + Uint8ClampedArray = UINT_8_CLAMPED_ARRAY_DISCRIMINANT, + Int16Array = INT_16_ARRAY_DISCRIMINANT, + Uint16Array = UINT_16_ARRAY_DISCRIMINANT, + Int32Array = INT_32_ARRAY_DISCRIMINANT, + Uint32Array = UINT_32_ARRAY_DISCRIMINANT, + BigInt64Array = BIGINT_64_ARRAY_DISCRIMINANT, + BigUint64Array = BIGUINT_64_ARRAY_DISCRIMINANT, + Float32Array = FLOAT_32_ARRAY_DISCRIMINANT, + Float64Array = FLOAT_64_ARRAY_DISCRIMINANT, + AsyncFromSyncIterator = ASYNC_FROM_SYNC_ITERATOR_DISCRIMINANT, + AsyncIterator = ASYNC_ITERATOR_DISCRIMINANT, + Iterator = ITERATOR_DISCRIMINANT, + Module = MODULE_DISCRIMINANT, + EmbedderObject = EMBEDDER_OBJECT_DISCRIMINANT, } #[derive(Debug, Clone, Copy)] @@ -190,6 +249,17 @@ impl TryFrom for Object { type Error = (); fn try_from(value: Value) -> Result { match value { + Value::Undefined + | Value::Null + | Value::Boolean(_) + | Value::String(_) + | Value::SmallString(_) + | Value::Symbol(_) + | Value::Number(_) + | Value::Integer(_) + | Value::Float(_) + | Value::BigInt(_) + | Value::SmallBigInt(_) => Err(()), Value::Object(x) => Ok(Object::from(x)), Value::Array(x) => Ok(Object::from(x)), Value::Date(x) => Ok(Object::Date(x)), @@ -197,7 +267,50 @@ impl TryFrom for Object { Value::BoundFunction(x) => Ok(Object::from(x)), Value::BuiltinFunction(x) => Ok(Object::from(x)), Value::ECMAScriptFunction(x) => Ok(Object::from(x)), - _ => Err(()), + Value::BuiltinGeneratorFunction => Ok(Object::BuiltinGeneratorFunction), + Value::BuiltinConstructorFunction => Ok(Object::BuiltinConstructorFunction), + Value::BuiltinPromiseResolveFunction => Ok(Object::BuiltinPromiseResolveFunction), + Value::BuiltinPromiseRejectFunction => Ok(Object::BuiltinPromiseRejectFunction), + Value::BuiltinPromiseCollectorFunction => Ok(Object::BuiltinPromiseCollectorFunction), + Value::BuiltinProxyRevokerFunction => Ok(Object::BuiltinProxyRevokerFunction), + Value::ECMAScriptAsyncFunction => Ok(Object::ECMAScriptAsyncFunction), + Value::ECMAScriptAsyncGeneratorFunction => Ok(Object::ECMAScriptAsyncGeneratorFunction), + Value::ECMAScriptConstructorFunction => Ok(Object::ECMAScriptConstructorFunction), + Value::ECMAScriptGeneratorFunction => Ok(Object::ECMAScriptGeneratorFunction), + Value::BigIntObject => Ok(Object::BigIntObject), + Value::BooleanObject => Ok(Object::BooleanObject), + Value::NumberObject => Ok(Object::NumberObject), + Value::StringObject => Ok(Object::StringObject), + Value::SymbolObject => Ok(Object::SymbolObject), + Value::Arguments => Ok(Object::Arguments), + Value::ArrayBuffer(idx) => Ok(Object::ArrayBuffer(idx)), + Value::DataView => Ok(Object::DataView), + Value::FinalizationRegistry => Ok(Object::FinalizationRegistry), + Value::Map => Ok(Object::Map), + Value::Promise => Ok(Object::Promise), + Value::Proxy => Ok(Object::Proxy), + Value::RegExp(idx) => Ok(Object::RegExp(idx)), + Value::Set => Ok(Object::Set), + Value::SharedArrayBuffer => Ok(Object::SharedArrayBuffer), + Value::WeakMap => Ok(Object::WeakMap), + Value::WeakRef => Ok(Object::WeakRef), + Value::WeakSet => Ok(Object::WeakSet), + Value::Int8Array => Ok(Object::Int8Array), + Value::Uint8Array => Ok(Object::Uint8Array), + Value::Uint8ClampedArray => Ok(Object::Uint8ClampedArray), + Value::Int16Array => Ok(Object::Int16Array), + Value::Uint16Array => Ok(Object::Uint16Array), + Value::Int32Array => Ok(Object::Int32Array), + Value::Uint32Array => Ok(Object::Uint32Array), + Value::BigInt64Array => Ok(Object::BigInt64Array), + Value::BigUint64Array => Ok(Object::BigUint64Array), + Value::Float32Array => Ok(Object::Float32Array), + Value::Float64Array => Ok(Object::Float64Array), + Value::AsyncFromSyncIterator => Ok(Object::AsyncFromSyncIterator), + Value::AsyncIterator => Ok(Object::AsyncIterator), + Value::Iterator => Ok(Object::Iterator), + Value::Module => Ok(Object::Module), + Value::EmbedderObject => Ok(Object::EmbedderObject), } } } @@ -223,6 +336,49 @@ impl OrdinaryObjectInternalSlots for Object { Object::BoundFunction(idx) => Function::from(idx).extensible(agent), Object::BuiltinFunction(idx) => Function::from(idx).extensible(agent), Object::ECMAScriptFunction(idx) => Function::from(idx).extensible(agent), + Object::BuiltinGeneratorFunction => todo!(), + Object::BuiltinConstructorFunction => todo!(), + Object::BuiltinPromiseResolveFunction => todo!(), + Object::BuiltinPromiseRejectFunction => todo!(), + Object::BuiltinPromiseCollectorFunction => todo!(), + Object::BuiltinProxyRevokerFunction => todo!(), + Object::ECMAScriptAsyncFunction => todo!(), + Object::ECMAScriptAsyncGeneratorFunction => todo!(), + Object::ECMAScriptConstructorFunction => todo!(), + Object::ECMAScriptGeneratorFunction => todo!(), + Object::BigIntObject => todo!(), + Object::BooleanObject => todo!(), + Object::NumberObject => todo!(), + Object::StringObject => todo!(), + Object::SymbolObject => todo!(), + Object::Arguments => todo!(), + Object::DataView => todo!(), + Object::FinalizationRegistry => todo!(), + Object::Map => todo!(), + Object::Promise => todo!(), + Object::Proxy => todo!(), + Object::RegExp(_) => todo!(), + Object::Set => todo!(), + Object::SharedArrayBuffer => todo!(), + Object::WeakMap => todo!(), + Object::WeakRef => todo!(), + Object::WeakSet => todo!(), + Object::Int8Array => todo!(), + Object::Uint8Array => todo!(), + Object::Uint8ClampedArray => todo!(), + Object::Int16Array => todo!(), + Object::Uint16Array => todo!(), + Object::Int32Array => todo!(), + Object::Uint32Array => todo!(), + Object::BigInt64Array => todo!(), + Object::BigUint64Array => todo!(), + Object::Float32Array => todo!(), + Object::Float64Array => todo!(), + Object::AsyncFromSyncIterator => todo!(), + Object::AsyncIterator => todo!(), + Object::Iterator => todo!(), + Object::Module => todo!(), + Object::EmbedderObject => todo!(), } } @@ -236,6 +392,49 @@ impl OrdinaryObjectInternalSlots for Object { Object::BoundFunction(idx) => Function::from(idx).set_extensible(agent, value), Object::BuiltinFunction(idx) => Function::from(idx).set_extensible(agent, value), Object::ECMAScriptFunction(idx) => Function::from(idx).set_extensible(agent, value), + Object::BuiltinGeneratorFunction => todo!(), + Object::BuiltinConstructorFunction => todo!(), + Object::BuiltinPromiseResolveFunction => todo!(), + Object::BuiltinPromiseRejectFunction => todo!(), + Object::BuiltinPromiseCollectorFunction => todo!(), + Object::BuiltinProxyRevokerFunction => todo!(), + Object::ECMAScriptAsyncFunction => todo!(), + Object::ECMAScriptAsyncGeneratorFunction => todo!(), + Object::ECMAScriptConstructorFunction => todo!(), + Object::ECMAScriptGeneratorFunction => todo!(), + Object::BigIntObject => todo!(), + Object::BooleanObject => todo!(), + Object::NumberObject => todo!(), + Object::StringObject => todo!(), + Object::SymbolObject => todo!(), + Object::Arguments => todo!(), + Object::DataView => todo!(), + Object::FinalizationRegistry => todo!(), + Object::Map => todo!(), + Object::Promise => todo!(), + Object::Proxy => todo!(), + Object::RegExp(_) => todo!(), + Object::Set => todo!(), + Object::SharedArrayBuffer => todo!(), + Object::WeakMap => todo!(), + Object::WeakRef => todo!(), + Object::WeakSet => todo!(), + Object::Int8Array => todo!(), + Object::Uint8Array => todo!(), + Object::Uint8ClampedArray => todo!(), + Object::Int16Array => todo!(), + Object::Uint16Array => todo!(), + Object::Int32Array => todo!(), + Object::Uint32Array => todo!(), + Object::BigInt64Array => todo!(), + Object::BigUint64Array => todo!(), + Object::Float32Array => todo!(), + Object::Float64Array => todo!(), + Object::AsyncFromSyncIterator => todo!(), + Object::AsyncIterator => todo!(), + Object::Iterator => todo!(), + Object::Module => todo!(), + Object::EmbedderObject => todo!(), } } @@ -249,6 +448,49 @@ impl OrdinaryObjectInternalSlots for Object { Object::BoundFunction(idx) => Function::from(idx).prototype(agent), Object::BuiltinFunction(idx) => Function::from(idx).prototype(agent), Object::ECMAScriptFunction(idx) => Function::from(idx).prototype(agent), + Object::BuiltinGeneratorFunction => todo!(), + Object::BuiltinConstructorFunction => todo!(), + Object::BuiltinPromiseResolveFunction => todo!(), + Object::BuiltinPromiseRejectFunction => todo!(), + Object::BuiltinPromiseCollectorFunction => todo!(), + Object::BuiltinProxyRevokerFunction => todo!(), + Object::ECMAScriptAsyncFunction => todo!(), + Object::ECMAScriptAsyncGeneratorFunction => todo!(), + Object::ECMAScriptConstructorFunction => todo!(), + Object::ECMAScriptGeneratorFunction => todo!(), + Object::BigIntObject => todo!(), + Object::BooleanObject => todo!(), + Object::NumberObject => todo!(), + Object::StringObject => todo!(), + Object::SymbolObject => todo!(), + Object::Arguments => todo!(), + Object::DataView => todo!(), + Object::FinalizationRegistry => todo!(), + Object::Map => todo!(), + Object::Promise => todo!(), + Object::Proxy => todo!(), + Object::RegExp(_) => todo!(), + Object::Set => todo!(), + Object::SharedArrayBuffer => todo!(), + Object::WeakMap => todo!(), + Object::WeakRef => todo!(), + Object::WeakSet => todo!(), + Object::Int8Array => todo!(), + Object::Uint8Array => todo!(), + Object::Uint8ClampedArray => todo!(), + Object::Int16Array => todo!(), + Object::Uint16Array => todo!(), + Object::Int32Array => todo!(), + Object::Uint32Array => todo!(), + Object::BigInt64Array => todo!(), + Object::BigUint64Array => todo!(), + Object::Float32Array => todo!(), + Object::Float64Array => todo!(), + Object::AsyncFromSyncIterator => todo!(), + Object::AsyncIterator => todo!(), + Object::Iterator => todo!(), + Object::Module => todo!(), + Object::EmbedderObject => todo!(), } } @@ -262,6 +504,49 @@ impl OrdinaryObjectInternalSlots for Object { Object::BoundFunction(idx) => Function::from(idx).set_prototype(agent, prototype), Object::BuiltinFunction(idx) => Function::from(idx).set_prototype(agent, prototype), Object::ECMAScriptFunction(idx) => Function::from(idx).set_prototype(agent, prototype), + Object::BuiltinGeneratorFunction => todo!(), + Object::BuiltinConstructorFunction => todo!(), + Object::BuiltinPromiseResolveFunction => todo!(), + Object::BuiltinPromiseRejectFunction => todo!(), + Object::BuiltinPromiseCollectorFunction => todo!(), + Object::BuiltinProxyRevokerFunction => todo!(), + Object::ECMAScriptAsyncFunction => todo!(), + Object::ECMAScriptAsyncGeneratorFunction => todo!(), + Object::ECMAScriptConstructorFunction => todo!(), + Object::ECMAScriptGeneratorFunction => todo!(), + Object::BigIntObject => todo!(), + Object::BooleanObject => todo!(), + Object::NumberObject => todo!(), + Object::StringObject => todo!(), + Object::SymbolObject => todo!(), + Object::Arguments => todo!(), + Object::DataView => todo!(), + Object::FinalizationRegistry => todo!(), + Object::Map => todo!(), + Object::Promise => todo!(), + Object::Proxy => todo!(), + Object::RegExp(_) => todo!(), + Object::Set => todo!(), + Object::SharedArrayBuffer => todo!(), + Object::WeakMap => todo!(), + Object::WeakRef => todo!(), + Object::WeakSet => todo!(), + Object::Int8Array => todo!(), + Object::Uint8Array => todo!(), + Object::Uint8ClampedArray => todo!(), + Object::Int16Array => todo!(), + Object::Uint16Array => todo!(), + Object::Int32Array => todo!(), + Object::Uint32Array => todo!(), + Object::BigInt64Array => todo!(), + Object::BigUint64Array => todo!(), + Object::Float32Array => todo!(), + Object::Float64Array => todo!(), + Object::AsyncFromSyncIterator => todo!(), + Object::AsyncIterator => todo!(), + Object::Iterator => todo!(), + Object::Module => todo!(), + Object::EmbedderObject => todo!(), } } } @@ -277,6 +562,49 @@ impl InternalMethods for Object { Object::BoundFunction(idx) => Function::from(idx).get_prototype_of(agent), Object::BuiltinFunction(idx) => Function::from(idx).get_prototype_of(agent), Object::ECMAScriptFunction(idx) => Function::from(idx).get_prototype_of(agent), + Object::BuiltinGeneratorFunction => todo!(), + Object::BuiltinConstructorFunction => todo!(), + Object::BuiltinPromiseResolveFunction => todo!(), + Object::BuiltinPromiseRejectFunction => todo!(), + Object::BuiltinPromiseCollectorFunction => todo!(), + Object::BuiltinProxyRevokerFunction => todo!(), + Object::ECMAScriptAsyncFunction => todo!(), + Object::ECMAScriptAsyncGeneratorFunction => todo!(), + Object::ECMAScriptConstructorFunction => todo!(), + Object::ECMAScriptGeneratorFunction => todo!(), + Object::BigIntObject => todo!(), + Object::BooleanObject => todo!(), + Object::NumberObject => todo!(), + Object::StringObject => todo!(), + Object::SymbolObject => todo!(), + Object::Arguments => todo!(), + Object::DataView => todo!(), + Object::FinalizationRegistry => todo!(), + Object::Map => todo!(), + Object::Promise => todo!(), + Object::Proxy => todo!(), + Object::RegExp(_) => todo!(), + Object::Set => todo!(), + Object::SharedArrayBuffer => todo!(), + Object::WeakMap => todo!(), + Object::WeakRef => todo!(), + Object::WeakSet => todo!(), + Object::Int8Array => todo!(), + Object::Uint8Array => todo!(), + Object::Uint8ClampedArray => todo!(), + Object::Int16Array => todo!(), + Object::Uint16Array => todo!(), + Object::Int32Array => todo!(), + Object::Uint32Array => todo!(), + Object::BigInt64Array => todo!(), + Object::BigUint64Array => todo!(), + Object::Float32Array => todo!(), + Object::Float64Array => todo!(), + Object::AsyncFromSyncIterator => todo!(), + Object::AsyncIterator => todo!(), + Object::Iterator => todo!(), + Object::Module => todo!(), + Object::EmbedderObject => todo!(), } } @@ -292,6 +620,49 @@ impl InternalMethods for Object { Object::ECMAScriptFunction(idx) => { Function::from(idx).set_prototype_of(agent, prototype) } + Object::BuiltinGeneratorFunction => todo!(), + Object::BuiltinConstructorFunction => todo!(), + Object::BuiltinPromiseResolveFunction => todo!(), + Object::BuiltinPromiseRejectFunction => todo!(), + Object::BuiltinPromiseCollectorFunction => todo!(), + Object::BuiltinProxyRevokerFunction => todo!(), + Object::ECMAScriptAsyncFunction => todo!(), + Object::ECMAScriptAsyncGeneratorFunction => todo!(), + Object::ECMAScriptConstructorFunction => todo!(), + Object::ECMAScriptGeneratorFunction => todo!(), + Object::BigIntObject => todo!(), + Object::BooleanObject => todo!(), + Object::NumberObject => todo!(), + Object::StringObject => todo!(), + Object::SymbolObject => todo!(), + Object::Arguments => todo!(), + Object::DataView => todo!(), + Object::FinalizationRegistry => todo!(), + Object::Map => todo!(), + Object::Promise => todo!(), + Object::Proxy => todo!(), + Object::RegExp(_) => todo!(), + Object::Set => todo!(), + Object::SharedArrayBuffer => todo!(), + Object::WeakMap => todo!(), + Object::WeakRef => todo!(), + Object::WeakSet => todo!(), + Object::Int8Array => todo!(), + Object::Uint8Array => todo!(), + Object::Uint8ClampedArray => todo!(), + Object::Int16Array => todo!(), + Object::Uint16Array => todo!(), + Object::Int32Array => todo!(), + Object::Uint32Array => todo!(), + Object::BigInt64Array => todo!(), + Object::BigUint64Array => todo!(), + Object::Float32Array => todo!(), + Object::Float64Array => todo!(), + Object::AsyncFromSyncIterator => todo!(), + Object::AsyncIterator => todo!(), + Object::Iterator => todo!(), + Object::Module => todo!(), + Object::EmbedderObject => todo!(), } } @@ -305,6 +676,49 @@ impl InternalMethods for Object { Object::BoundFunction(idx) => Function::from(idx).is_extensible(agent), Object::BuiltinFunction(idx) => Function::from(idx).is_extensible(agent), Object::ECMAScriptFunction(idx) => Function::from(idx).is_extensible(agent), + Object::BuiltinGeneratorFunction => todo!(), + Object::BuiltinConstructorFunction => todo!(), + Object::BuiltinPromiseResolveFunction => todo!(), + Object::BuiltinPromiseRejectFunction => todo!(), + Object::BuiltinPromiseCollectorFunction => todo!(), + Object::BuiltinProxyRevokerFunction => todo!(), + Object::ECMAScriptAsyncFunction => todo!(), + Object::ECMAScriptAsyncGeneratorFunction => todo!(), + Object::ECMAScriptConstructorFunction => todo!(), + Object::ECMAScriptGeneratorFunction => todo!(), + Object::BigIntObject => todo!(), + Object::BooleanObject => todo!(), + Object::NumberObject => todo!(), + Object::StringObject => todo!(), + Object::SymbolObject => todo!(), + Object::Arguments => todo!(), + Object::DataView => todo!(), + Object::FinalizationRegistry => todo!(), + Object::Map => todo!(), + Object::Promise => todo!(), + Object::Proxy => todo!(), + Object::RegExp(_) => todo!(), + Object::Set => todo!(), + Object::SharedArrayBuffer => todo!(), + Object::WeakMap => todo!(), + Object::WeakRef => todo!(), + Object::WeakSet => todo!(), + Object::Int8Array => todo!(), + Object::Uint8Array => todo!(), + Object::Uint8ClampedArray => todo!(), + Object::Int16Array => todo!(), + Object::Uint16Array => todo!(), + Object::Int32Array => todo!(), + Object::Uint32Array => todo!(), + Object::BigInt64Array => todo!(), + Object::BigUint64Array => todo!(), + Object::Float32Array => todo!(), + Object::Float64Array => todo!(), + Object::AsyncFromSyncIterator => todo!(), + Object::AsyncIterator => todo!(), + Object::Iterator => todo!(), + Object::Module => todo!(), + Object::EmbedderObject => todo!(), } } @@ -318,6 +732,49 @@ impl InternalMethods for Object { Object::BoundFunction(idx) => Function::from(idx).prevent_extensions(agent), Object::BuiltinFunction(idx) => Function::from(idx).prevent_extensions(agent), Object::ECMAScriptFunction(idx) => Function::from(idx).prevent_extensions(agent), + Object::BuiltinGeneratorFunction => todo!(), + Object::BuiltinConstructorFunction => todo!(), + Object::BuiltinPromiseResolveFunction => todo!(), + Object::BuiltinPromiseRejectFunction => todo!(), + Object::BuiltinPromiseCollectorFunction => todo!(), + Object::BuiltinProxyRevokerFunction => todo!(), + Object::ECMAScriptAsyncFunction => todo!(), + Object::ECMAScriptAsyncGeneratorFunction => todo!(), + Object::ECMAScriptConstructorFunction => todo!(), + Object::ECMAScriptGeneratorFunction => todo!(), + Object::BigIntObject => todo!(), + Object::BooleanObject => todo!(), + Object::NumberObject => todo!(), + Object::StringObject => todo!(), + Object::SymbolObject => todo!(), + Object::Arguments => todo!(), + Object::DataView => todo!(), + Object::FinalizationRegistry => todo!(), + Object::Map => todo!(), + Object::Promise => todo!(), + Object::Proxy => todo!(), + Object::RegExp(_) => todo!(), + Object::Set => todo!(), + Object::SharedArrayBuffer => todo!(), + Object::WeakMap => todo!(), + Object::WeakRef => todo!(), + Object::WeakSet => todo!(), + Object::Int8Array => todo!(), + Object::Uint8Array => todo!(), + Object::Uint8ClampedArray => todo!(), + Object::Int16Array => todo!(), + Object::Uint16Array => todo!(), + Object::Int32Array => todo!(), + Object::Uint32Array => todo!(), + Object::BigInt64Array => todo!(), + Object::BigUint64Array => todo!(), + Object::Float32Array => todo!(), + Object::Float64Array => todo!(), + Object::AsyncFromSyncIterator => todo!(), + Object::AsyncIterator => todo!(), + Object::Iterator => todo!(), + Object::Module => todo!(), + Object::EmbedderObject => todo!(), } } @@ -341,6 +798,49 @@ impl InternalMethods for Object { Object::ECMAScriptFunction(idx) => { Function::from(idx).get_own_property(agent, property_key) } + Object::BuiltinGeneratorFunction => todo!(), + Object::BuiltinConstructorFunction => todo!(), + Object::BuiltinPromiseResolveFunction => todo!(), + Object::BuiltinPromiseRejectFunction => todo!(), + Object::BuiltinPromiseCollectorFunction => todo!(), + Object::BuiltinProxyRevokerFunction => todo!(), + Object::ECMAScriptAsyncFunction => todo!(), + Object::ECMAScriptAsyncGeneratorFunction => todo!(), + Object::ECMAScriptConstructorFunction => todo!(), + Object::ECMAScriptGeneratorFunction => todo!(), + Object::BigIntObject => todo!(), + Object::BooleanObject => todo!(), + Object::NumberObject => todo!(), + Object::StringObject => todo!(), + Object::SymbolObject => todo!(), + Object::Arguments => todo!(), + Object::DataView => todo!(), + Object::FinalizationRegistry => todo!(), + Object::Map => todo!(), + Object::Promise => todo!(), + Object::Proxy => todo!(), + Object::RegExp(_) => todo!(), + Object::Set => todo!(), + Object::SharedArrayBuffer => todo!(), + Object::WeakMap => todo!(), + Object::WeakRef => todo!(), + Object::WeakSet => todo!(), + Object::Int8Array => todo!(), + Object::Uint8Array => todo!(), + Object::Uint8ClampedArray => todo!(), + Object::Int16Array => todo!(), + Object::Uint16Array => todo!(), + Object::Int32Array => todo!(), + Object::Uint32Array => todo!(), + Object::BigInt64Array => todo!(), + Object::BigUint64Array => todo!(), + Object::Float32Array => todo!(), + Object::Float64Array => todo!(), + Object::AsyncFromSyncIterator => todo!(), + Object::AsyncIterator => todo!(), + Object::Iterator => todo!(), + Object::Module => todo!(), + Object::EmbedderObject => todo!(), } } @@ -377,6 +877,49 @@ impl InternalMethods for Object { Object::ECMAScriptFunction(idx) => { Function::from(idx).define_own_property(agent, property_key, property_descriptor) } + Object::BuiltinGeneratorFunction => todo!(), + Object::BuiltinConstructorFunction => todo!(), + Object::BuiltinPromiseResolveFunction => todo!(), + Object::BuiltinPromiseRejectFunction => todo!(), + Object::BuiltinPromiseCollectorFunction => todo!(), + Object::BuiltinProxyRevokerFunction => todo!(), + Object::ECMAScriptAsyncFunction => todo!(), + Object::ECMAScriptAsyncGeneratorFunction => todo!(), + Object::ECMAScriptConstructorFunction => todo!(), + Object::ECMAScriptGeneratorFunction => todo!(), + Object::BigIntObject => todo!(), + Object::BooleanObject => todo!(), + Object::NumberObject => todo!(), + Object::StringObject => todo!(), + Object::SymbolObject => todo!(), + Object::Arguments => todo!(), + Object::DataView => todo!(), + Object::FinalizationRegistry => todo!(), + Object::Map => todo!(), + Object::Promise => todo!(), + Object::Proxy => todo!(), + Object::RegExp(_) => todo!(), + Object::Set => todo!(), + Object::SharedArrayBuffer => todo!(), + Object::WeakMap => todo!(), + Object::WeakRef => todo!(), + Object::WeakSet => todo!(), + Object::Int8Array => todo!(), + Object::Uint8Array => todo!(), + Object::Uint8ClampedArray => todo!(), + Object::Int16Array => todo!(), + Object::Uint16Array => todo!(), + Object::Int32Array => todo!(), + Object::Uint32Array => todo!(), + Object::BigInt64Array => todo!(), + Object::BigUint64Array => todo!(), + Object::Float32Array => todo!(), + Object::Float64Array => todo!(), + Object::AsyncFromSyncIterator => todo!(), + Object::AsyncIterator => todo!(), + Object::Iterator => todo!(), + Object::Module => todo!(), + Object::EmbedderObject => todo!(), } } @@ -392,6 +935,49 @@ impl InternalMethods for Object { Object::ECMAScriptFunction(idx) => { Function::from(idx).has_property(agent, property_key) } + Object::BuiltinGeneratorFunction => todo!(), + Object::BuiltinConstructorFunction => todo!(), + Object::BuiltinPromiseResolveFunction => todo!(), + Object::BuiltinPromiseRejectFunction => todo!(), + Object::BuiltinPromiseCollectorFunction => todo!(), + Object::BuiltinProxyRevokerFunction => todo!(), + Object::ECMAScriptAsyncFunction => todo!(), + Object::ECMAScriptAsyncGeneratorFunction => todo!(), + Object::ECMAScriptConstructorFunction => todo!(), + Object::ECMAScriptGeneratorFunction => todo!(), + Object::BigIntObject => todo!(), + Object::BooleanObject => todo!(), + Object::NumberObject => todo!(), + Object::StringObject => todo!(), + Object::SymbolObject => todo!(), + Object::Arguments => todo!(), + Object::DataView => todo!(), + Object::FinalizationRegistry => todo!(), + Object::Map => todo!(), + Object::Promise => todo!(), + Object::Proxy => todo!(), + Object::RegExp(_) => todo!(), + Object::Set => todo!(), + Object::SharedArrayBuffer => todo!(), + Object::WeakMap => todo!(), + Object::WeakRef => todo!(), + Object::WeakSet => todo!(), + Object::Int8Array => todo!(), + Object::Uint8Array => todo!(), + Object::Uint8ClampedArray => todo!(), + Object::Int16Array => todo!(), + Object::Uint16Array => todo!(), + Object::Int32Array => todo!(), + Object::Uint32Array => todo!(), + Object::BigInt64Array => todo!(), + Object::BigUint64Array => todo!(), + Object::Float32Array => todo!(), + Object::Float64Array => todo!(), + Object::AsyncFromSyncIterator => todo!(), + Object::AsyncIterator => todo!(), + Object::Iterator => todo!(), + Object::Module => todo!(), + Object::EmbedderObject => todo!(), } } @@ -409,6 +995,49 @@ impl InternalMethods for Object { Object::ECMAScriptFunction(idx) => { ECMAScriptFunction::from(idx).get(agent, property_key, receiver) } + Object::BuiltinGeneratorFunction => todo!(), + Object::BuiltinConstructorFunction => todo!(), + Object::BuiltinPromiseResolveFunction => todo!(), + Object::BuiltinPromiseRejectFunction => todo!(), + Object::BuiltinPromiseCollectorFunction => todo!(), + Object::BuiltinProxyRevokerFunction => todo!(), + Object::ECMAScriptAsyncFunction => todo!(), + Object::ECMAScriptAsyncGeneratorFunction => todo!(), + Object::ECMAScriptConstructorFunction => todo!(), + Object::ECMAScriptGeneratorFunction => todo!(), + Object::BigIntObject => todo!(), + Object::BooleanObject => todo!(), + Object::NumberObject => todo!(), + Object::StringObject => todo!(), + Object::SymbolObject => todo!(), + Object::Arguments => todo!(), + Object::DataView => todo!(), + Object::FinalizationRegistry => todo!(), + Object::Map => todo!(), + Object::Promise => todo!(), + Object::Proxy => todo!(), + Object::RegExp(_) => todo!(), + Object::Set => todo!(), + Object::SharedArrayBuffer => todo!(), + Object::WeakMap => todo!(), + Object::WeakRef => todo!(), + Object::WeakSet => todo!(), + Object::Int8Array => todo!(), + Object::Uint8Array => todo!(), + Object::Uint8ClampedArray => todo!(), + Object::Int16Array => todo!(), + Object::Uint16Array => todo!(), + Object::Int32Array => todo!(), + Object::Uint32Array => todo!(), + Object::BigInt64Array => todo!(), + Object::BigUint64Array => todo!(), + Object::Float32Array => todo!(), + Object::Float64Array => todo!(), + Object::AsyncFromSyncIterator => todo!(), + Object::AsyncIterator => todo!(), + Object::Iterator => todo!(), + Object::Module => todo!(), + Object::EmbedderObject => todo!(), } } @@ -438,6 +1067,49 @@ impl InternalMethods for Object { Object::ECMAScriptFunction(idx) => { Function::from(idx).set(agent, property_key, value, receiver) } + Object::BuiltinGeneratorFunction => todo!(), + Object::BuiltinConstructorFunction => todo!(), + Object::BuiltinPromiseResolveFunction => todo!(), + Object::BuiltinPromiseRejectFunction => todo!(), + Object::BuiltinPromiseCollectorFunction => todo!(), + Object::BuiltinProxyRevokerFunction => todo!(), + Object::ECMAScriptAsyncFunction => todo!(), + Object::ECMAScriptAsyncGeneratorFunction => todo!(), + Object::ECMAScriptConstructorFunction => todo!(), + Object::ECMAScriptGeneratorFunction => todo!(), + Object::BigIntObject => todo!(), + Object::BooleanObject => todo!(), + Object::NumberObject => todo!(), + Object::StringObject => todo!(), + Object::SymbolObject => todo!(), + Object::Arguments => todo!(), + Object::DataView => todo!(), + Object::FinalizationRegistry => todo!(), + Object::Map => todo!(), + Object::Promise => todo!(), + Object::Proxy => todo!(), + Object::RegExp(_) => todo!(), + Object::Set => todo!(), + Object::SharedArrayBuffer => todo!(), + Object::WeakMap => todo!(), + Object::WeakRef => todo!(), + Object::WeakSet => todo!(), + Object::Int8Array => todo!(), + Object::Uint8Array => todo!(), + Object::Uint8ClampedArray => todo!(), + Object::Int16Array => todo!(), + Object::Uint16Array => todo!(), + Object::Int32Array => todo!(), + Object::Uint32Array => todo!(), + Object::BigInt64Array => todo!(), + Object::BigUint64Array => todo!(), + Object::Float32Array => todo!(), + Object::Float64Array => todo!(), + Object::AsyncFromSyncIterator => todo!(), + Object::AsyncIterator => todo!(), + Object::Iterator => todo!(), + Object::Module => todo!(), + Object::EmbedderObject => todo!(), } } @@ -451,6 +1123,49 @@ impl InternalMethods for Object { Object::BoundFunction(idx) => Function::from(idx).delete(agent, property_key), Object::BuiltinFunction(idx) => Function::from(idx).delete(agent, property_key), Object::ECMAScriptFunction(idx) => Function::from(idx).delete(agent, property_key), + Object::BuiltinGeneratorFunction => todo!(), + Object::BuiltinConstructorFunction => todo!(), + Object::BuiltinPromiseResolveFunction => todo!(), + Object::BuiltinPromiseRejectFunction => todo!(), + Object::BuiltinPromiseCollectorFunction => todo!(), + Object::BuiltinProxyRevokerFunction => todo!(), + Object::ECMAScriptAsyncFunction => todo!(), + Object::ECMAScriptAsyncGeneratorFunction => todo!(), + Object::ECMAScriptConstructorFunction => todo!(), + Object::ECMAScriptGeneratorFunction => todo!(), + Object::BigIntObject => todo!(), + Object::BooleanObject => todo!(), + Object::NumberObject => todo!(), + Object::StringObject => todo!(), + Object::SymbolObject => todo!(), + Object::Arguments => todo!(), + Object::DataView => todo!(), + Object::FinalizationRegistry => todo!(), + Object::Map => todo!(), + Object::Promise => todo!(), + Object::Proxy => todo!(), + Object::RegExp(_) => todo!(), + Object::Set => todo!(), + Object::SharedArrayBuffer => todo!(), + Object::WeakMap => todo!(), + Object::WeakRef => todo!(), + Object::WeakSet => todo!(), + Object::Int8Array => todo!(), + Object::Uint8Array => todo!(), + Object::Uint8ClampedArray => todo!(), + Object::Int16Array => todo!(), + Object::Uint16Array => todo!(), + Object::Int32Array => todo!(), + Object::Uint32Array => todo!(), + Object::BigInt64Array => todo!(), + Object::BigUint64Array => todo!(), + Object::Float32Array => todo!(), + Object::Float64Array => todo!(), + Object::AsyncFromSyncIterator => todo!(), + Object::AsyncIterator => todo!(), + Object::Iterator => todo!(), + Object::Module => todo!(), + Object::EmbedderObject => todo!(), } } @@ -464,6 +1179,49 @@ impl InternalMethods for Object { Object::BoundFunction(idx) => Function::from(idx).own_property_keys(agent), Object::BuiltinFunction(idx) => Function::from(idx).own_property_keys(agent), Object::ECMAScriptFunction(idx) => Function::from(idx).own_property_keys(agent), + Object::BuiltinGeneratorFunction => todo!(), + Object::BuiltinConstructorFunction => todo!(), + Object::BuiltinPromiseResolveFunction => todo!(), + Object::BuiltinPromiseRejectFunction => todo!(), + Object::BuiltinPromiseCollectorFunction => todo!(), + Object::BuiltinProxyRevokerFunction => todo!(), + Object::ECMAScriptAsyncFunction => todo!(), + Object::ECMAScriptAsyncGeneratorFunction => todo!(), + Object::ECMAScriptConstructorFunction => todo!(), + Object::ECMAScriptGeneratorFunction => todo!(), + Object::BigIntObject => todo!(), + Object::BooleanObject => todo!(), + Object::NumberObject => todo!(), + Object::StringObject => todo!(), + Object::SymbolObject => todo!(), + Object::Arguments => todo!(), + Object::DataView => todo!(), + Object::FinalizationRegistry => todo!(), + Object::Map => todo!(), + Object::Promise => todo!(), + Object::Proxy => todo!(), + Object::RegExp(_) => todo!(), + Object::Set => todo!(), + Object::SharedArrayBuffer => todo!(), + Object::WeakMap => todo!(), + Object::WeakRef => todo!(), + Object::WeakSet => todo!(), + Object::Int8Array => todo!(), + Object::Uint8Array => todo!(), + Object::Uint8ClampedArray => todo!(), + Object::Int16Array => todo!(), + Object::Uint16Array => todo!(), + Object::Int32Array => todo!(), + Object::Uint32Array => todo!(), + Object::BigInt64Array => todo!(), + Object::BigUint64Array => todo!(), + Object::Float32Array => todo!(), + Object::Float64Array => todo!(), + Object::AsyncFromSyncIterator => todo!(), + Object::AsyncIterator => todo!(), + Object::Iterator => todo!(), + Object::Module => todo!(), + Object::EmbedderObject => todo!(), } } @@ -483,6 +1241,7 @@ impl InternalMethods for Object { Object::ECMAScriptFunction(idx) => { Function::from(idx).call(agent, this_value, arguments_list) } + Object::EmbedderObject => todo!(), _ => unreachable!(), } } diff --git a/nova_vm/src/ecmascript/types/language/value.rs b/nova_vm/src/ecmascript/types/language/value.rs index fd2642923..cb866ba30 100644 --- a/nova_vm/src/ecmascript/types/language/value.rs +++ b/nova_vm/src/ecmascript/types/language/value.rs @@ -53,23 +53,76 @@ pub enum Value { /// ### [6.1.7 The Object Type](https://tc39.es/ecma262/#sec-object-type) Object(ObjectIndex), + // Functions + BoundFunction(BoundFunctionIndex), + BuiltinFunction(BuiltinFunctionIndex), + ECMAScriptFunction(ECMAScriptFunctionIndex), + // TODO: Figure out if all the special function types are wanted or if we'd + // prefer to just keep them as internal variants of the three above ones. + BuiltinGeneratorFunction, + BuiltinConstructorFunction, + BuiltinPromiseResolveFunction, + BuiltinPromiseRejectFunction, + BuiltinPromiseCollectorFunction, + BuiltinProxyRevokerFunction, + ECMAScriptAsyncFunction, + ECMAScriptAsyncGeneratorFunction, + ECMAScriptConstructorFunction, + ECMAScriptGeneratorFunction, + + // TODO: Implement primitive value objects, those useless things. + BigIntObject, + BooleanObject, + NumberObject, + StringObject, + SymbolObject, + // Well-known object types // Roughly corresponding to 6.1.7.4 Well-Known Intrinsic Objects // https://tc39.es/ecma262/#sec-well-known-intrinsic-objects + // and 18 ECMAScript Standard Built-in Objects + // https://tc39.es/ecma262/#sec-ecmascript-standard-built-in-objects + Arguments, Array(ArrayIndex), ArrayBuffer(ArrayBufferIndex), + DataView, Date(DateIndex), Error(ErrorIndex), - BoundFunction(BoundFunctionIndex), - BuiltinFunction(BuiltinFunctionIndex), - ECMAScriptFunction(ECMAScriptFunctionIndex), + FinalizationRegistry, + Map, + Promise, + Proxy, RegExp(RegExpIndex), - // TODO: Implement primitive value objects, those useless things. - // BigIntObject(u32), - // BooleanObject(u32), - // NumberObject(u32), - // StringObject(u32), - // SymbolObject(u32), + Set, + SharedArrayBuffer, + WeakMap, + WeakRef, + WeakSet, + + // TypedArrays + Int8Array, + Uint8Array, + Uint8ClampedArray, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + BigInt64Array, + BigUint64Array, + Float32Array, + Float64Array, + + // Iterator objects + // TODO: Figure out if these are needed at all. + AsyncFromSyncIterator, + AsyncIterator, + Iterator, + + // ECMAScript Module + Module, + + // Embedder objects + EmbedderObject = 0x7f, } /// We want to guarantee that all handles to JS values are register sized. This @@ -130,6 +183,63 @@ pub(crate) const BOUND_FUNCTION_DISCRIMINANT: u8 = pub(crate) const REGEXP_DISCRIMINANT: u8 = value_discriminant(Value::RegExp(RegExpIndex::from_u32_index(0))); +pub(crate) const BUILTIN_GENERATOR_FUNCTION_DISCRIMINANT: u8 = + value_discriminant(Value::BuiltinGeneratorFunction); +pub(crate) const BUILTIN_CONSTRUCTOR_FUNCTION_DISCRIMINANT: u8 = + value_discriminant(Value::BuiltinConstructorFunction); +pub(crate) const BUILTIN_PROMISE_RESOLVE_FUNCTION_DISCRIMINANT: u8 = + value_discriminant(Value::BuiltinPromiseResolveFunction); +pub(crate) const BUILTIN_PROMISE_REJECT_FUNCTION_DISCRIMINANT: u8 = + value_discriminant(Value::BuiltinPromiseRejectFunction); +pub(crate) const BUILTIN_PROMISE_COLLECTOR_FUNCTION_DISCRIMINANT: u8 = + value_discriminant(Value::BuiltinPromiseCollectorFunction); +pub(crate) const BUILTIN_PROXY_REVOKER_FUNCTION: u8 = + value_discriminant(Value::BuiltinProxyRevokerFunction); +pub(crate) const ECMASCRIPT_ASYNC_FUNCTION_DISCRIMINANT: u8 = + value_discriminant(Value::ECMAScriptAsyncFunction); +pub(crate) const ECMASCRIPT_ASYNC_GENERATOR_FUNCTION_DISCRIMINANT: u8 = + value_discriminant(Value::ECMAScriptAsyncGeneratorFunction); +pub(crate) const ECMASCRIPT_CONSTRUCTOR_FUNCTION_DISCRIMINANT: u8 = + value_discriminant(Value::ECMAScriptConstructorFunction); +pub(crate) const ECMASCRIPT_GENERATOR_FUNCTION_DISCRIMINANT: u8 = + value_discriminant(Value::ECMAScriptGeneratorFunction); +pub(crate) const BIGINT_OBJECT_DISCRIMINANT: u8 = value_discriminant(Value::BigIntObject); +pub(crate) const BOOLEAN_OBJECT_DISCRIMINANT: u8 = value_discriminant(Value::BooleanObject); +pub(crate) const NUMBER_OBJECT_DISCRIMINANT: u8 = value_discriminant(Value::NumberObject); +pub(crate) const STRING_OBJECT_DISCRIMINANT: u8 = value_discriminant(Value::StringObject); +pub(crate) const SYMBOL_OBJECT_DISCRIMINANT: u8 = value_discriminant(Value::SymbolObject); +pub(crate) const ARGUMENTS_DISCRIMINANT: u8 = value_discriminant(Value::Arguments); +pub(crate) const DATA_VIEW_DISCRIMINANT: u8 = value_discriminant(Value::DataView); +pub(crate) const FINALIZATION_REGISTRY_DISCRIMINANT: u8 = + value_discriminant(Value::FinalizationRegistry); +pub(crate) const MAP_DISCRIMINANT: u8 = value_discriminant(Value::Map); +pub(crate) const PROMISE_DISCRIMINANT: u8 = value_discriminant(Value::Promise); +pub(crate) const PROXY_DISCRIMINANT: u8 = value_discriminant(Value::Proxy); +pub(crate) const SET_DISCRIMINANT: u8 = value_discriminant(Value::Set); +pub(crate) const SHARED_ARRAY_BUFFER_DISCRIMINANT: u8 = + value_discriminant(Value::SharedArrayBuffer); +pub(crate) const WEAK_MAP_DISCRIMINANT: u8 = value_discriminant(Value::WeakMap); +pub(crate) const WEAK_REF_DISCRIMINANT: u8 = value_discriminant(Value::WeakRef); +pub(crate) const WEAK_SET_DISCRIMINANT: u8 = value_discriminant(Value::WeakSet); +pub(crate) const INT_8_ARRAY_DISCRIMINANT: u8 = value_discriminant(Value::Int8Array); +pub(crate) const UINT_8_ARRAY_DISCRIMINANT: u8 = value_discriminant(Value::Uint8Array); +pub(crate) const UINT_8_CLAMPED_ARRAY_DISCRIMINANT: u8 = + value_discriminant(Value::Uint8ClampedArray); +pub(crate) const INT_16_ARRAY_DISCRIMINANT: u8 = value_discriminant(Value::Int16Array); +pub(crate) const UINT_16_ARRAY_DISCRIMINANT: u8 = value_discriminant(Value::Uint16Array); +pub(crate) const INT_32_ARRAY_DISCRIMINANT: u8 = value_discriminant(Value::Int32Array); +pub(crate) const UINT_32_ARRAY_DISCRIMINANT: u8 = value_discriminant(Value::Uint32Array); +pub(crate) const BIGINT_64_ARRAY_DISCRIMINANT: u8 = value_discriminant(Value::BigInt64Array); +pub(crate) const BIGUINT_64_ARRAY_DISCRIMINANT: u8 = value_discriminant(Value::BigUint64Array); +pub(crate) const FLOAT_32_ARRAY_DISCRIMINANT: u8 = value_discriminant(Value::Float32Array); +pub(crate) const FLOAT_64_ARRAY_DISCRIMINANT: u8 = value_discriminant(Value::Float64Array); +pub(crate) const ASYNC_FROM_SYNC_ITERATOR_DISCRIMINANT: u8 = + value_discriminant(Value::AsyncFromSyncIterator); +pub(crate) const ASYNC_ITERATOR_DISCRIMINANT: u8 = value_discriminant(Value::AsyncIterator); +pub(crate) const ITERATOR_DISCRIMINANT: u8 = value_discriminant(Value::Iterator); +pub(crate) const MODULE_DISCRIMINANT: u8 = value_discriminant(Value::Module); +pub(crate) const EMBEDDER_OBJECT_DISCRIMINANT: u8 = value_discriminant(Value::EmbedderObject); + impl Value { pub fn from_str(agent: &mut Agent, str: &str) -> Value { String::from_str(agent, str).into_value() diff --git a/nova_vm/src/engine/bytecode/vm.rs b/nova_vm/src/engine/bytecode/vm.rs index 1c70035b0..8873b39e5 100644 --- a/nova_vm/src/engine/bytecode/vm.rs +++ b/nova_vm/src/engine/bytecode/vm.rs @@ -621,8 +621,51 @@ fn typeof_operator(_: &mut Agent, val: Value) -> String { Value::Date(_) | Value::Error(_) | // 14. Return "object". - Value::RegExp(_) => BUILTIN_STRING_MEMORY.object, + Value::RegExp(_) | + Value::BigIntObject | + Value::BooleanObject | + Value::NumberObject | + Value::StringObject | + Value::SymbolObject | + Value::Arguments | + Value::DataView | + Value::FinalizationRegistry | + Value::Map | + Value::Promise | + Value::Set | + Value::SharedArrayBuffer | + Value::WeakMap | + Value::WeakRef | + Value::WeakSet | + Value::Int8Array | + Value::Uint8Array | + Value::Uint8ClampedArray | + Value::Int16Array | + Value::Uint16Array | + Value::Int32Array | + Value::Uint32Array | + Value::BigInt64Array | + Value::BigUint64Array | + Value::Float32Array | + Value::Float64Array | + Value::AsyncFromSyncIterator | + Value::AsyncIterator | + Value::Iterator | + Value::Module | + Value::EmbedderObject => BUILTIN_STRING_MEMORY.object, // 13. If val has a [[Call]] internal slot, return "function". - Value::BoundFunction(_) | Value::BuiltinFunction(_) | Value::ECMAScriptFunction(_) => BUILTIN_STRING_MEMORY.function, + Value::BoundFunction(_) | Value::BuiltinFunction(_) | Value::ECMAScriptFunction(_) | + Value::BuiltinGeneratorFunction | + Value::BuiltinConstructorFunction | + Value::BuiltinPromiseResolveFunction | + Value::BuiltinPromiseRejectFunction | + Value::BuiltinPromiseCollectorFunction | + Value::BuiltinProxyRevokerFunction | + Value::ECMAScriptAsyncFunction | + Value::ECMAScriptAsyncGeneratorFunction | + Value::ECMAScriptConstructorFunction | + Value::ECMAScriptGeneratorFunction => BUILTIN_STRING_MEMORY.function, + // TODO: Check [[Call]] slot for Proxy + Value::Proxy => todo!(), } } diff --git a/nova_vm/src/heap/heap_bits.rs b/nova_vm/src/heap/heap_bits.rs index e9becd80b..136d0583c 100644 --- a/nova_vm/src/heap/heap_bits.rs +++ b/nova_vm/src/heap/heap_bits.rs @@ -219,6 +219,48 @@ impl WorkQueues { Value::Undefined => {} Value::Integer(_) => {} Value::Float(_) => {} + Value::BigIntObject => todo!(), + Value::BooleanObject => todo!(), + Value::NumberObject => todo!(), + Value::StringObject => todo!(), + Value::SymbolObject => todo!(), + Value::Arguments => todo!(), + Value::DataView => todo!(), + Value::FinalizationRegistry => todo!(), + Value::Map => todo!(), + Value::Proxy => todo!(), + Value::Promise => todo!(), + Value::Set => todo!(), + Value::SharedArrayBuffer => todo!(), + Value::WeakMap => todo!(), + Value::WeakRef => todo!(), + Value::WeakSet => todo!(), + Value::Int8Array => todo!(), + Value::Uint8Array => todo!(), + Value::Uint8ClampedArray => todo!(), + Value::Int16Array => todo!(), + Value::Uint16Array => todo!(), + Value::Int32Array => todo!(), + Value::Uint32Array => todo!(), + Value::BigInt64Array => todo!(), + Value::BigUint64Array => todo!(), + Value::Float32Array => todo!(), + Value::Float64Array => todo!(), + Value::BuiltinGeneratorFunction => todo!(), + Value::BuiltinConstructorFunction => todo!(), + Value::BuiltinPromiseResolveFunction => todo!(), + Value::BuiltinPromiseRejectFunction => todo!(), + Value::BuiltinPromiseCollectorFunction => todo!(), + Value::BuiltinProxyRevokerFunction => todo!(), + Value::ECMAScriptAsyncFunction => todo!(), + Value::ECMAScriptAsyncGeneratorFunction => todo!(), + Value::ECMAScriptConstructorFunction => todo!(), + Value::ECMAScriptGeneratorFunction => todo!(), + Value::AsyncFromSyncIterator => todo!(), + Value::AsyncIterator => todo!(), + Value::Iterator => todo!(), + Value::Module => todo!(), + Value::EmbedderObject => todo!(), } } @@ -840,6 +882,48 @@ impl HeapMarkAndSweep<()> for Value { Value::BuiltinFunction(idx) => idx.mark_values(queues, ()), Value::ECMAScriptFunction(idx) => idx.mark_values(queues, ()), Value::RegExp(idx) => idx.mark_values(queues, ()), + Value::BigIntObject => todo!(), + Value::BooleanObject => todo!(), + Value::NumberObject => todo!(), + Value::StringObject => todo!(), + Value::SymbolObject => todo!(), + Value::Arguments => todo!(), + Value::DataView => todo!(), + Value::FinalizationRegistry => todo!(), + Value::Map => todo!(), + Value::Proxy => todo!(), + Value::Promise => todo!(), + Value::Set => todo!(), + Value::SharedArrayBuffer => todo!(), + Value::WeakMap => todo!(), + Value::WeakRef => todo!(), + Value::WeakSet => todo!(), + Value::Int8Array => todo!(), + Value::Uint8Array => todo!(), + Value::Uint8ClampedArray => todo!(), + Value::Int16Array => todo!(), + Value::Uint16Array => todo!(), + Value::Int32Array => todo!(), + Value::Uint32Array => todo!(), + Value::BigInt64Array => todo!(), + Value::BigUint64Array => todo!(), + Value::Float32Array => todo!(), + Value::Float64Array => todo!(), + Value::BuiltinGeneratorFunction => todo!(), + Value::BuiltinConstructorFunction => todo!(), + Value::BuiltinPromiseResolveFunction => todo!(), + Value::BuiltinPromiseRejectFunction => todo!(), + Value::BuiltinPromiseCollectorFunction => todo!(), + Value::BuiltinProxyRevokerFunction => todo!(), + Value::ECMAScriptAsyncFunction => todo!(), + Value::ECMAScriptAsyncGeneratorFunction => todo!(), + Value::ECMAScriptConstructorFunction => todo!(), + Value::ECMAScriptGeneratorFunction => todo!(), + Value::AsyncFromSyncIterator => todo!(), + Value::AsyncIterator => todo!(), + Value::Iterator => todo!(), + Value::Module => todo!(), + Value::EmbedderObject => todo!(), } } @@ -867,6 +951,48 @@ impl HeapMarkAndSweep<()> for Value { Value::BuiltinFunction(idx) => idx.sweep_values(compactions, ()), Value::ECMAScriptFunction(idx) => idx.sweep_values(compactions, ()), Value::RegExp(idx) => idx.sweep_values(compactions, ()), + Value::BigIntObject => todo!(), + Value::BooleanObject => todo!(), + Value::NumberObject => todo!(), + Value::StringObject => todo!(), + Value::SymbolObject => todo!(), + Value::Arguments => todo!(), + Value::DataView => todo!(), + Value::FinalizationRegistry => todo!(), + Value::Map => todo!(), + Value::Proxy => todo!(), + Value::Promise => todo!(), + Value::Set => todo!(), + Value::SharedArrayBuffer => todo!(), + Value::WeakMap => todo!(), + Value::WeakRef => todo!(), + Value::WeakSet => todo!(), + Value::Int8Array => todo!(), + Value::Uint8Array => todo!(), + Value::Uint8ClampedArray => todo!(), + Value::Int16Array => todo!(), + Value::Uint16Array => todo!(), + Value::Int32Array => todo!(), + Value::Uint32Array => todo!(), + Value::BigInt64Array => todo!(), + Value::BigUint64Array => todo!(), + Value::Float32Array => todo!(), + Value::Float64Array => todo!(), + Value::BuiltinGeneratorFunction => todo!(), + Value::BuiltinConstructorFunction => todo!(), + Value::BuiltinPromiseResolveFunction => todo!(), + Value::BuiltinPromiseRejectFunction => todo!(), + Value::BuiltinPromiseCollectorFunction => todo!(), + Value::BuiltinProxyRevokerFunction => todo!(), + Value::ECMAScriptAsyncFunction => todo!(), + Value::ECMAScriptAsyncGeneratorFunction => todo!(), + Value::ECMAScriptConstructorFunction => todo!(), + Value::ECMAScriptGeneratorFunction => todo!(), + Value::AsyncFromSyncIterator => todo!(), + Value::AsyncIterator => todo!(), + Value::Iterator => todo!(), + Value::Module => todo!(), + Value::EmbedderObject => todo!(), } } } @@ -877,6 +1003,16 @@ impl HeapMarkAndSweep<()> for Function { Function::BoundFunction(idx) => idx.mark_values(queues, ()), Function::BuiltinFunction(idx) => idx.mark_values(queues, ()), Function::ECMAScriptFunction(idx) => idx.mark_values(queues, ()), + Function::BuiltinGeneratorFunction => todo!(), + Function::BuiltinConstructorFunction => todo!(), + Function::BuiltinPromiseResolveFunction => todo!(), + Function::BuiltinPromiseRejectFunction => todo!(), + Function::BuiltinPromiseCollectorFunction => todo!(), + Function::BuiltinProxyRevokerFunction => todo!(), + Function::ECMAScriptAsyncFunction => todo!(), + Function::ECMAScriptAsyncGeneratorFunction => todo!(), + Function::ECMAScriptConstructorFunction => todo!(), + Function::ECMAScriptGeneratorFunction => todo!(), } } @@ -885,6 +1021,16 @@ impl HeapMarkAndSweep<()> for Function { Function::BoundFunction(idx) => idx.sweep_values(compactions, ()), Function::BuiltinFunction(idx) => idx.sweep_values(compactions, ()), Function::ECMAScriptFunction(idx) => idx.sweep_values(compactions, ()), + Function::BuiltinGeneratorFunction => todo!(), + Function::BuiltinConstructorFunction => todo!(), + Function::BuiltinPromiseResolveFunction => todo!(), + Function::BuiltinPromiseRejectFunction => todo!(), + Function::BuiltinPromiseCollectorFunction => todo!(), + Function::BuiltinProxyRevokerFunction => todo!(), + Function::ECMAScriptAsyncFunction => todo!(), + Function::ECMAScriptAsyncGeneratorFunction => todo!(), + Function::ECMAScriptConstructorFunction => todo!(), + Function::ECMAScriptGeneratorFunction => todo!(), } } } @@ -924,6 +1070,49 @@ impl HeapMarkAndSweep<()> for Object { Object::BoundFunction(_) => todo!(), Object::BuiltinFunction(_) => todo!(), Object::ECMAScriptFunction(_) => todo!(), + Object::BuiltinGeneratorFunction => todo!(), + Object::BuiltinConstructorFunction => todo!(), + Object::ECMAScriptAsyncFunction => todo!(), + Object::ECMAScriptAsyncGeneratorFunction => todo!(), + Object::ECMAScriptConstructorFunction => todo!(), + Object::ECMAScriptGeneratorFunction => todo!(), + Object::BuiltinPromiseResolveFunction => todo!(), + Object::BuiltinPromiseRejectFunction => todo!(), + Object::BuiltinPromiseCollectorFunction => todo!(), + Object::BuiltinProxyRevokerFunction => todo!(), + Object::BigIntObject => todo!(), + Object::BooleanObject => todo!(), + Object::NumberObject => todo!(), + Object::StringObject => todo!(), + Object::SymbolObject => todo!(), + Object::Arguments => todo!(), + Object::DataView => todo!(), + Object::FinalizationRegistry => todo!(), + Object::Map => todo!(), + Object::Promise => todo!(), + Object::Proxy => todo!(), + Object::RegExp(_) => todo!(), + Object::Set => todo!(), + Object::SharedArrayBuffer => todo!(), + Object::WeakMap => todo!(), + Object::WeakRef => todo!(), + Object::WeakSet => todo!(), + Object::Int8Array => todo!(), + Object::Uint8Array => todo!(), + Object::Uint8ClampedArray => todo!(), + Object::Int16Array => todo!(), + Object::Uint16Array => todo!(), + Object::Int32Array => todo!(), + Object::Uint32Array => todo!(), + Object::BigInt64Array => todo!(), + Object::BigUint64Array => todo!(), + Object::Float32Array => todo!(), + Object::Float64Array => todo!(), + Object::AsyncFromSyncIterator => todo!(), + Object::AsyncIterator => todo!(), + Object::Iterator => todo!(), + Object::Module => todo!(), + Object::EmbedderObject => todo!(), } } @@ -1324,147 +1513,9 @@ impl HeapMarkAndSweep<()> for Intrinsics { } fn sweep_values(&mut self, compactions: &CompactionLists, _data: impl Borrow<()>) { - self.aggregate_error_prototype() + self.object_index_base.sweep_values(compactions, ()); + self.builtin_function_index_base .sweep_values(compactions, ()); - self.aggregate_error().sweep_values(compactions, ()); - self.array_prototype_sort().sweep_values(compactions, ()); - self.array_prototype_to_string() - .sweep_values(compactions, ()); - self.array_prototype_values().sweep_values(compactions, ()); - self.array_prototype().sweep_values(compactions, ()); - self.array().sweep_values(compactions, ()); - self.array_buffer_prototype().sweep_values(compactions, ()); - self.array_buffer().sweep_values(compactions, ()); - self.array_iterator_prototype() - .sweep_values(compactions, ()); - self.async_from_sync_iterator_prototype() - .sweep_values(compactions, ()); - self.async_function_prototype() - .sweep_values(compactions, ()); - self.async_function().sweep_values(compactions, ()); - self.async_generator_function_prototype_prototype() - .sweep_values(compactions, ()); - self.async_generator_function_prototype() - .sweep_values(compactions, ()); - self.async_generator_function() - .sweep_values(compactions, ()); - self.async_generator_prototype() - .sweep_values(compactions, ()); - self.async_iterator_prototype() - .sweep_values(compactions, ()); - self.atomics().sweep_values(compactions, ()); - self.big_int_prototype().sweep_values(compactions, ()); - self.big_int().sweep_values(compactions, ()); - self.big_int64_array().sweep_values(compactions, ()); - self.big_uint64_array().sweep_values(compactions, ()); - self.boolean_prototype().sweep_values(compactions, ()); - self.boolean().sweep_values(compactions, ()); - self.data_view_prototype().sweep_values(compactions, ()); - self.data_view().sweep_values(compactions, ()); - self.date_prototype_to_utcstring() - .sweep_values(compactions, ()); - self.date_prototype().sweep_values(compactions, ()); - self.date().sweep_values(compactions, ()); - self.decode_uri().sweep_values(compactions, ()); - self.decode_uricomponent().sweep_values(compactions, ()); - self.encode_uri().sweep_values(compactions, ()); - self.encode_uri_component().sweep_values(compactions, ()); - self.error_prototype().sweep_values(compactions, ()); - self.error().sweep_values(compactions, ()); - self.escape().sweep_values(compactions, ()); - self.eval().sweep_values(compactions, ()); - self.eval_error_prototype().sweep_values(compactions, ()); - self.eval_error().sweep_values(compactions, ()); - self.finalization_registry_prototype() - .sweep_values(compactions, ()); - self.finalization_registry().sweep_values(compactions, ()); - self.float32_array().sweep_values(compactions, ()); - self.float64_array().sweep_values(compactions, ()); - self.for_in_iterator_prototype() - .sweep_values(compactions, ()); - self.function_prototype().sweep_values(compactions, ()); - self.function().sweep_values(compactions, ()); - self.generator_function_prototype_prototype_next() - .sweep_values(compactions, ()); - self.generator_function_prototype_prototype() - .sweep_values(compactions, ()); - self.generator_function_prototype() - .sweep_values(compactions, ()); - self.generator_function().sweep_values(compactions, ()); - self.generator_prototype().sweep_values(compactions, ()); - self.int16_array().sweep_values(compactions, ()); - self.int32_array().sweep_values(compactions, ()); - self.int8_array().sweep_values(compactions, ()); - self.is_finite().sweep_values(compactions, ()); - self.is_nan().sweep_values(compactions, ()); - self.iterator_prototype().sweep_values(compactions, ()); - self.json().sweep_values(compactions, ()); - self.map_prototype_entries().sweep_values(compactions, ()); - self.map_prototype().sweep_values(compactions, ()); - self.map().sweep_values(compactions, ()); - self.map_iterator_prototype().sweep_values(compactions, ()); - self.math().sweep_values(compactions, ()); - self.number_prototype().sweep_values(compactions, ()); - self.number().sweep_values(compactions, ()); - self.object_prototype_to_string() - .sweep_values(compactions, ()); - self.object_prototype().sweep_values(compactions, ()); - self.object().sweep_values(compactions, ()); - self.parse_float().sweep_values(compactions, ()); - self.parse_int().sweep_values(compactions, ()); - self.promise_prototype().sweep_values(compactions, ()); - self.promise().sweep_values(compactions, ()); - self.proxy().sweep_values(compactions, ()); - self.range_error_prototype().sweep_values(compactions, ()); - self.range_error().sweep_values(compactions, ()); - self.reference_error_prototype() - .sweep_values(compactions, ()); - self.reference_error().sweep_values(compactions, ()); - self.reflect().sweep_values(compactions, ()); - self.reg_exp_prototype_exec().sweep_values(compactions, ()); - self.reg_exp_prototype().sweep_values(compactions, ()); - self.reg_exp().sweep_values(compactions, ()); - self.reg_exp_string_iterator_prototype() - .sweep_values(compactions, ()); - self.set_prototype_values().sweep_values(compactions, ()); - self.set_prototype().sweep_values(compactions, ()); - self.set().sweep_values(compactions, ()); - self.set_iterator_prototype().sweep_values(compactions, ()); - self.shared_array_buffer_prototype() - .sweep_values(compactions, ()); - self.shared_array_buffer().sweep_values(compactions, ()); - self.string_prototype_trim_end() - .sweep_values(compactions, ()); - self.string_prototype_trim_start() - .sweep_values(compactions, ()); - self.string_prototype().sweep_values(compactions, ()); - self.string().sweep_values(compactions, ()); - self.string_iterator_prototype() - .sweep_values(compactions, ()); - self.symbol_prototype().sweep_values(compactions, ()); - self.symbol().sweep_values(compactions, ()); - self.syntax_error_prototype().sweep_values(compactions, ()); - self.syntax_error().sweep_values(compactions, ()); - self.throw_type_error().sweep_values(compactions, ()); - self.typed_array_prototype_values() - .sweep_values(compactions, ()); - self.typed_array_prototype().sweep_values(compactions, ()); - self.typed_array().sweep_values(compactions, ()); - self.type_error_prototype().sweep_values(compactions, ()); - self.type_error().sweep_values(compactions, ()); - self.uint16_array().sweep_values(compactions, ()); - self.uint32_array().sweep_values(compactions, ()); - self.uint8_array().sweep_values(compactions, ()); - self.uint8_clamped_array().sweep_values(compactions, ()); - self.unescape().sweep_values(compactions, ()); - self.uri_error_prototype().sweep_values(compactions, ()); - self.uri_error().sweep_values(compactions, ()); - self.weak_map_prototype().sweep_values(compactions, ()); - self.weak_map().sweep_values(compactions, ()); - self.weak_ref_prototype().sweep_values(compactions, ()); - self.weak_ref().sweep_values(compactions, ()); - self.weak_set_prototype().sweep_values(compactions, ()); - self.weak_set().sweep_values(compactions, ()); } }