From 8bc8aa622f7f411f1a4164ac3106e77b43e79e44 Mon Sep 17 00:00:00 2001 From: raskad <32105367+raskad@users.noreply.github.com> Date: Sat, 9 Oct 2021 21:16:26 +0200 Subject: [PATCH] Add `DeletePropertyByName` vm opcode --- boa/src/bytecompiler.rs | 4 ++-- boa/src/vm/code_block.rs | 1 + boa/src/vm/mod.rs | 9 +++++++++ boa/src/vm/opcode.rs | 10 ++++++++++ 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/boa/src/bytecompiler.rs b/boa/src/bytecompiler.rs index 94cc00bcaf1..5f83383079b 100644 --- a/boa/src/bytecompiler.rs +++ b/boa/src/bytecompiler.rs @@ -372,9 +372,9 @@ impl ByteCompiler { UnaryOp::DecrementPost => todo!(), UnaryOp::Delete => match unary.target() { Node::GetConstField(ref get_const_field) => { - self.emit_push_literal(Literal::String(get_const_field.field().into())); + let index = self.get_or_insert_name(get_const_field.field()); self.compile_expr(get_const_field.obj(), true); - self.emit(Opcode::DeletePropertyByValue, &[]); + self.emit(Opcode::DeletePropertyByName, &[index]); None } Node::GetField(ref get_field) => { diff --git a/boa/src/vm/code_block.rs b/boa/src/vm/code_block.rs index 533b8ec39e1..c5ef69546af 100644 --- a/boa/src/vm/code_block.rs +++ b/boa/src/vm/code_block.rs @@ -207,6 +207,7 @@ impl CodeBlock { | Opcode::Neg | Opcode::GetPropertyByValue | Opcode::SetPropertyByValue + | Opcode::DeletePropertyByName | Opcode::DeletePropertyByValue | Opcode::ToBoolean | Opcode::Throw diff --git a/boa/src/vm/mod.rs b/boa/src/vm/mod.rs index 713bcd3a8e6..4529a2a9785 100644 --- a/boa/src/vm/mod.rs +++ b/boa/src/vm/mod.rs @@ -411,6 +411,15 @@ impl Context { let key = key.to_property_key(self)?; object.set(key, value, true, self)?; } + Opcode::DeletePropertyByName => { + let index = self.vm.read::(); + let key = self.vm.frame().code.variables[index as usize].clone(); + let object = self.vm.pop(); + let result = object + .to_object(self)? + .__delete__(&key.into(), self)?; + self.vm.push(result); + } Opcode::DeletePropertyByValue => { let object = self.vm.pop(); let key = self.vm.pop(); diff --git a/boa/src/vm/opcode.rs b/boa/src/vm/opcode.rs index 68af28bccdb..f7901b35945 100644 --- a/boa/src/vm/opcode.rs +++ b/boa/src/vm/opcode.rs @@ -442,6 +442,15 @@ pub enum Opcode { /// Stack: value, key, object **=>** SetPropertyByValue, + /// Deletes a property by name of an object. + /// + /// Like `delete object.key.` + /// + /// Operands: name_index: `u32` + /// + /// Stack: object **=>** + DeletePropertyByName, + /// Deletes a property by value of an object. /// /// Like `delete object[key]` @@ -614,6 +623,7 @@ impl Opcode { Opcode::GetPropertyByValue => "GetPropertyByValue", Opcode::SetPropertyByName => "SetPropertyByName", Opcode::SetPropertyByValue => "SetPropertyByValue", + Opcode::DeletePropertyByName => "DeletePropertyByName", Opcode::DeletePropertyByValue => "DeletePropertyByValue", Opcode::Jump => "Jump", Opcode::JumpIfFalse => "JumpIfFalse",