diff --git a/evaluate_expression.go b/evaluate_expression.go index 8cc110c..59dc8da 100644 --- a/evaluate_expression.go +++ b/evaluate_expression.go @@ -106,20 +106,22 @@ func (self *_runtime) evaluateUnaryExpression(node *ast.UnaryExpression) Value { } } - targetValue := self.GetValue(target) - switch node.Operator { case token.NOT: + targetValue := self.GetValue(target) if targetValue.toBoolean() { return FalseValue() } return TrueValue() case token.BITWISE_NOT: + targetValue := self.GetValue(target) integerValue := toInt32(targetValue) return toValue_int32(^integerValue) case token.PLUS: + targetValue := self.GetValue(target) return toValue_float64(targetValue.toFloat()) case token.MINUS: + targetValue := self.GetValue(target) value := targetValue.toFloat() // TODO Test this sign := float64(-1) @@ -128,6 +130,7 @@ func (self *_runtime) evaluateUnaryExpression(node *ast.UnaryExpression) Value { } return toValue_float64(math.Copysign(value, sign)) case token.INCREMENT: + targetValue := self.GetValue(target) if node.Postfix { // Postfix++ oldValue := targetValue.toFloat() @@ -141,6 +144,7 @@ func (self *_runtime) evaluateUnaryExpression(node *ast.UnaryExpression) Value { return newValue } case token.DECREMENT: + targetValue := self.GetValue(target) if node.Postfix { // Postfix-- oldValue := targetValue.toFloat() @@ -154,6 +158,7 @@ func (self *_runtime) evaluateUnaryExpression(node *ast.UnaryExpression) Value { return newValue } case token.VOID: + self.GetValue(target) // FIXME Side effect? return UndefinedValue() case token.DELETE: reference := target.reference() @@ -162,6 +167,7 @@ func (self *_runtime) evaluateUnaryExpression(node *ast.UnaryExpression) Value { } return toValue_bool(target.reference().Delete()) case token.TYPEOF: + targetValue := self.GetValue(target) switch targetValue._valueType { case valueUndefined: return toValue_string("undefined") @@ -179,7 +185,7 @@ func (self *_runtime) evaluateUnaryExpression(node *ast.UnaryExpression) Value { } return toValue_string("object") default: - // ? + // FIXME ? } } diff --git a/otto_test.go b/otto_test.go index 067f6b2..1ffafb7 100644 --- a/otto_test.go +++ b/otto_test.go @@ -997,10 +997,20 @@ func Test_delete(t *testing.T) { `, "true") test(` - abc = delete $_undefined_$; + var abc = delete $_undefined_$; abc = abc && delete ($_undefined_$); abc; `, "true") + + // delete should not trigger get() + test(` + var abc = { + get def() { + throw "Test_delete: delete should not trigger get()" + } + }; + delete abc.def + `, true) } func TestObject_defineOwnProperty(t *testing.T) {