From 9c0cd4c42be1cb2bbeb18b04be325b19590fbc1b Mon Sep 17 00:00:00 2001 From: Jose Rodriguez Date: Wed, 19 Aug 2020 00:26:21 +0200 Subject: [PATCH] Dynamically import architecture --- arch/__init__.py | 12 ++++++++++++ libzxbc/zxb.py | 22 +++++++++++----------- libzxbc/zxbparser.py | 4 ++-- pyproject.toml | 6 ------ tests/functional/test_cmdline.txt | 1 + 5 files changed, 26 insertions(+), 19 deletions(-) diff --git a/arch/__init__.py b/arch/__init__.py index 654f9f319..d5585d024 100755 --- a/arch/__init__.py +++ b/arch/__init__.py @@ -2,6 +2,8 @@ # -*- coding: utf-8 -*- # vim:ts=4:et:sw=4: +import importlib + from . import zx48k @@ -10,3 +12,13 @@ ] AVAILABLE_ARCHITECTURES = __all__ +target = None + + +def set_target_arch(target_arch: str): + global target + assert target_arch in AVAILABLE_ARCHITECTURES + target = importlib.import_module(f'.{target_arch}', 'arch') + + +set_target_arch(AVAILABLE_ARCHITECTURES[0]) diff --git a/libzxbc/zxb.py b/libzxbc/zxb.py index ea63bf9d6..d715847d8 100755 --- a/libzxbc/zxb.py +++ b/libzxbc/zxb.py @@ -19,18 +19,16 @@ from . import zxbparser, zxblex from libzxbpp import zxbpp from libzxbasm import asmparse -import arch.zx48k.backend as backend from api import global_ as gl from api.config import OPTIONS from api import debug -from arch.zx48k.optimizer import optimize import arch def get_inits(memory): - backend.INITS.union(zxbparser.INITS) + arch.target.backend.INITS.union(zxbparser.INITS) reinit = re.compile(r'^#[ \t]*init[ \t]+([_a-zA-Z][_a-zA-Z0-9]*)[ \t]*$', re.IGNORECASE) @@ -39,7 +37,7 @@ def get_inits(memory): for m in memory: init = reinit.match(m) if init is not None: - backend.INITS.add(init.groups()[0]) + arch.target.backend.INITS.add(init.groups()[0]) memory[i] = '' i += 1 @@ -78,8 +76,8 @@ def main(args=None, emitter=None): api.config.init() zxbpp.init() zxbparser.init() - arch.zx48k.backend.init() - arch.zx48k.Translator.reset() + arch.target.backend.init() + arch.target.Translator.reset() asmparse.init() # ------------------------------------------------------------ @@ -184,6 +182,8 @@ def main(args=None, emitter=None): parser.error(f"Invalid architecture '{options.arch}'") return 2 OPTIONS.architecture.value = options.arch + arch.set_target_arch(options.arch) + backend = arch.target.backend OPTIONS.org.value = api.utils.parse_int(options.org) if OPTIONS.org.value is None: @@ -285,14 +285,14 @@ def main(args=None, emitter=None): optimizer.visit(zxbparser.ast) # Emits intermediate code - translator = arch.zx48k.Translator() + translator = arch.target.Translator() translator.visit(zxbparser.ast) if gl.DATA_IS_USED: gl.FUNCTIONS.extend(gl.DATA_FUNCTIONS) # This will fill MEMORY with pending functions - func_visitor = arch.zx48k.FunctionTranslator(gl.FUNCTIONS) + func_visitor = arch.target.FunctionTranslator(gl.FUNCTIONS) func_visitor.start() # Emits data lines @@ -309,7 +309,7 @@ def main(args=None, emitter=None): backend.MEMORY[:] = [] # Empties memory # This will fill MEMORY with global declared variables - translator = arch.zx48k.VarTranslator() + translator = arch.target.VarTranslator() translator.visit(zxbparser.data_ast) for quad in translator.dumpMemory(backend.MEMORY): @@ -318,7 +318,7 @@ def main(args=None, emitter=None): # Join all lines into a single string and ensures an INTRO at end of file asm_output = backend.emit(backend.MEMORY, optimize=OPTIONS.optimization.value > 0) - asm_output = optimize(asm_output) + '\n' # invoke the -O3 + asm_output = arch.target.optimizer.optimize(asm_output) + '\n' # invoke the -O3 asm_output = asm_output.split('\n') for i in range(len(asm_output)): @@ -341,7 +341,7 @@ def main(args=None, emitter=None): # This will fill MEMORY with global declared variables var_checker = api.optimize.VariableVisitor() var_checker.visit(zxbparser.data_ast) - translator = arch.zx48k.VarTranslator() + translator = arch.target.VarTranslator() translator.visit(zxbparser.data_ast) if gl.has_errors: debug.__DEBUG__("exiting due to errors.") diff --git a/libzxbc/zxbparser.py b/libzxbc/zxbparser.py index 6dd34c2a2..2d98a83be 100755 --- a/libzxbc/zxbparser.py +++ b/libzxbc/zxbparser.py @@ -60,7 +60,7 @@ import ply.yacc as yacc from . import zxblex from libzxbpp import zxbpp -from arch.zx48k.backend import REQUIRES +import arch from .zxblex import tokens # analysis:ignore -- Needed for PLY. Do not remove. # noqa # ---------------------------------------------------------------------- @@ -3168,7 +3168,7 @@ def p_preproc_line_init(p): def p_preproc_line_require(p): """ preproc_line : _REQUIRE STRING """ - REQUIRES.add(p[2]) + arch.target.backend.REQUIRES.add(p[2]) def p_preproc_line_option(p): diff --git a/pyproject.toml b/pyproject.toml index 248b0f653..4582eeb6f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,12 +44,6 @@ packages = [ { include = "libzxbpp" }, ] -include = [ - 'library/**/*', - 'library-asm/**/*' -] - - [tool.poetry.scripts] zxb = 'libzxbc.zxb:main' zxbc = 'libzxbc.zxb:main' diff --git a/tests/functional/test_cmdline.txt b/tests/functional/test_cmdline.txt index a4f3df385..0d251b23e 100644 --- a/tests/functional/test_cmdline.txt +++ b/tests/functional/test_cmdline.txt @@ -11,6 +11,7 @@ usage: zxbc.py [-h] [-d] [-O OPTIMIZE] [-o OUTPUT_FILE] [-T] [-t] [-B] [-a] [-i] [-I INCLUDE_PATH] [--strict] [--headerless] [--version] [--parse-only] [--append-binary APPEND_BINARY] [--append-headless-binary APPEND_HEADLESS_BINARY] [-N] + [--arch ARCH] PROGRAM zxbc.py: error: Option --asm and --mmap cannot be used together