Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit60c8af0

Browse files
Merge branch 'master' into patch-3
2 parents80a97a9 +27b9ba0 commit60c8af0

File tree

8 files changed

+877
-72
lines changed

8 files changed

+877
-72
lines changed

‎mypyc/ir/rtypes.py‎

Lines changed: 44 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ def may_be_immortal(self) -> bool:
192192
defserialize(self)->str:
193193
return"void"
194194

195-
def__eq__(self,other:object)->bool:
195+
def__eq__(self,other:object)->TypeGuard[RVoid]:
196196
returnisinstance(other,RVoid)
197197

198198
def__hash__(self)->int:
@@ -279,7 +279,7 @@ def serialize(self) -> str:
279279
def__repr__(self)->str:
280280
return"<RPrimitive %s>"%self.name
281281

282-
def__eq__(self,other:object)->bool:
282+
def__eq__(self,other:object)->TypeGuard[RPrimitive]:
283283
returnisinstance(other,RPrimitive)andother.name==self.name
284284

285285
def__hash__(self)->int:
@@ -513,15 +513,15 @@ def __hash__(self) -> int:
513513
range_rprimitive:Final=RPrimitive("builtins.range",is_unboxed=False,is_refcounted=True)
514514

515515

516-
defis_tagged(rtype:RType)->bool:
516+
defis_tagged(rtype:RType)->TypeGuard[RPrimitive]:
517517
returnrtypeisint_rprimitiveorrtypeisshort_int_rprimitive
518518

519519

520-
defis_int_rprimitive(rtype:RType)->bool:
520+
defis_int_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
521521
returnrtypeisint_rprimitive
522522

523523

524-
defis_short_int_rprimitive(rtype:RType)->bool:
524+
defis_short_int_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
525525
returnrtypeisshort_int_rprimitive
526526

527527

@@ -535,7 +535,7 @@ def is_int32_rprimitive(rtype: RType) -> TypeGuard[RPrimitive]:
535535
)
536536

537537

538-
defis_int64_rprimitive(rtype:RType)->bool:
538+
defis_int64_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
539539
returnrtypeisint64_rprimitiveor (
540540
rtypeisc_pyssize_t_rprimitiveandrtype._ctype=="int64_t"
541541
)
@@ -554,81 +554,93 @@ def is_uint8_rprimitive(rtype: RType) -> TypeGuard[RPrimitive]:
554554
returnrtypeisuint8_rprimitive
555555

556556

557-
defis_uint32_rprimitive(rtype:RType)->bool:
557+
defis_uint32_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
558558
returnrtypeisuint32_rprimitive
559559

560560

561-
defis_uint64_rprimitive(rtype:RType)->bool:
561+
defis_uint64_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
562562
returnrtypeisuint64_rprimitive
563563

564564

565-
defis_c_py_ssize_t_rprimitive(rtype:RType)->bool:
565+
defis_c_py_ssize_t_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
566566
returnrtypeisc_pyssize_t_rprimitive
567567

568568

569-
defis_pointer_rprimitive(rtype:RType)->bool:
569+
defis_pointer_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
570570
returnrtypeispointer_rprimitive
571571

572572

573-
defis_float_rprimitive(rtype:RType)->bool:
573+
defis_float_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
574574
returnisinstance(rtype,RPrimitive)andrtype.name=="builtins.float"
575575

576576

577-
defis_bool_rprimitive(rtype:RType)->bool:
577+
defis_bool_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
578578
returnisinstance(rtype,RPrimitive)andrtype.name=="builtins.bool"
579579

580580

581-
defis_bit_rprimitive(rtype:RType)->bool:
581+
defis_bit_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
582582
returnisinstance(rtype,RPrimitive)andrtype.name=="bit"
583583

584584

585-
defis_bool_or_bit_rprimitive(rtype:RType)->bool:
585+
defis_bool_or_bit_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
586586
returnis_bool_rprimitive(rtype)oris_bit_rprimitive(rtype)
587587

588588

589-
defis_object_rprimitive(rtype:RType)->bool:
589+
defis_object_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
590590
returnisinstance(rtype,RPrimitive)andrtype.name=="builtins.object"
591591

592592

593-
defis_none_rprimitive(rtype:RType)->bool:
593+
defis_none_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
594594
returnisinstance(rtype,RPrimitive)andrtype.name=="builtins.None"
595595

596596

597-
defis_list_rprimitive(rtype:RType)->bool:
597+
defis_list_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
598598
returnisinstance(rtype,RPrimitive)andrtype.name=="builtins.list"
599599

600600

601-
defis_dict_rprimitive(rtype:RType)->bool:
601+
defis_dict_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
602602
returnisinstance(rtype,RPrimitive)andrtype.name=="builtins.dict"
603603

604604

605-
defis_set_rprimitive(rtype:RType)->bool:
605+
defis_set_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
606606
returnisinstance(rtype,RPrimitive)andrtype.name=="builtins.set"
607607

608608

609-
defis_frozenset_rprimitive(rtype:RType)->bool:
609+
defis_frozenset_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
610610
returnisinstance(rtype,RPrimitive)andrtype.name=="builtins.frozenset"
611611

612612

613-
defis_str_rprimitive(rtype:RType)->bool:
613+
defis_str_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
614614
returnisinstance(rtype,RPrimitive)andrtype.name=="builtins.str"
615615

616616

617-
defis_bytes_rprimitive(rtype:RType)->bool:
617+
defis_bytes_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
618618
returnisinstance(rtype,RPrimitive)andrtype.name=="builtins.bytes"
619619

620620

621-
defis_tuple_rprimitive(rtype:RType)->bool:
621+
defis_tuple_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
622622
returnisinstance(rtype,RPrimitive)andrtype.name=="builtins.tuple"
623623

624624

625-
defis_range_rprimitive(rtype:RType)->bool:
625+
defis_range_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
626626
returnisinstance(rtype,RPrimitive)andrtype.name=="builtins.range"
627627

628628

629-
defis_sequence_rprimitive(rtype:RType)->bool:
629+
defis_sequence_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
630630
returnisinstance(rtype,RPrimitive)and (
631-
is_list_rprimitive(rtype)oris_tuple_rprimitive(rtype)oris_str_rprimitive(rtype)
631+
is_list_rprimitive(rtype)
632+
oris_tuple_rprimitive(rtype)
633+
oris_str_rprimitive(rtype)
634+
oris_bytes_rprimitive(rtype)
635+
)
636+
637+
638+
defis_immutable_rprimitive(rtype:RType)->TypeGuard[RPrimitive]:
639+
return (
640+
is_str_rprimitive(rtype)
641+
oris_bytes_rprimitive(rtype)
642+
oris_tuple_rprimitive(rtype)
643+
oris_frozenset_rprimitive(rtype)
632644
)
633645

634646

@@ -717,7 +729,7 @@ def __str__(self) -> str:
717729
def__repr__(self)->str:
718730
return"<RTuple %s>"%", ".join(repr(typ)fortypinself.types)
719731

720-
def__eq__(self,other:object)->bool:
732+
def__eq__(self,other:object)->TypeGuard[RTuple]:
721733
returnisinstance(other,RTuple)andself.types==other.types
722734

723735
def__hash__(self)->int:
@@ -850,7 +862,7 @@ def __repr__(self) -> str:
850862
", ".join(name+":"+repr(typ)forname,typinzip(self.names,self.types)),
851863
)
852864

853-
def__eq__(self,other:object)->bool:
865+
def__eq__(self,other:object)->TypeGuard[RStruct]:
854866
return (
855867
isinstance(other,RStruct)
856868
andself.name==other.name
@@ -920,7 +932,7 @@ def attr_type(self, name: str) -> RType:
920932
def__repr__(self)->str:
921933
return"<RInstance %s>"%self.name
922934

923-
def__eq__(self,other:object)->bool:
935+
def__eq__(self,other:object)->TypeGuard[RInstance]:
924936
returnisinstance(other,RInstance)andother.name==self.name
925937

926938
def__hash__(self)->int:
@@ -974,7 +986,7 @@ def __str__(self) -> str:
974986
return"union[%s]"%", ".join(str(item)foriteminself.items)
975987

976988
# We compare based on the set because order in a union doesn't matter
977-
def__eq__(self,other:object)->bool:
989+
def__eq__(self,other:object)->TypeGuard[RUnion]:
978990
returnisinstance(other,RUnion)andself.items_set==other.items_set
979991

980992
def__hash__(self)->int:
@@ -1016,7 +1028,7 @@ def optional_value_type(rtype: RType) -> RType | None:
10161028
returnNone
10171029

10181030

1019-
defis_optional_type(rtype:RType)->bool:
1031+
defis_optional_type(rtype:RType)->TypeGuard[RUnion]:
10201032
"""Is rtype an optional type with exactly two union items?"""
10211033
returnoptional_value_type(rtype)isnotNone
10221034

@@ -1048,7 +1060,7 @@ def __str__(self) -> str:
10481060
def__repr__(self)->str:
10491061
returnf"<RArray{self.item_type!r}[{self.length}]>"
10501062

1051-
def__eq__(self,other:object)->bool:
1063+
def__eq__(self,other:object)->TypeGuard[RArray]:
10521064
return (
10531065
isinstance(other,RArray)
10541066
andself.item_type==other.item_type

‎mypyc/irbuild/builder.py‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@
9191
RType,
9292
RUnion,
9393
bitmap_rprimitive,
94+
bytes_rprimitive,
9495
c_pyssize_t_rprimitive,
9596
dict_rprimitive,
9697
int_rprimitive,
@@ -962,8 +963,12 @@ def get_sequence_type_from_type(self, target_type: Type) -> RType:
962963
elifisinstance(target_type,Instance):
963964
iftarget_type.type.fullname=="builtins.str":
964965
returnstr_rprimitive
965-
else:
966+
eliftarget_type.type.fullname=="builtins.bytes":
967+
returnbytes_rprimitive
968+
try:
966969
returnself.type_to_rtype(target_type.args[0])
970+
exceptIndexError:
971+
raiseValueError(f"{target_type!r} is not a valid sequence.")fromNone
967972
# This elif-blocks are needed for iterating over classes derived from NamedTuple.
968973
elifisinstance(target_type,TypeVarLikeType):
969974
returnself.get_sequence_type_from_type(target_type.upper_bound)

‎mypyc/irbuild/for_helpers.py‎

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
int_rprimitive,
4949
is_dict_rprimitive,
5050
is_fixed_width_rtype,
51+
is_immutable_rprimitive,
5152
is_list_rprimitive,
5253
is_sequence_rprimitive,
5354
is_short_int_rprimitive,
@@ -205,9 +206,9 @@ def sequence_from_generator_preallocate_helper(
205206
there is no condition list in the generator and only one original sequence with
206207
one index is allowed.
207208
208-
e.g. (1) tuple(f(x) for x in a_list/a_tuple)
209-
(2) list(f(x) for x in a_list/a_tuple)
210-
(3) [f(x) for x in a_list/a_tuple]
209+
e.g. (1) tuple(f(x) for x in a_list/a_tuple/a_str/a_bytes)
210+
(2) list(f(x) for x in a_list/a_tuple/a_str/a_bytes)
211+
(3) [f(x) for x in a_list/a_tuple/a_str/a_bytes]
211212
RTuple as an original sequence is not supported yet.
212213
213214
Args:
@@ -224,7 +225,7 @@ def sequence_from_generator_preallocate_helper(
224225
"""
225226
iflen(gen.sequences)==1andlen(gen.indices)==1andlen(gen.condlists[0])==0:
226227
rtype=builder.node_type(gen.sequences[0])
227-
ifis_list_rprimitive(rtype)oris_tuple_rprimitive(rtype)oris_str_rprimitive(rtype):
228+
ifis_sequence_rprimitive(rtype):
228229
sequence=builder.accept(gen.sequences[0])
229230
length=builder.builder.builtin_len(sequence,gen.line,use_pyssize_t=True)
230231
target_op=empty_op_llbuilder(length,gen.line)
@@ -785,17 +786,31 @@ class ForSequence(ForGenerator):
785786
Supports iterating in both forward and reverse.
786787
"""
787788

789+
length_reg:Value|AssignmentTarget|None
790+
788791
definit(self,expr_reg:Value,target_type:RType,reverse:bool)->None:
792+
assertis_sequence_rprimitive(expr_reg.type),expr_reg
789793
builder=self.builder
790794
self.reverse=reverse
791795
# Define target to contain the expression, along with the index that will be used
792796
# for the for-loop. If we are inside of a generator function, spill these into the
793797
# environment class.
794798
self.expr_target=builder.maybe_spill(expr_reg)
799+
ifis_immutable_rprimitive(expr_reg.type):
800+
# If the expression is an immutable type, we can load the length just once.
801+
self.length_reg=builder.maybe_spill(self.load_len(self.expr_target))
802+
else:
803+
# Otherwise, even if the length is known, we must recalculate the length
804+
# at every iteration for compatibility with python semantics.
805+
self.length_reg=None
795806
ifnotreverse:
796807
index_reg:Value=Integer(0,c_pyssize_t_rprimitive)
797808
else:
798-
index_reg=builder.builder.int_sub(self.load_len(self.expr_target),1)
809+
ifself.length_regisnotNone:
810+
len_val=builder.read(self.length_reg)
811+
else:
812+
len_val=self.load_len(self.expr_target)
813+
index_reg=builder.builder.int_sub(len_val,1)
799814
self.index_target=builder.maybe_spill_assignable(index_reg)
800815
self.target_type=target_type
801816

@@ -814,9 +829,13 @@ def gen_condition(self) -> None:
814829
second_check=BasicBlock()
815830
builder.add_bool_branch(comparison,second_check,self.loop_exit)
816831
builder.activate_block(second_check)
817-
# For compatibility with python semantics we recalculate the length
818-
# at every iteration.
819-
len_reg=self.load_len(self.expr_target)
832+
ifself.length_regisNone:
833+
# For compatibility with python semantics we recalculate the length
834+
# at every iteration.
835+
len_reg=self.load_len(self.expr_target)
836+
else:
837+
# (unless input is immutable type).
838+
len_reg=builder.read(self.length_reg,line)
820839
comparison=builder.binary_op(builder.read(self.index_target,line),len_reg,"<",line)
821840
builder.add_bool_branch(comparison,self.body_block,self.loop_exit)
822841

‎mypyc/irbuild/specialize.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ def translate_tuple_from_generator_call(
289289
"""Special case for simplest tuple creation from a generator.
290290
291291
For example:
292-
tuple(f(x) for x in some_list/some_tuple/some_str)
292+
tuple(f(x) for x in some_list/some_tuple/some_str/some_bytes)
293293
'translate_safe_generator_call()' would take care of other cases
294294
if this fails.
295295
"""

‎mypyc/test-data/fixtures/ir.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ def __getitem__(self, i: int) -> int: ...
172172
def__getitem__(self,i:slice)->bytes: ...
173173
defjoin(self,x:Iterable[object])->bytes: ...
174174
defdecode(self,x:str=...,y:str=...)->str: ...
175+
def__iter__(self)->Iterator[int]: ...
175176

176177
classbytearray:
177178
@overload

‎mypyc/test-data/irbuild-generics.test‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -711,18 +711,18 @@ L0:
711711
r0 = __mypyc_self__.__mypyc_env__
712712
r1 = var_object_size args
713713
r2 = PyList_New(r1)
714-
r3 = 0
714+
r3 = var_object_size args
715+
r4 = 0
715716
L1:
716-
r4 = var_object_size args
717-
r5 = r3 < r4 :: signed
717+
r5 = r4 < r3 :: signed
718718
if r5 goto L2 else goto L4 :: bool
719719
L2:
720-
r6 = CPySequenceTuple_GetItemUnsafe(args,r3)
720+
r6 = CPySequenceTuple_GetItemUnsafe(args,r4)
721721
x = r6
722-
CPyList_SetItemUnsafe(r2,r3, x)
722+
CPyList_SetItemUnsafe(r2,r4, x)
723723
L3:
724-
r7 =r3 + 1
725-
r3 = r7
724+
r7 =r4 + 1
725+
r4 = r7
726726
goto L1
727727
L4:
728728
can_listcomp = r2

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp