Skip to content

Commit

Permalink
[mypyc] Add LoadAddress op for PyFloat_Type & PyTuple_Type
Browse files Browse the repository at this point in the history
- Fixes mypyc/mypyc#924
- Fixes mypyc/mypyc#926
- Fixes mypyc/mypyc#935

This is a follow-up of commit 7811f08.
  • Loading branch information
ichard26 committed Jul 6, 2022
1 parent 86aefb1 commit 0406c4c
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 11 deletions.
10 changes: 8 additions & 2 deletions mypyc/primitives/float_ops.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,18 @@

from mypyc.ir.ops import ERR_MAGIC
from mypyc.ir.rtypes import (
str_rprimitive, float_rprimitive
str_rprimitive, float_rprimitive, object_rprimitive
)
from mypyc.primitives.registry import (
function_op
load_address_op, function_op
)

# Get the 'builtins.float' type object.
load_address_op(
name='builtins.float',
type=object_rprimitive,
src='PyFloat_Type')

# float(str)
function_op(
name='builtins.float',
Expand Down
7 changes: 6 additions & 1 deletion mypyc/primitives/tuple_ops.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,13 @@
tuple_rprimitive, int_rprimitive, list_rprimitive, object_rprimitive,
c_pyssize_t_rprimitive, bit_rprimitive
)
from mypyc.primitives.registry import method_op, function_op, custom_op
from mypyc.primitives.registry import load_address_op, method_op, function_op, custom_op

# Get the 'builtins.tuple' type object.
load_address_op(
name='builtins.tuple',
type=object_rprimitive,
src='PyTuple_Type')

# tuple[index] (for an int index)
tuple_get_item_op = method_op(
Expand Down
11 changes: 4 additions & 7 deletions mypyc/test-data/irbuild-dunders.test
Original file line number Diff line number Diff line change
Expand Up @@ -175,16 +175,13 @@ L0:
def f(c):
c :: __main__.C
r0, r1 :: int
r2, r3, r4 :: object
r5 :: str
r6, r7 :: object
r2, r3, r4, r5 :: object
L0:
r0 = c.__neg__()
r1 = c.__invert__()
r2 = load_address PyLong_Type
r3 = PyObject_CallFunctionObjArgs(r2, c, 0)
r4 = builtins :: module
r5 = 'float'
r6 = CPyObject_GetAttr(r4, r5)
r7 = PyObject_CallFunctionObjArgs(r6, c, 0)
r4 = load_address PyFloat_Type
r5 = PyObject_CallFunctionObjArgs(r4, c, 0)
return 1

4 changes: 3 additions & 1 deletion mypyc/test-data/run-python37.test
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ class Person4:

@dataclass
class Person5:
weight: float
friends: Set[str] = field(default_factory=set)
parents: FrozenSet[str] = frozenset()

Expand Down Expand Up @@ -122,7 +123,8 @@ assert i8 > i9

assert Person1.__annotations__ == {'age': int, 'name': str}
assert Person2.__annotations__ == {'age': int, 'name': str}
assert Person5.__annotations__ == {'friends': set, 'parents': frozenset}
assert Person5.__annotations__ == {'weight': float, 'friends': set,
'parents': frozenset}

[file driver.py]
import sys
Expand Down
67 changes: 67 additions & 0 deletions mypyc/test-data/run-tuples.test
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,73 @@ class Sub(NT):
pass
assert f(Sub(3, 2)) == 3

-- Ref: https://github.com/mypyc/mypyc/issues/924
[case testNamedTupleClassSyntax]
from typing import Dict, List, NamedTuple, Optional, Tuple, Union

class FileData(NamedTuple):
st_mtime: float
st_size: int
hash: str

class SearchPaths(NamedTuple):
python_path: Tuple[str, ...]
mypy_path: Tuple[str, ...]
package_path: Tuple[str, ...]
typeshed_path: Tuple[str, ...]

class ClassIR: pass

class FuncIR: pass

class VTableMethod(NamedTuple):
cls: 'ClassIR'
name: str
method: FuncIR
shadow_method: Optional[FuncIR]

class DeserMaps(NamedTuple):
classes: Dict[str, 'ClassIR']
functions: Dict[str, 'FuncIR']

StealsDescription = Union[bool, List[bool]]

class RType: pass

class CFunctionDescription(NamedTuple):
name: str
arg_types: List[RType]
return_type: RType
var_arg_type: Optional[RType]
truncated_type: Optional[RType]
c_function_name: str
error_kind: int
steals: StealsDescription
is_borrowed: bool
ordering: Optional[List[int]]
extra_int_constants: List[Tuple[int, RType]]
priority: int

class IntComparisonOpDescription(NamedTuple):
binary_op_variant: int
c_func_description: CFunctionDescription
c_func_negated: bool
c_func_swap_operands: bool

class LoadAddressDescription(NamedTuple):
name: str
type: RType
src: str

[file driver.py]
from native import FileData, SearchPaths, DeserMaps, LoadAddressDescription, RType

assert FileData.__annotations__ == {'st_mtime': float, 'st_size': int, 'hash': str}
assert SearchPaths.__annotations__ == {'python_path': tuple, 'mypy_path': tuple,
'package_path': tuple, 'typeshed_path': tuple}
assert DeserMaps.__annotations__ == {'classes': dict, 'functions': dict}
assert LoadAddressDescription.__annotations__ == {'name': str, 'type': RType, 'src': str}

[case testTupleOps]
from typing import Tuple, List, Any, Optional
from typing_extensions import Final
Expand Down

0 comments on commit 0406c4c

Please sign in to comment.