Ejemplo n.º 1
0
	def __str__(self):
		self.check()

		instrnamestr = self.name if self._opcode <= 17 else "illegal{0}".format(self._opcode)

		instrstr = None
		
		if self._opcode > 17:
			return ''.join([labelstr, 
						"illegal{0}\t{1}, {2}, {3}".format(self._opcode, self._subOpcode, self._parameter)])
		
		elif self._opcode in (0, 8, 15):  # nop, return, exit
			instrstr = "{0}".format((self._subOpcode, self._parameter)) if\
			not (self._subOpcode, self._parameter) == (0, 0) else ""
			
		elif self._opcode == 1:  # operator
			instrstr = FunctionInfo.getOperatorName(self._subOpcode)
			
		elif self._opcode == 2:  # ldimm
			if self._subOpcode == 0:
				instrstr = 'none_t, ={0}'.format('None' if self.ctx is None or self.ctx.sections["CODE"].instructions[self._position + 1] == 0 
									 else self.ctx.sections["CODE"].instructions[self._position + 1])
			elif self._subOpcode == 1:
				instrstr = 'int, ={0}'.format("" if self.ctx is None else str(self.ctx.sections["CODE"].instructions[self._position + 1]))
			elif self._subOpcode == 2:
				if self.ctx is None:
					instrstr = 'float, ='
				else:
					fstr = '{0:.7g}'.format(self.ctx.sections["CODE"].instructions[self._position + 1])#.rstrip('0')
					fstr = fstr if fstr else "0."
					instrstr = 'float, ={0}'.format(fstr)
						
			elif self._subOpcode == 3:
				instrstr = 'str, ={0}'.format(self._parameter if self.ctx is None or self.ctx.sections.get("STRG") is None
								  else '"{0}"'.format(self.ctx.sections["STRG"].getString(self._parameter)))
			
			elif self._subOpcode == 4:
				instrstr = "vector, ={0}".format(self._parameter if self.ctx is None or self.ctx.sections.get("VECT") is None
									 else "<{0}, {1}, {2}>".format(*self.ctx.sections["VECT"].vectors[self._parameter]) )
			
			elif self._subOpcode == 0x2c:
				instrstr = "type44, {0}".format(self._parameter & 0xffff)  # unsigned parameter
			
			elif self._subOpcode == 0x35:
				typestr = "codeptr_t"
				valuestr = "={0}".format(hex(self.ctx.sections["CODE"].instructions[self._position + 1])\
											if self.ctx is not None else "")
			
			else:
				instrstr = "{0}, {1}".format(self._subOpcode, self._parameter & 0xffff)
			
		elif self._opcode in (3, 4, 17):  # ldvar, setvar, ldncpvar
			instrstr = self.variableName

		elif self._opcode == 5:  # setvector
			instrstr = "{0}, {1}".format(self.__class__.vectorCoordNames[self.subSubOpcodes[0]], self.variableName)
			
		elif self._opcode in (6, 13, 14):  # pop, reserve, release
			instrstr = "{0}{1}".format(self._subOpcode, "" if self._parameter == 0 else\
			"(, {0})".format(self._parameter))

		elif self._opcode in (7, 10, 11, 12):  # call/jmptrue/jmpfalse/jmp
			instrID = self.instructionID
			instrstr = hex(instrID) if (self.ctx is None or instrID >= len(self.ctx.sections["CODE"].instructions))\
			else self.ctx.sections["CODE"].labels[instrID]
			
		elif self._opcode == 9:  # callstd
			instrstr = FunctionInfo.getStdFunctionName(self._subOpcode, self._parameter)
				
		elif self._opcode == 16:  # setline
			instrstr = str(self._parameter)
		
		ret = ''.join([instrnamestr, (14 - len(instrnamestr)) * ' ', instrstr]) 
		return ret
Ejemplo n.º 2
0
    def __str__(self):
        self.check()

        instrnamestr = self.name if self._opcode <= 17 else "illegal{0}".format(
            self._opcode)

        instrstr = None

        if self._opcode > 17:
            return ''.join([
                labelstr,
                "illegal{0}\t{1}, {2}, {3}".format(self._opcode,
                                                   self._subOpcode,
                                                   self._parameter)
            ])

        elif self._opcode in (0, 8, 15):  # nop, return, exit
            instrstr = "{0}".format((self._subOpcode, self._parameter)) if\
            not (self._subOpcode, self._parameter) == (0, 0) else ""

        elif self._opcode == 1:  # operator
            instrstr = FunctionInfo.getOperatorName(self._subOpcode)

        elif self._opcode == 2:  # ldimm
            if self._subOpcode == 0:
                instrstr = 'none_t, ={0}'.format(
                    'None' if self.ctx is None or self.ctx.sections["CODE"].
                    instructions[self._position + 1] == 0 else self.ctx.
                    sections["CODE"].instructions[self._position + 1])
            elif self._subOpcode == 1:
                instrstr = 'int, ={0}'.format("" if self.ctx is None else str(
                    self.ctx.sections["CODE"].instructions[self._position +
                                                           1]))
            elif self._subOpcode == 2:
                if self.ctx is None:
                    instrstr = 'float, ='
                else:
                    fstr = '{0:.7g}'.format(
                        self.ctx.sections["CODE"].instructions[
                            self._position + 1])  #.rstrip('0')
                    fstr = fstr if fstr else "0."
                    instrstr = 'float, ={0}'.format(fstr)

            elif self._subOpcode == 3:
                instrstr = 'str, ={0}'.format(
                    self._parameter if self.ctx is None or
                    self.ctx.sections.get("STRG") is None else '"{0}"'.format(
                        self.ctx.sections["STRG"].getString(self._parameter)))

            elif self._subOpcode == 4:
                instrstr = "vector, ={0}".format(
                    self._parameter if self.ctx is None or self.ctx.sections.
                    get("VECT") is None else "<{0}, {1}, {2}>".format(
                        *self.ctx.sections["VECT"].vectors[self._parameter]))

            elif self._subOpcode == 0x2c:
                instrstr = "type44, {0}".format(self._parameter
                                                & 0xffff)  # unsigned parameter

            elif self._subOpcode == 0x35:
                typestr = "codeptr_t"
                valuestr = "={0}".format(hex(self.ctx.sections["CODE"].instructions[self._position + 1])\
                       if self.ctx is not None else "")

            else:
                instrstr = "{0}, {1}".format(self._subOpcode,
                                             self._parameter & 0xffff)

        elif self._opcode in (3, 4, 17):  # ldvar, setvar, ldncpvar
            instrstr = self.variableName

        elif self._opcode == 5:  # setvector
            instrstr = "{0}, {1}".format(
                self.__class__.vectorCoordNames[self.subSubOpcodes[0]],
                self.variableName)

        elif self._opcode in (6, 13, 14):  # pop, reserve, release
            instrstr = "{0}{1}".format(self._subOpcode, "" if self._parameter == 0 else\
            "(, {0})".format(self._parameter))

        elif self._opcode in (7, 10, 11, 12):  # call/jmptrue/jmpfalse/jmp
            instrID = self.instructionID
            instrstr = hex(instrID) if (self.ctx is None or instrID >= len(self.ctx.sections["CODE"].instructions))\
            else self.ctx.sections["CODE"].labels[instrID]

        elif self._opcode == 9:  # callstd
            instrstr = FunctionInfo.getStdFunctionName(self._subOpcode,
                                                       self._parameter)

        elif self._opcode == 16:  # setline
            instrstr = str(self._parameter)

        ret = ''.join([instrnamestr, (14 - len(instrnamestr)) * ' ', instrstr])
        return ret