diff --git a/evaluate_expression.go b/evaluate_expression.go index f59a1b1..29882da 100644 --- a/evaluate_expression.go +++ b/evaluate_expression.go @@ -103,6 +103,10 @@ func (self *_runtime) evaluateUnaryOperation(node *_unaryOperationNode) Value { case "void": return UndefinedValue() case "delete": + reference := target.reference() + if reference == nil { + return TrueValue() + } return toValue(target.reference().Delete()) case "typeof": switch targetValue._valueType { diff --git a/otto_test.go b/otto_test.go index b5fe65a..4782c29 100644 --- a/otto_test.go +++ b/otto_test.go @@ -2163,3 +2163,13 @@ func Test_stringToFloat(t *testing.T) { Is(stringToFloat("10e10000"), math.Inf(1)) Is(stringToFloat("10e10_."), "NaN") } + +func Test_delete(t *testing.T) { + Terst(t) + + test := runTest() + + test(` + delete 42; + `, "true") +} diff --git a/type_reference.go b/type_reference.go index 6938fa9..6783613 100644 --- a/type_reference.go +++ b/type_reference.go @@ -2,6 +2,7 @@ package otto type _reference interface { GetBase() *_object + CanResolve() bool GetValue() Value PutValue(Value) bool Name() string @@ -16,10 +17,6 @@ type _reference_ struct { strict bool } -func (self _reference_) GetBase() *_object { - return nil -} - func (self _reference_) Name() string { return self.name } @@ -28,10 +25,6 @@ func (self _reference_) Strict() bool { return self.strict } -func (self _reference_) Delete() { - panic(hereBeDragons()) -} - // PropertyReference type _propertyReference struct { @@ -55,6 +48,10 @@ func (self *_propertyReference) GetBase() *_object { return self.Base } +func (self *_propertyReference) CanResolve() bool { + return self.Base != nil +} + func (self *_propertyReference) GetValue() Value { if self.Base == nil { panic(newReferenceError("notDefined", self.name, self.node)) @@ -73,7 +70,8 @@ func (self *_propertyReference) PutValue(value Value) bool { func (self *_propertyReference) Delete() bool { if self.Base == nil { // ? - return false + // TODO Throw an error if strict + return true } return self.Base.delete(self.name, self.Strict()) } @@ -108,6 +106,10 @@ func (self *_environmentReference) GetBase() *_object { return nil // FIXME } +func (self *_environmentReference) CanResolve() bool { + return true // FIXME +} + func (self *_environmentReference) GetValue() Value { if self.Base == nil { panic(newReferenceError("notDefined", self.name, self.node))