Пример #1
0
	def __init__(self):
		self.source = None
		self.jvm = JavaEmitter()
Пример #2
0
import sys

sys.path.append("../")

from JavaEmitter import *

j = JavaEmitter()

j.debugOn()

j.add(Opcode.IMUL)


j.finish()
Пример #3
0
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)