Example #1
0
    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
Example #2
0
 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