1
0
mirror of https://github.com/robertkrimen/otto synced 2025-10-12 20:27:30 +08:00

Fix delete ... triggering property get()

This commit is contained in:
Robert Krimen 2014-04-19 11:11:53 -07:00
parent 8aca2c886a
commit 0917510923
2 changed files with 20 additions and 4 deletions

View File

@ -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 ?
}
}

View File

@ -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) {