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

Leverage github actions for tests and linting. This includes fixing a bunch of issues highlighted by golangci including: * Dead code. * Ineffectual assigns. * Goto warnings. * Nil return err. * Reused literal strings. * Test parameter order. Also: * Setup clog.
95 lines
2.1 KiB
Go
95 lines
2.1 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)
|
|
}
|
|
|
|
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)
|
|
}
|