示例#1
0
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() == """\
示例#2
0
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() == """\
示例#3
0
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() == """\
示例#4
0
 def _deserialize(self, value, attr, data, **kwargs):
     return mark_type_resolved(parse_type(value))