comparison cpu_dsl.py @ 1716:04cafe626118

Better error reporting when an instruction is given an insufficient number of parameters
author Michael Pavone <pavone@retrodev.com>
date Wed, 30 Jan 2019 09:32:01 -0800
parents 4fd84c3efc72
children fb5ae8c20b85
comparison
equal deleted inserted replaced
1715:4fd84c3efc72 1716:04cafe626118
270 return self.evalFun(*params) 270 return self.evalFun(*params)
271 def canEval(self): 271 def canEval(self):
272 return not self.evalFun is None 272 return not self.evalFun is None
273 def numArgs(self): 273 def numArgs(self):
274 return self.evalFun.__code__.co_argcount 274 return self.evalFun.__code__.co_argcount
275 def numParams(self):
276 if self.outOp:
277 params = max(self.outOp) + 1
278 else:
279 params = 0
280 if self.evalFun:
281 params = max(params, self.numArgs())
282 return params
275 def generate(self, otype, prog, params, rawParams, flagUpdates): 283 def generate(self, otype, prog, params, rawParams, flagUpdates):
276 if self.impls[otype].__code__.co_argcount == 2: 284 if self.impls[otype].__code__.co_argcount == 2:
277 return self.impls[otype](prog, params) 285 return self.impls[otype](prog, params)
278 elif self.impls[otype].__code__.co_argcount == 3: 286 elif self.impls[otype].__code__.co_argcount == 3:
279 return self.impls[otype](prog, params, rawParams) 287 return self.impls[otype](prog, params, rawParams)
584 prog.meta[self.params[0]] = param 592 prog.meta[self.params[0]] = param
585 elif self.op == 'dis': 593 elif self.op == 'dis':
586 #TODO: Disassembler 594 #TODO: Disassembler
587 pass 595 pass
588 elif not opDef is None: 596 elif not opDef is None:
597 if opDef.numParams() > len(procParams):
598 raise Exception('Insufficient params for ' + self.op + ' (' + ', '.join(self.params) + ')')
589 if opDef.canEval() and allParamsConst: 599 if opDef.canEval() and allParamsConst:
590 #do constant folding 600 #do constant folding
591 if opDef.numArgs() >= len(procParams): 601 if opDef.numArgs() >= len(procParams):
592 raise Exception('Insufficient args for ' + self.op + ' (' + ', '.join(self.params) + ')') 602 raise Exception('Insufficient args for ' + self.op + ' (' + ', '.join(self.params) + ')')
593 dst = self.params[opDef.numArgs()] 603 dst = self.params[opDef.numArgs()]