def emitICONST(self, i): # i: Int if i == -1: return JasminCode.INDENT + "iconst_ml" + JasminCode.END elif i >= 0 or i <= 5: return JasminCode.INDENT + "iconst_" + str(i) + JasminCode.END else: raise IllegalOperandException(str(i))
def emitWRITEVAR2(self, name, typ, frame): # name: String # typ: Type # frame: Frame # ..., value -> ... # frame.push() raise IllegalOperandException(name)
def emitFCONST(self, i): # i: String if i == "0.0": return JasminCode.INDENT + "fconst_0" + JasminCode.END elif i == "1.0": return JasminCode.INDENT + "fconst_1" + JasminCode.END elif i == "2.0": return JasminCode.INDENT + "fconst_2" + JasminCode.END else: raise IllegalOperandException(i)
def emitALOAD(self, in_, frame): # in_: Type # frame: Frame # ..., arrayref, index, value -> ... frame.pop() if isinstance(in_, IntType): return self.jvm.emitIALOAD() elif isinstance(in_, ArrayPointerType) or\ isinstance(in_, ClassType) or\ isinstance(in_, StringType): return self.jvm.emitAALOAD() else: raise IllegalOperandException(str(in_))
def emitPUSHCONST(self, in_, typ, frame): # in_: String # typ: Type # frame: Frame if isinstance(typ, IntType): return self.emitPUSHICONST(in_, frame) elif isinstance(typ, BoolType): return self.emitPUSHICONST(in_, frame) elif isinstance(typ, StringType): frame.push() return self.jvm.emitLDC(in_) else: raise IllegalOperandException(in_)
def emitREADVAR(self, name, inType, index, frame): # name: String # inType: Type # index: Int # frame: Frame # ... -> ..., value frame.push() if isinstance(inType, (IntType, BoolType)): return self.jvm.emitILOAD(index) elif isinstance(inType, FloatType): return self.jvm.emitFLOAD(index) elif isinstance(inType, ArrayPointerType) or\ isinstance(inType, ClassType) or\ isinstance(inType, StringType): return self.jvm.emitALOAD(index) else: raise IllegalOperandException(name)
def emitWRITEVAR(self, name, inType, index, frame): # name: String # inType: Type # index: Int # frame: Frame # ..., value -> ... frame.pop() if isinstance(inType, (IntType, BoolType)): return self.jvm.emitISTORE(index) elif isinstance(inType, FloatType): return self.jvm.emitFSTORE(index) elif isinstance(inType, ArrayPointerType) or\ isinstance(inType, ClassType) or\ isinstance(inType, StringType): return self.jvm.emitASTORE(index) else: raise IllegalOperandException(name)
def emitSIPUSH(self, i): # i: Int if (i >= -32768 and i < -128) or (i > 127 and i <= 32767): return JasminCode.INDENT + "sipush " + str(i) + JasminCode.END else: raise IllegalOperandException(str(i))
def emitBIPUSH(self, i): # i: Int if (i >= -128 and i < -1) or (i > 5 and i <= 127): return JasminCode.INDENT + "bipush " + str(i) + JasminCode.END else: raise IllegalOperandException(str(i))