mirror of https://github.com/poanetwork/quorum.git
104 lines
2.3 KiB
Go
104 lines
2.3 KiB
Go
|
package otto
|
||
|
|
||
|
type _reference interface {
|
||
|
invalid() bool // IsUnresolvableReference
|
||
|
getValue() Value // getValue
|
||
|
putValue(Value) string // PutValue
|
||
|
delete() bool
|
||
|
}
|
||
|
|
||
|
// PropertyReference
|
||
|
|
||
|
type _propertyReference struct {
|
||
|
name string
|
||
|
strict bool
|
||
|
base *_object
|
||
|
runtime *_runtime
|
||
|
at _at
|
||
|
}
|
||
|
|
||
|
func newPropertyReference(rt *_runtime, base *_object, name string, strict bool, at _at) *_propertyReference {
|
||
|
return &_propertyReference{
|
||
|
runtime: rt,
|
||
|
name: name,
|
||
|
strict: strict,
|
||
|
base: base,
|
||
|
at: at,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (self *_propertyReference) invalid() bool {
|
||
|
return self.base == nil
|
||
|
}
|
||
|
|
||
|
func (self *_propertyReference) getValue() Value {
|
||
|
if self.base == nil {
|
||
|
panic(self.runtime.panicReferenceError("'%s' is not defined", self.name, self.at))
|
||
|
}
|
||
|
return self.base.get(self.name)
|
||
|
}
|
||
|
|
||
|
func (self *_propertyReference) putValue(value Value) string {
|
||
|
if self.base == nil {
|
||
|
return self.name
|
||
|
}
|
||
|
self.base.put(self.name, value, self.strict)
|
||
|
return ""
|
||
|
}
|
||
|
|
||
|
func (self *_propertyReference) delete() bool {
|
||
|
if self.base == nil {
|
||
|
// TODO Throw an error if strict
|
||
|
return true
|
||
|
}
|
||
|
return self.base.delete(self.name, self.strict)
|
||
|
}
|
||
|
|
||
|
// ArgumentReference
|
||
|
|
||
|
func newArgumentReference(runtime *_runtime, base *_object, name string, strict bool, at _at) *_propertyReference {
|
||
|
if base == nil {
|
||
|
panic(hereBeDragons())
|
||
|
}
|
||
|
return newPropertyReference(runtime, base, name, strict, at)
|
||
|
}
|
||
|
|
||
|
type _stashReference struct {
|
||
|
name string
|
||
|
strict bool
|
||
|
base _stash
|
||
|
}
|
||
|
|
||
|
func (self *_stashReference) invalid() bool {
|
||
|
return false // The base (an environment) will never be nil
|
||
|
}
|
||
|
|
||
|
func (self *_stashReference) getValue() Value {
|
||
|
return self.base.getBinding(self.name, self.strict)
|
||
|
}
|
||
|
|
||
|
func (self *_stashReference) putValue(value Value) string {
|
||
|
self.base.setValue(self.name, value, self.strict)
|
||
|
return ""
|
||
|
}
|
||
|
|
||
|
func (self *_stashReference) delete() bool {
|
||
|
if self.base == nil {
|
||
|
// This should never be reached, but just in case
|
||
|
return false
|
||
|
}
|
||
|
return self.base.deleteBinding(self.name)
|
||
|
}
|
||
|
|
||
|
// getIdentifierReference
|
||
|
|
||
|
func getIdentifierReference(runtime *_runtime, stash _stash, name string, strict bool, at _at) _reference {
|
||
|
if stash == nil {
|
||
|
return newPropertyReference(runtime, nil, name, strict, at)
|
||
|
}
|
||
|
if stash.hasBinding(name) {
|
||
|
return stash.newReference(name, strict, at)
|
||
|
}
|
||
|
return getIdentifierReference(runtime, stash.outer(), name, strict, at)
|
||
|
}
|