58 lines
1021 B
Ruby
58 lines
1021 B
Ruby
|
module RKelly
|
||
|
class Runtime
|
||
|
class ScopeChain
|
||
|
include RKelly::JS
|
||
|
|
||
|
def initialize(scope = Scope.new)
|
||
|
@chain = [GlobalObject.new]
|
||
|
end
|
||
|
|
||
|
def <<(scope)
|
||
|
@chain << scope
|
||
|
end
|
||
|
|
||
|
def has_property?(name)
|
||
|
scope = @chain.reverse.find { |x|
|
||
|
x.has_property?(name)
|
||
|
}
|
||
|
scope ? scope[name] : nil
|
||
|
end
|
||
|
|
||
|
def [](name)
|
||
|
property = has_property?(name)
|
||
|
return property if property
|
||
|
@chain.last.properties[name]
|
||
|
end
|
||
|
|
||
|
def []=(name, value)
|
||
|
@chain.last.properties[name] = value
|
||
|
end
|
||
|
|
||
|
def pop
|
||
|
@chain.pop
|
||
|
end
|
||
|
|
||
|
def this
|
||
|
@chain.last
|
||
|
end
|
||
|
|
||
|
def new_scope(&block)
|
||
|
@chain << Scope.new
|
||
|
result = yield(self)
|
||
|
@chain.pop
|
||
|
result
|
||
|
end
|
||
|
|
||
|
def return=(value)
|
||
|
@chain.last.return = value
|
||
|
end
|
||
|
|
||
|
def return; @chain.last.return; end
|
||
|
|
||
|
def returned?
|
||
|
@chain.last.returned?
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|