Locals support in wasm. You can now have multiple objects [skip-ci]
This commit is contained in:
parent
b468ffa780
commit
efe24fb4b5
@ -35,9 +35,19 @@ class Visitor:
|
|||||||
[
|
[
|
||||||
('alloc_size', 'i32'),
|
('alloc_size', 'i32'),
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
('result', 'i32'),
|
||||||
|
],
|
||||||
'i32',
|
'i32',
|
||||||
[
|
[
|
||||||
wasm.Statement('i32.const', '4', comment='Stub')
|
wasm.Statement('i32.const', '0'),
|
||||||
|
wasm.Statement('i32.const', '0'),
|
||||||
|
wasm.Statement('i32.load'),
|
||||||
|
wasm.Statement('local.tee', '$result', comment='Address for this call'),
|
||||||
|
wasm.Statement('local.get', '$alloc_size'),
|
||||||
|
wasm.Statement('i32.add'),
|
||||||
|
wasm.Statement('i32.store', comment='Address for the next call'),
|
||||||
|
wasm.Statement('local.get', '$result'),
|
||||||
]
|
]
|
||||||
))
|
))
|
||||||
|
|
||||||
@ -141,7 +151,11 @@ class Visitor:
|
|||||||
else:
|
else:
|
||||||
params.append((arg.arg, _parse_annotation(arg.annotation), ))
|
params.append((arg.arg, _parse_annotation(arg.annotation), ))
|
||||||
|
|
||||||
return wasm.Function(node.name, exported, params, result, [])
|
locals_ = [
|
||||||
|
('___new_reference___addr', 'i32'), # For the ___new_reference__ method
|
||||||
|
]
|
||||||
|
|
||||||
|
return wasm.Function(node.name, exported, params, locals_, result, [])
|
||||||
|
|
||||||
def parse_FunctionDef_body(
|
def parse_FunctionDef_body(
|
||||||
self,
|
self,
|
||||||
|
|||||||
@ -61,12 +61,14 @@ class Function:
|
|||||||
name: str,
|
name: str,
|
||||||
exported: bool,
|
exported: bool,
|
||||||
params: Iterable[Param],
|
params: Iterable[Param],
|
||||||
|
locals_: Iterable[Param],
|
||||||
result: Optional[str],
|
result: Optional[str],
|
||||||
statements: Iterable[Statement],
|
statements: Iterable[Statement],
|
||||||
) -> None:
|
) -> None:
|
||||||
self.name = name
|
self.name = name
|
||||||
self.exported = exported
|
self.exported = exported
|
||||||
self.params = [*params]
|
self.params = [*params]
|
||||||
|
self.locals = [*locals_]
|
||||||
self.result = result
|
self.result = result
|
||||||
self.statements = [*statements]
|
self.statements = [*statements]
|
||||||
|
|
||||||
@ -77,12 +79,13 @@ class Function:
|
|||||||
header = ('(export "{}")' if self.exported else '${}').format(self.name)
|
header = ('(export "{}")' if self.exported else '${}').format(self.name)
|
||||||
|
|
||||||
for nam, typ in self.params:
|
for nam, typ in self.params:
|
||||||
header += ' (param ${} {})'.format(nam, typ)
|
header += f' (param ${nam} {typ})'
|
||||||
|
|
||||||
if self.result:
|
if self.result:
|
||||||
header += ' (result {})'.format(self.result)
|
header += f' (result {self.result})'
|
||||||
|
|
||||||
header += ' (local $___new_reference___addr i32)'
|
for nam, typ in self.locals:
|
||||||
|
header += f' (local ${nam} {typ})'
|
||||||
|
|
||||||
return '(func {}\n {}\n )'.format(
|
return '(func {}\n {}\n )'.format(
|
||||||
header,
|
header,
|
||||||
|
|||||||
@ -252,7 +252,7 @@ def testEntry() -> i32:
|
|||||||
assert [] == result.log_int32_list
|
assert [] == result.log_int32_list
|
||||||
|
|
||||||
@pytest.mark.integration_test
|
@pytest.mark.integration_test
|
||||||
def test_struct():
|
def test_struct_1():
|
||||||
code_py = """
|
code_py = """
|
||||||
|
|
||||||
class Rectangle:
|
class Rectangle:
|
||||||
@ -272,3 +272,28 @@ def helper(shape: Rectangle) -> i32:
|
|||||||
|
|
||||||
assert 252 == result.returned_value
|
assert 252 == result.returned_value
|
||||||
assert [] == result.log_int32_list
|
assert [] == result.log_int32_list
|
||||||
|
|
||||||
|
@pytest.mark.integration_test
|
||||||
|
def test_struct_2():
|
||||||
|
code_py = """
|
||||||
|
|
||||||
|
class Rectangle:
|
||||||
|
height: i32
|
||||||
|
width: i32
|
||||||
|
border: i32 # = 5
|
||||||
|
|
||||||
|
@exported
|
||||||
|
def testEntry() -> i32:
|
||||||
|
return helper(Rectangle(100, 150, 2), Rectangle(200, 90, 3))
|
||||||
|
|
||||||
|
def helper(shape1: Rectangle, shape2: Rectangle) -> i32:
|
||||||
|
return (
|
||||||
|
shape1.height + shape1.width + shape1.border
|
||||||
|
+ shape2.height + shape2.width + shape2.border
|
||||||
|
)
|
||||||
|
"""
|
||||||
|
|
||||||
|
result = Suite(code_py, 'test_call').run_code()
|
||||||
|
|
||||||
|
assert 545 == result.returned_value
|
||||||
|
assert [] == result.log_int32_list
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user