Partial implementation [skip-ci]

This commit is contained in:
Johan B.W. de Vries 2022-03-04 13:35:08 +01:00
parent 1a35710da4
commit bd7e8d33bf
2 changed files with 58 additions and 13 deletions

View File

@ -124,10 +124,8 @@ class Visitor:
if not isinstance(arg.annotation, ast.Name):
raise NotImplementedError
print(class_lookup)
print(arg.annotation.id)
if arg.annotation.id in class_lookup:
params.append((arg.arg, arg.annotation.id, ))
params.append((arg.arg, 'i32', ))
else:
params.append((arg.arg, _parse_annotation(arg.annotation), ))
@ -296,7 +294,7 @@ class Visitor:
return self.visit_Name(wlocals, exp_type, node)
if isinstance(node, ast.Attribute):
return [] # TODO
return self.visit_Attribute(wlocals, exp_type, node)
raise NotImplementedError(node)
@ -411,14 +409,46 @@ class Visitor:
'Could not find function {}'.format(node.func.id)
if isinstance(called_func_list[0], wasm.Class):
called_params = [
(x.name, x.type, )
for x in called_func_list[0].members
]
called_result: Optional[str] = called_func_list[0].name
else:
called_params = called_func_list[0].params
called_result = called_func_list[0].result
return self.visit_Call_class(module, wlocals, exp_type, node, called_func_list[0])
return self.visit_Call_func(module, wlocals, exp_type, node, called_func_list[0])
def visit_Call_class(
self,
module: wasm.Module,
wlocals: WLocals,
exp_type: str,
node: ast.Call,
func: wasm.Class,
) -> StatementGenerator:
"""
Visits a Call node as (part of) an expression
This instantiates the class
"""
# TODO: malloc call
yield wasm.Statement('i32.const 0')
yield wasm.Statement('i32.load')
def visit_Call_func(
self,
module: wasm.Module,
wlocals: WLocals,
exp_type: str,
node: ast.Call,
func: Union[wasm.Function, wasm.Import],
) -> StatementGenerator:
"""
Visits a Call node as (part of) an expression
"""
assert isinstance(node.func, ast.Name)
called_name = node.func.id
called_params = func.params
called_result = func.result
assert exp_type == called_result
@ -470,6 +500,20 @@ class Visitor:
raise NotImplementedError(exp_type)
def visit_Attribute(self, wlocals: WLocals, exp_type: str, node: ast.Attribute) -> StatementGenerator:
"""
Visits an Attribute node as (part of) an expression
"""
if not isinstance(node.value, ast.Name):
raise NotImplementedError
if not isinstance(node.ctx, ast.Load):
raise NotImplementedError
yield wasm.Statement('local.get', '$' + node.value.id)
yield wasm.Statement(exp_type + '.load', 'offset=0') # TODO: Calculate offset based on set struct
def visit_Name(self, wlocals: WLocals, exp_type: str, node: ast.Name) -> StatementGenerator:
"""
Visits a Name node as (part of) an expression

View File

@ -120,7 +120,8 @@ class Module:
"""
Generates the text version
"""
return '(module\n {}\n {})\n'.format(
return '(module\n (memory 1)\n (data (memory 0) (i32.const 0) {})\n {}\n {})\n'.format(
'"\\\\04\\\\00\\\\00\\\\00"',
'\n '.join(x.generate() for x in self.imports),
'\n '.join(x.generate() for x in self.functions),
)