def __init__(self): self.source = None self.jvm = JavaEmitter()
import sys sys.path.append("../") from JavaEmitter import * j = JavaEmitter() j.debugOn() j.add(Opcode.IMUL) j.finish()
class ParserBase(Compiler): def __init__(self): self.source = None self.jvm = JavaEmitter() def pushConstantInt(self, val): if val <= 3: if val == 0: self.jvm.emit1byte(Opcode.ICONST_0) elif val == 1: self.jvm.emit1byte(Opcode.ICONST_1) elif val == 2: self.jvm.emit1byte(Opcode.ICONST_2) elif val == 3: self.jvm.emit1byte(Opcode.ICONST_3) elif val <= 127: if val == 4: self.jvm.emit1byte(Opcode.ICONST_4) elif val == 5: self.jvm.emit1byte(Opcode.ICONST_5) else: self.jvm.emit2byte(Opcode.BIPUSH, val) elif val <= 32767: self.jvm.emit3byte(Opcode.SIPUSH, val) elif val < 2147483648 : times = val / 32767 #print "---", times, " times" self.jvm.emit3byte(Opcode.SIPUSH, 32767) self.jvm.emit3byte(Opcode.SIPUSH, times) self.jvm.emit1byte(Opcode.IMUL) rem = val % 32767 #print "---", rem, " rem" self.jvm.emit3byte(Opcode.SIPUSH, rem) self.jvm.emit1byte(Opcode.IADD) else: raise CompilerException("Integer too Large: " + str(val)) def pushConstant(self, operand): val = int(operand.toString()) self.pushConstantInt(val)