def lookup_func(func)
if func.is_a? IR::Var then
- value = @syms[func.name]
+ if func.module then
+ mod = @syms[func.module]
+ modsym = mod.type.exports[func.name]
+ value = SymTable::Symbol.new(func.module, func.name, nil, modsym[:kind], modsym[:type], nil)
+ else
+ value = @syms[func.name]
+ end
+
error func, "no such function: #{func.name}" if value.nil?
else
value = func
if @syms.builtin? sym.name
"#{sym.name}"
else
- "#{@parser.module}_#{sym.name}"
+ "#{sym.module || @parser.module}_#{sym.name}"
end
end
end
# Symbol Table Definition
##
class SymTable
- Symbol = Struct.new(:name, :loc, :kind, :type, :value)
+ Symbol = Struct.new(:module, :name, :loc, :kind, :type, :value)
def initialize()
@scopes = [{}, {}]
def add_builtin(name, kind, type, value)
@scopes[0][name] =
- Symbol.new(name, 0, kind, type, value)
+ Symbol.new(nil, name, 0, kind, type, value)
end
def add_sym(name, loc, kind, type, value)
@scopes.last[name] =
- Symbol.new(name, loc, kind, type, value)
+ Symbol.new(nil, name, loc, kind, type, value)
end
def each(&block)