From ea672a0297f43a0326c28d714cf8e10408fde309 Mon Sep 17 00:00:00 2001 From: KAUSTUBHOG Date: Sun, 22 Mar 2026 23:51:36 +0530 Subject: [PATCH] Convert panics in vm/opcode/define/class/, vm/opcode/set/, and vm/opcode/call/ to EngineError::Panic --- core/engine/src/vm/opcode/call/mod.rs | 14 ++++---- .../src/vm/opcode/define/class/getter.rs | 34 ++++++++----------- .../src/vm/opcode/define/class/method.rs | 34 ++++++++----------- .../src/vm/opcode/define/class/setter.rs | 34 ++++++++----------- core/engine/src/vm/opcode/set/name.rs | 4 +-- core/engine/src/vm/opcode/set/private.rs | 6 ++-- 6 files changed, 57 insertions(+), 69 deletions(-) diff --git a/core/engine/src/vm/opcode/call/mod.rs b/core/engine/src/vm/opcode/call/mod.rs index 891ac4efe75..851958c17f6 100644 --- a/core/engine/src/vm/opcode/call/mod.rs +++ b/core/engine/src/vm/opcode/call/mod.rs @@ -5,7 +5,7 @@ use dynify::Dynify; use super::{IndexOperand, RegisterOperand}; use crate::{ - Context, JsError, JsObject, JsResult, JsValue, NativeFunction, + Context, JsError, JsExpect, JsObject, JsResult, JsValue, NativeFunction, builtins::{Promise, promise::PromiseCapability}, error::JsNativeError, job::NativeAsyncJob, @@ -107,12 +107,12 @@ impl CallEvalSpread { let arguments_array = context.vm.stack.pop(); let arguments_array_object = arguments_array .as_object() - .expect("arguments array in call spread function must be an object"); + .js_expect("arguments array in call spread function must be an object")?; let arguments = arguments_array_object .borrow() .properties() .to_dense_indexed_properties() - .expect("arguments array in call spread function must be dense"); + .js_expect("arguments array in call spread function must be dense")?; let func = context.vm.stack.calling_convention_get_function(0); @@ -223,12 +223,12 @@ impl CallSpread { let arguments_array = context.vm.stack.pop(); let arguments_array_object = arguments_array .as_object() - .expect("arguments array in call spread function must be an object"); + .js_expect("arguments array in call spread function must be an object")?; let arguments = arguments_array_object .borrow() .properties() .to_dense_indexed_properties() - .expect("arguments array in call spread function must be dense"); + .js_expect("arguments array in call spread function must be dense")?; let argument_count = arguments.len(); context @@ -303,13 +303,13 @@ fn parse_import_attributes( for entry in entries { let entry = entry .as_object() - .expect("entry from EnumerableOwnProperties must be an object"); + .js_expect("entry from EnumerableOwnProperties must be an object")?; // 1. Let key be entry.[[Key]]. let key = entry.get(0, context)?; let key_str = key .as_string() - .expect("key from EnumerableOwnProperties must be a string") + .js_expect("key from EnumerableOwnProperties must be a string")? .clone(); // 2. Let value be entry.[[Value]]. diff --git a/core/engine/src/vm/opcode/define/class/getter.rs b/core/engine/src/vm/opcode/define/class/getter.rs index 11432391c08..7487a9513a9 100644 --- a/core/engine/src/vm/opcode/define/class/getter.rs +++ b/core/engine/src/vm/opcode/define/class/getter.rs @@ -1,7 +1,7 @@ use boa_macros::js_str; use crate::{ - Context, JsResult, + Context, JsExpect, JsResult, builtins::function::{OrdinaryFunction, set_function_name}, object::internal_methods::InternalMethodPropertyContext, property::PropertyDescriptor, @@ -23,7 +23,7 @@ impl DefineClassStaticGetterByName { ) -> JsResult<()> { let function = context.vm.get_register(function.into()).clone(); let class = context.vm.get_register(class.into()).clone(); - let class = class.as_object().expect("class must be object"); + let class = class.as_object().js_expect("class must be object")?; let key = context .vm .frame() @@ -33,11 +33,11 @@ impl DefineClassStaticGetterByName { { let function_object = function .as_object() - .expect("method must be function object"); + .js_expect("method must be function object")?; set_function_name(&function_object, &key, Some(js_str!("get")), context)?; function_object .downcast_mut::() - .expect("method must be function object") + .js_expect("method must be function object")? .set_home_object(class.clone()); } let set = class @@ -80,7 +80,7 @@ impl DefineClassGetterByName { ) -> JsResult<()> { let function = context.vm.get_register(function.into()).clone(); let class_proto = context.vm.get_register(class_proto.into()).clone(); - let class_proto = class_proto.as_object().expect("class must be object"); + let class_proto = class_proto.as_object().js_expect("class must be object")?; let key = context .vm .frame() @@ -90,11 +90,11 @@ impl DefineClassGetterByName { { let function_object = function .as_object() - .expect("method must be function object"); + .js_expect("method must be function object")?; set_function_name(&function_object, &key, Some(js_str!("get")), context)?; function_object .downcast_mut::() - .expect("method must be function object") + .js_expect("method must be function object")? .set_home_object(class_proto.clone()); } let set = class_proto @@ -138,18 +138,16 @@ impl DefineClassStaticGetterByValue { let function = context.vm.get_register(function.into()).clone(); let key = context.vm.get_register(key.into()).clone(); let class = context.vm.get_register(class.into()).clone(); - let class = class.as_object().expect("class must be object"); - let key = key - .to_property_key(context) - .expect("property key must already be valid"); + let class = class.as_object().js_expect("class must be object")?; + let key = key.to_property_key(context)?; { let function_object = function .as_object() - .expect("method must be function object"); + .js_expect("method must be function object")?; set_function_name(&function_object, &key, Some(js_str!("get")), context)?; function_object .downcast_mut::() - .expect("method must be function object") + .js_expect("method must be function object")? .set_home_object(class.clone()); } @@ -194,18 +192,16 @@ impl DefineClassGetterByValue { let function = context.vm.get_register(function.into()).clone(); let key = context.vm.get_register(key.into()).clone(); let class_proto = context.vm.get_register(class_proto.into()).clone(); - let class_proto = class_proto.as_object().expect("class must be object"); - let key = key - .to_property_key(context) - .expect("property key must already be valid"); + let class_proto = class_proto.as_object().js_expect("class must be object")?; + let key = key.to_property_key(context)?; { let function_object = function .as_object() - .expect("method must be function object"); + .js_expect("method must be function object")?; set_function_name(&function_object, &key, Some(js_str!("get")), context)?; function_object .downcast_mut::() - .expect("method must be function object") + .js_expect("method must be function object")? .set_home_object(class_proto.clone()); } let set = class_proto diff --git a/core/engine/src/vm/opcode/define/class/method.rs b/core/engine/src/vm/opcode/define/class/method.rs index 066ae94b27c..835ba01104d 100644 --- a/core/engine/src/vm/opcode/define/class/method.rs +++ b/core/engine/src/vm/opcode/define/class/method.rs @@ -1,5 +1,5 @@ use crate::{ - Context, JsResult, + Context, JsExpect, JsResult, builtins::function::{OrdinaryFunction, set_function_name}, object::internal_methods::InternalMethodPropertyContext, property::PropertyDescriptor, @@ -21,7 +21,7 @@ impl DefineClassStaticMethodByName { ) -> JsResult<()> { let function = context.vm.get_register(function.into()).clone(); let class = context.vm.get_register(class.into()).clone(); - let class = class.as_object().expect("class must be object"); + let class = class.as_object().js_expect("class must be object")?; let key = context .vm .frame() @@ -31,11 +31,11 @@ impl DefineClassStaticMethodByName { { let function_object = function .as_object() - .expect("method must be function object"); + .js_expect("method must be function object")?; set_function_name(&function_object, &key, None, context)?; function_object .downcast_mut::() - .expect("method must be function object") + .js_expect("method must be function object")? .set_home_object(class.clone()); } @@ -69,7 +69,7 @@ impl DefineClassMethodByName { ) -> JsResult<()> { let function = context.vm.get_register(function.into()).clone(); let class_proto = context.vm.get_register(class_proto.into()).clone(); - let class_proto = class_proto.as_object().expect("class must be object"); + let class_proto = class_proto.as_object().js_expect("class must be object")?; let key = context .vm .frame() @@ -79,11 +79,11 @@ impl DefineClassMethodByName { { let function_object = function .as_object() - .expect("method must be function object"); + .js_expect("method must be function object")?; set_function_name(&function_object, &key, None, context)?; function_object .downcast_mut::() - .expect("method must be function object") + .js_expect("method must be function object")? .set_home_object(class_proto.clone()); } @@ -118,18 +118,16 @@ impl DefineClassStaticMethodByValue { let function = context.vm.get_register(function.into()).clone(); let key = context.vm.get_register(key.into()).clone(); let class = context.vm.get_register(class.into()).clone(); - let class = class.as_object().expect("class must be object"); - let key = key - .to_property_key(context) - .expect("property key must already be valid"); + let class = class.as_object().js_expect("class must be object")?; + let key = key.to_property_key(context)?; { let function_object = function .as_object() - .expect("method must be function object"); + .js_expect("method must be function object")?; set_function_name(&function_object, &key, None, context)?; function_object .downcast_mut::() - .expect("method must be function object") + .js_expect("method must be function object")? .set_home_object(class.clone()); } @@ -169,18 +167,16 @@ impl DefineClassMethodByValue { let function = context.vm.get_register(function.into()).clone(); let key = context.vm.get_register(key.into()).clone(); let class_proto = context.vm.get_register(class_proto.into()).clone(); - let class_proto = class_proto.as_object().expect("class must be object"); - let key = key - .to_property_key(context) - .expect("property key must already be valid"); + let class_proto = class_proto.as_object().js_expect("class must be object")?; + let key = key.to_property_key(context)?; { let function_object = function .as_object() - .expect("method must be function object"); + .js_expect("method must be function object")?; set_function_name(&function_object, &key, None, context)?; function_object .downcast_mut::() - .expect("method must be function object") + .js_expect("method must be function object")? .set_home_object(class_proto.clone()); } diff --git a/core/engine/src/vm/opcode/define/class/setter.rs b/core/engine/src/vm/opcode/define/class/setter.rs index 431b5937fa5..258781be50b 100644 --- a/core/engine/src/vm/opcode/define/class/setter.rs +++ b/core/engine/src/vm/opcode/define/class/setter.rs @@ -1,7 +1,7 @@ use boa_macros::js_str; use crate::{ - Context, JsResult, + Context, JsExpect, JsResult, builtins::function::{OrdinaryFunction, set_function_name}, object::internal_methods::InternalMethodPropertyContext, property::PropertyDescriptor, @@ -23,7 +23,7 @@ impl DefineClassStaticSetterByName { ) -> JsResult<()> { let function = context.vm.get_register(function.into()).clone(); let class = context.vm.get_register(class.into()).clone(); - let class = class.as_object().expect("class must be object"); + let class = class.as_object().js_expect("class must be object")?; let key = context .vm .frame() @@ -33,11 +33,11 @@ impl DefineClassStaticSetterByName { { let function_object = function .as_object() - .expect("method must be function object"); + .js_expect("method must be function object")?; set_function_name(&function_object, &key, Some(js_str!("set")), context)?; function_object .downcast_mut::() - .expect("method must be function object") + .js_expect("method must be function object")? .set_home_object(class.clone()); } let get = class @@ -81,7 +81,7 @@ impl DefineClassSetterByName { ) -> JsResult<()> { let function = context.vm.get_register(function.into()).clone(); let class_proto = context.vm.get_register(class_proto.into()).clone(); - let class_proto = class_proto.as_object().expect("class must be object"); + let class_proto = class_proto.as_object().js_expect("class must be object")?; let key = context .vm .frame() @@ -91,11 +91,11 @@ impl DefineClassSetterByName { { let function_object = function .as_object() - .expect("method must be function object"); + .js_expect("method must be function object")?; set_function_name(&function_object, &key, Some(js_str!("set")), context)?; function_object .downcast_mut::() - .expect("method must be function object") + .js_expect("method must be function object")? .set_home_object(class_proto.clone()); } let get = class_proto @@ -141,18 +141,16 @@ impl DefineClassStaticSetterByValue { let function = context.vm.get_register(function.into()).clone(); let key = context.vm.get_register(key.into()).clone(); let class = context.vm.get_register(class.into()).clone(); - let class = class.as_object().expect("class must be object"); - let key = key - .to_property_key(context) - .expect("property key must already be valid"); + let class = class.as_object().js_expect("class must be object")?; + let key = key.to_property_key(context)?; { let function_object = function .as_object() - .expect("method must be function object"); + .js_expect("method must be function object")?; set_function_name(&function_object, &key, Some(js_str!("set")), context)?; function_object .downcast_mut::() - .expect("method must be function object") + .js_expect("method must be function object")? .set_home_object(class.clone()); } let get = class @@ -198,18 +196,16 @@ impl DefineClassSetterByValue { let function = context.vm.get_register(function.into()).clone(); let key = context.vm.get_register(key.into()).clone(); let class_proto = context.vm.get_register(class_proto.into()).clone(); - let class_proto = class_proto.as_object().expect("class must be object"); - let key = key - .to_property_key(context) - .expect("property key must already be valid"); + let class_proto = class_proto.as_object().js_expect("class must be object")?; + let key = key.to_property_key(context)?; { let function_object = function .as_object() - .expect("method must be function object"); + .js_expect("method must be function object")?; set_function_name(&function_object, &key, Some(js_str!("set")), context)?; function_object .downcast_mut::() - .expect("method must be function object") + .js_expect("method must be function object")? .set_home_object(class_proto.clone()); } let get = class_proto diff --git a/core/engine/src/vm/opcode/set/name.rs b/core/engine/src/vm/opcode/set/name.rs index be97dd7bfd3..abf1cd4c5fe 100644 --- a/core/engine/src/vm/opcode/set/name.rs +++ b/core/engine/src/vm/opcode/set/name.rs @@ -1,7 +1,7 @@ use boa_ast::scope::{BindingLocator, BindingLocatorScope}; use crate::{ - Context, JsError, JsNativeError, JsResult, + Context, JsError, JsExpect, JsNativeError, JsResult, environments::Environment, vm::opcode::{IndexOperand, Operation, RegisterOperand}, }; @@ -86,7 +86,7 @@ impl SetNameByLocator { let binding_locator = frame .binding_stack .pop() - .expect("locator should have been popped before"); + .js_expect("locator should have been popped before")?; let value = context.vm.get_register(value.into()).clone(); verify_initialized(&binding_locator, context)?; diff --git a/core/engine/src/vm/opcode/set/private.rs b/core/engine/src/vm/opcode/set/private.rs index 04bdf2bcf9e..286eb83e5ad 100644 --- a/core/engine/src/vm/opcode/set/private.rs +++ b/core/engine/src/vm/opcode/set/private.rs @@ -1,5 +1,5 @@ use crate::{ - Context, JsResult, js_str, js_string, + Context, JsExpect, JsResult, js_str, js_string, object::PrivateElement, property::PropertyDescriptor, vm::opcode::{IndexOperand, Operation, RegisterOperand}, @@ -31,7 +31,7 @@ impl SetPrivateField { .frame() .environments .resolve_private_identifier(name) - .expect("private name must be in environment"); + .js_expect("private name must be in environment")?; base_obj.private_set(&name, value.clone(), context)?; Ok(()) @@ -67,7 +67,7 @@ impl DefinePrivateField { let object = object .as_object() - .expect("class prototype must be an object"); + .js_expect("class prototype must be an object")?; let name = object.private_name(name); object.private_field_add(&name, value, context)?;