phasm/py2wasm/wasm.py
2021-04-05 14:40:18 +02:00

98 lines
2.4 KiB
Python

"""
Python classes for storing the representation of Web Assembly code
"""
from typing import Iterable, List, Optional, Tuple
class Import:
"""
Represents a Web Assembly import
"""
def __init__(
self,
module: str,
name: str,
intname: str,
params: Iterable[Tuple[str, str]],
) -> None:
self.module = module
self.name = name
self.intname = intname
self.params = [*params]
def generate(self) -> str:
"""
Generates the text version
"""
return '(import "{}" "{}" (func ${}{}))'.format(
self.module,
self.name,
self.intname,
''.join(' (param {})'.format(x[1]) for x in self.params)
)
class Statement:
"""
Represents a Web Assembly statement
"""
def __init__(self, name: str, *args: str):
self.name = name
self.args = args
def generate(self) -> str:
"""
Generates the text version
"""
return '{} {}'.format(self.name, ' '.join(self.args))
class Function:
"""
Represents a Web Assembly function
"""
def __init__(
self,
name: str,
exported: bool,
result: Optional[str],
statements: Iterable[Statement],
) -> None:
self.name = name
self.exported = exported
self.params: List[Tuple[str, str]] = []
self.result = result
self.statements = [*statements]
def generate(self) -> str:
"""
Generates the text version
"""
header = ('(export "{}")' if self.exported else '${}').format(self.name)
for nam, typ in self.params:
header += ' (param ${} {})'.format(nam, typ)
if self.result:
header += ' (result {})'.format(self.result)
return '(func {}\n {})'.format(
header,
'\n '.join(x.generate() for x in self.statements),
)
class Module:
"""
Represents a Web Assembly module
"""
def __init__(self) -> None:
self.imports: List[Import] = []
self.functions: List[Function] = []
def generate(self) -> str:
"""
Generates the text version
"""
return '(module\n {}\n {})\n'.format(
'\n '.join(x.generate() for x in self.imports),
'\n '.join(x.generate() for x in self.functions),
)