diff options
| author | 2023-02-08 13:56:39 +0000 | |
|---|---|---|
| committer | 2023-02-08 13:56:39 +0000 | |
| commit | e044a7b457da7468d2fb49ef658549ea1b4861af (patch) | |
| tree | a7cdbb3a8b76e6fba3e935456672240d8d366f52 /asm/creole.py | |
| parent | python ffi: test parsing (diff) | |
test refactoring
Diffstat (limited to 'asm/creole.py')
| -rw-r--r-- | asm/creole.py | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/asm/creole.py b/asm/creole.py index 8e87b58..c1045c5 100644 --- a/asm/creole.py +++ b/asm/creole.py @@ -24,16 +24,32 @@ class ArgType(Enum): def typecheck(self, s): t = ArgType.gettype(s) if self == ArgType.VAL: - return t[0] == ArgType.REG or t[0] == ArgType.IMM + if t[0] == ArgType.REG or t[0] == ArgType.IMM: + return t + else: + return None + elif t[0] == self: + return t else: - return t[0] == self + return None class OpcodeException(Exception): pass class TypecheckLenException(Exception): - pass + def __init__(self, opcode, insargs, argtypelen): + self.opcode = opcode + self.insargs = insargs + self.argtypelen = argtypelen + def __str__(self): + return f'arguments {insargs} to opcode {self.opcode} not length {self.argtypelen}' class TypecheckException(Exception): - pass + def __init__(self, argtype, sarg, i, opcode): + self.argtype = argtype + self.sarg = sarg + self.i = i + self.opcode = opcode + def __str__(self): + return f'opcode {self.opcode} has invalid value {self.sarg} (expected {self.argtype} in position {self.i}' class Instruction: def __init__(self, opcode, argtypes): if opcode > 0x7F or opcode < 0: @@ -44,12 +60,15 @@ class Instruction: def typecheck(self, sargs): rargs = [] if len(sargs) != len(self.argtypes): - raise TypecheckLenException(sargs, self.argtypes) + raise TypecheckLenException(self.opcode, sargs, + len(self.argtypes)) for i in range(0, len(sargs)): - if not self.argtypes[i].typecheck(sargs[i]): + t = self.argtypes[i].typecheck(sargs[i]) + if t is None: raise TypecheckException(self.argtypes[i], - sargs[i]) - rargs.append(ArgType.gettype(sargs[i])) + sargs[i], + i, self.opcode) + rargs.append(t) return rargs instructions = { |
