Mercurial > repos > blastem
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()] |