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