def eval_func(self, f, args): if f.p is None: raise CompileTimeError, 'Not a callable -- %r' % f if len(f.p) != len(args): raise CompileTimeError, 'function %r required %d args, but '\ 'only %d are given' % (f, len(f.p), len(args)) # func args preparation to_pushs = [] for i, arg in enumerate(args): arg = self.eval_(arg) if not arg.can_cast_to(f.p[i]): print 'WARNING: casting argument '\ '%r to %r at func %r' % (arg, f.p[i], f) self.print_block() to_pushs.append(arg.tacn) for to_push in reversed(to_pushs): # reversely push those vars self.emit(tac.push_arg(to_push)) # emit actual call and fetch ret for now ret_value = obtype.Token(f.vt) ret_value.tacn = NewVar() self.emit(tac.call(ret_value.tacn, f.n)) # func call return ret_value
def eval_macro(self, f, args): if len(f.p) != len(args): # not an error here. print 'Warning: macro %r required %d args, but '\ 'only %d are given' % (f, len(f.p), len(args)) to_pushs = [] for i, arg in enumerate(args): arg = self.eval_(arg) to_pushs.append(arg.tacn) for to_push in reversed(to_pushs): # reversely push those vars self.emit(tac.push_arg(to_push)) # emit actual call and fetch ret for now ret_value = obtype.Token(f.vt) ret_value.vt = 'omni' # can be casted to anything ret_value.tacn = NewVar() self.emit(tac.call(ret_value.tacn, f.n)) # func call return ret_value