def test_typed_references(): scope = TEST_SCOPE program = preprocess_str(code=""" func main(): struct T: member pad0 : felt member pad1 : felt member pad2 : felt member b : T* end struct Struct: member pad0 : felt member pad1 : felt member a : T* end let x : Struct* = cast(ap + 10, Struct*) let y : Struct = [x] [fp] = x.a assert [fp] = cast(x.a.b, felt) assert [fp] = cast(x.a.b.b, felt) [fp] = y.a + 1 ret end """, prime=PRIME, main_scope=scope) def get_reference(name): scoped_name = scope + name assert isinstance(program.identifiers.get_by_full_name(scoped_name), ReferenceDefinition) return program.instructions[-1].flow_tracking_data.resolve_reference( reference_manager=program.reference_manager, name=scoped_name) expected_type_x = mark_type_resolved(parse_type(f'{scope}.main.Struct*')) assert simplify_type_system(get_reference('main.x').value)[1] == expected_type_x expected_type_y = mark_type_resolved(parse_type(f'{scope}.main.Struct')) reference = get_reference('main.y') assert simplify_type_system(reference.value)[1] == expected_type_y assert reference.value.format() == f'cast([ap + 10], {scope}.main.Struct)' assert program.format() == """\
def test_return_value_reference(): program = preprocess_str(code=""" func foo() -> (val, x, y): ret end func main(): let x = call foo [ap] = 0; ap++ x.val = 9 let y : main.Return = call foo let z = call abs 0 ret end """, prime=PRIME) scope = ScopedName.from_string assert isinstance(program.identifiers.get_by_full_name(scope('main.x')), ReferenceDefinition) expected_type = mark_type_resolved( parse_type(f'foo.{CodeElementFunction.RETURN_SCOPE}')) reference = program.instructions[-1].flow_tracking_data.resolve_reference( reference_manager=program.reference_manager, name=scope('main.x')) assert simplify_type_system(reference.value)[1] == expected_type assert isinstance(program.identifiers.get_by_full_name(scope('main.y')), ReferenceDefinition) expected_type = mark_type_resolved( parse_type(f'main.{CodeElementFunction.RETURN_SCOPE}')) reference = program.instructions[-1].flow_tracking_data.resolve_reference( reference_manager=program.reference_manager, name=scope('main.y')) assert simplify_type_system(reference.value)[1] == expected_type assert isinstance(program.identifiers.get_by_full_name(scope('main.z')), ReferenceDefinition) expected_type = parse_type('felt') reference = program.instructions[-1].flow_tracking_data.resolve_reference( reference_manager=program.reference_manager, name=scope('main.z')) assert simplify_type_system(reference.value)[1] == expected_type assert program.format() == """\
def test_typed_references(): program = preprocess_str(code=""" func main(): struct T: member b : T* = 3 end struct Struct: member a : T* = 2 end let x : Struct* = cast(ap + 10, Struct*) let y : Struct = [x] [fp] = x.a assert [fp] = x.a.b assert [fp] = x.a.b.b [fp] = y.a + 1 ret end """, prime=PRIME) scope = ScopedName.from_string assert isinstance(program.identifiers.get_by_full_name(scope('main.x')), ReferenceDefinition) expected_type_x = mark_type_resolved(parse_type('main.Struct*')) reference = program.instructions[-1].flow_tracking_data.resolve_reference( reference_manager=program.reference_manager, name=scope('main.x')) assert simplify_type_system(reference.value)[1] == \ expected_type_x assert isinstance(program.identifiers.get_by_full_name(scope('main.y')), ReferenceDefinition) expected_type_y = mark_type_resolved(parse_type('main.Struct')) reference = program.instructions[-1].flow_tracking_data.resolve_reference( reference_manager=program.reference_manager, name=scope('main.y')) assert simplify_type_system(reference.value)[1] == \ expected_type_y assert reference.value.format() == \ 'cast([ap + 10], main.Struct)' assert program.format() == """\
def _deserialize(self, value, attr, data, **kwargs): return mark_type_resolved(parse_type(value))