metasploit-framework/lib/rkelly/runtime/scope_chain.rb

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