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

Fix trying to delete non-reference

This commit is contained in:
Robert Krimen 2012-11-14 11:09:52 -08:00
parent d87480bd29
commit 0498f06be0
3 changed files with 25 additions and 9 deletions

View File

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

View File

@ -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")
}

View File

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