diff options
| author | 2023-02-09 16:16:41 +0000 | |
|---|---|---|
| committer | 2023-02-09 16:16:41 +0000 | |
| commit | c0770d8ece675f5e6f2249b331c7550933915829 (patch) | |
| tree | 49ed1779f0941a60ce2941c312d3f53f4ab81616 /asm/ffi.py | |
| parent | test refactoring (diff) | |
add compile t est
Diffstat (limited to 'asm/ffi.py')
| -rw-r--r-- | asm/ffi.py | 60 |
1 files changed, 54 insertions, 6 deletions
@@ -3,7 +3,7 @@ from enum import Enum dll = CDLL("./libcreole.so") class CompileRet(Enum): - COMPILE_OK = 0 + OK = 0 OPCODE_READ_ERROR = 1 OPCODE_MALFORMED = 2 ARG_READ_ERROR = 3 @@ -12,6 +12,7 @@ class CompileRet(Enum): LAST_MALFORMED = 6 LABEL_OVERFLOW = 7 TYPE_ERROR = 8 + CLEARED_INSTRUCTION = 9 class CIns(Structure): _fields_ = [("opcode", c_int), @@ -25,17 +26,64 @@ def make_uchar_buf(s): buf = (c_ubyte * len(s))() buf[:] = s[:] return buf +def make_reader(s): + buf = make_uchar_buf(s) + return CReader(buf, len(s)) + +class CEnv(Structure): + _fields_ = [ + ("reg", POINTER(c_uint)), + ("reglen", c_size_t), + ("lab", POINTER(c_size_t)), + ("lablen", c_size_t), + ("stk", POINTER(c_uint)), + ("stkptr", c_size_t), + ("stklen", c_size_t), + ("prg", POINTER(CIns)), + ("prgptr", c_size_t), + ("prgend", c_size_t), + ("prglen", c_size_t) + ] + +class ExecutionEnvironment: + def __init__(self, reglen=32, lablen=32, stklen=4096, prglen=4096): + cenv = CEnv() + cenv.reglen = reglen + cenv.reg = (c_uint * reglen)() + + cenv.lablen = lablen + cenv.lab = (c_size_t * lablen)() + + cenv.stklen = stklen + cenv.stk = (c_uint * stklen)() + cenv.stkptr = 0 + + cenv.prglen = prglen + cenv.prg = (CIns * prglen)() + cenv.prgptr = 0 + cenv.prgend = 0 + + self.cenv = cenv + + def restart(self): + self.cenv.stkptr = 0 + self.cenv.prgptr = 0 + self.cenv.prgend = 0 + + def load(self, prog): + rd = make_reader(prog) + self.restart() + ret = dll.creole_compile(byref(self.cenv), byref(rd)) + return CompileRet(ret) class CParseLineException(Exception): pass def parse_line(line): - buf = make_uchar_buf(line) - - rd = CReader(buf, len(line)) + rd = make_reader(line) ins = CIns() ret = dll.creole_parse_line(byref(ins), byref(rd)) - if ret != 0: - raise CParseLineException(ret) + if ret != CompileRet.OK.value: + raise CParseLineException(CompileRet(ret).name) return (ins.opcode, list(zip(ins.w_flags, ins.w))) |
