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
|