sonolus.py 0.10.9__py3-none-any.whl → 0.11.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of sonolus.py might be problematic. Click here for more details.
- sonolus/backend/finalize.py +9 -1
- sonolus/backend/optimize/liveness.py +5 -2
- sonolus/backend/visitor.py +3 -1
- sonolus/script/archetype.py +1 -1
- sonolus/script/containers.py +50 -0
- sonolus/script/internal/context.py +5 -1
- sonolus/script/internal/impl.py +5 -5
- sonolus/script/internal/tuple_impl.py +6 -0
- {sonolus_py-0.10.9.dist-info → sonolus_py-0.11.0.dist-info}/METADATA +1 -1
- {sonolus_py-0.10.9.dist-info → sonolus_py-0.11.0.dist-info}/RECORD +13 -13
- {sonolus_py-0.10.9.dist-info → sonolus_py-0.11.0.dist-info}/WHEEL +0 -0
- {sonolus_py-0.10.9.dist-info → sonolus_py-0.11.0.dist-info}/entry_points.txt +0 -0
- {sonolus_py-0.10.9.dist-info → sonolus_py-0.11.0.dist-info}/licenses/LICENSE +0 -0
sonolus/backend/finalize.py
CHANGED
|
@@ -65,7 +65,15 @@ def cfg_to_engine_node(entry: BasicBlock):
|
|
|
65
65
|
statements.append(FunctionNode(Op.SwitchWithDefault, args))
|
|
66
66
|
block_statements.append(FunctionNode(Op.Execute, statements))
|
|
67
67
|
block_statements.append(ConstantNode(value=0))
|
|
68
|
-
|
|
68
|
+
result = FunctionNode(Op.Block, [FunctionNode(Op.JumpLoop, block_statements)])
|
|
69
|
+
for block in block_indexes:
|
|
70
|
+
# Clean up without relying on gc
|
|
71
|
+
del block.incoming
|
|
72
|
+
del block.outgoing
|
|
73
|
+
del block.phis
|
|
74
|
+
del block.statements
|
|
75
|
+
del block.test
|
|
76
|
+
return result
|
|
69
77
|
|
|
70
78
|
|
|
71
79
|
def ir_to_engine_node(stmt) -> EngineNode:
|
|
@@ -24,15 +24,18 @@ class LivenessAnalysis(CompilerPass):
|
|
|
24
24
|
block.live_phi_targets = set()
|
|
25
25
|
block.array_defs_in = set()
|
|
26
26
|
block.array_defs_out = None
|
|
27
|
+
last_live_set = set()
|
|
27
28
|
for statement in block.statements:
|
|
28
|
-
statement
|
|
29
|
+
if isinstance(statement, IRSet):
|
|
30
|
+
last_live_set = set()
|
|
31
|
+
statement.live = last_live_set
|
|
29
32
|
statement.visited = False
|
|
30
33
|
statement.uses = self.get_uses(statement, set())
|
|
31
34
|
statement.defs = self.get_defs(statement)
|
|
32
35
|
statement.is_array_init = False # True if this may be the first assignment to an array
|
|
33
36
|
statement.array_defs = self.get_array_defs(statement)
|
|
34
37
|
if not isinstance(block.test, IRConst):
|
|
35
|
-
block.test.live =
|
|
38
|
+
block.test.live = last_live_set
|
|
36
39
|
block.test.uses = self.get_uses(block.test, set())
|
|
37
40
|
self.preprocess_arrays(entry)
|
|
38
41
|
|
sonolus/backend/visitor.py
CHANGED
|
@@ -1006,7 +1006,9 @@ class Visitor(ast.NodeVisitor):
|
|
|
1006
1006
|
return validate_value({self.visit(k): self.visit(v) for k, v in zip(node.keys, node.values, strict=True)})
|
|
1007
1007
|
|
|
1008
1008
|
def visit_Set(self, node):
|
|
1009
|
-
|
|
1009
|
+
from sonolus.script.containers import FrozenNumSet
|
|
1010
|
+
|
|
1011
|
+
return self.handle_call(node, FrozenNumSet.of, *(self.visit(elt) for elt in node.elts))
|
|
1010
1012
|
|
|
1011
1013
|
def visit_ListComp(self, node):
|
|
1012
1014
|
raise NotImplementedError("List comprehensions are not supported")
|
sonolus/script/archetype.py
CHANGED
|
@@ -581,7 +581,6 @@ class _BaseArchetype:
|
|
|
581
581
|
def _init_fields(cls):
|
|
582
582
|
if cls._field_init_done:
|
|
583
583
|
return
|
|
584
|
-
cls._field_init_done = True
|
|
585
584
|
for mro_entry in cls.mro()[1:]:
|
|
586
585
|
if hasattr(mro_entry, "_field_init_done"):
|
|
587
586
|
mro_entry._init_fields()
|
|
@@ -706,6 +705,7 @@ class _BaseArchetype:
|
|
|
706
705
|
[inspect.Parameter(name, inspect.Parameter.POSITIONAL_OR_KEYWORD) for name in cls._memory_fields_]
|
|
707
706
|
)
|
|
708
707
|
cls._post_init_fields()
|
|
708
|
+
cls._field_init_done = True
|
|
709
709
|
|
|
710
710
|
@property
|
|
711
711
|
@abstractmethod
|
sonolus/script/containers.py
CHANGED
|
@@ -3,6 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
from collections.abc import Callable
|
|
4
4
|
from typing import Any, Protocol, Self
|
|
5
5
|
|
|
6
|
+
from sonolus.backend.visitor import compile_and_call
|
|
6
7
|
from sonolus.script.archetype import AnyArchetype, EntityRef
|
|
7
8
|
from sonolus.script.array import Array
|
|
8
9
|
from sonolus.script.array_like import ArrayLike, get_positive_index
|
|
@@ -441,6 +442,55 @@ class ArraySet[T, Capacity](Record):
|
|
|
441
442
|
self._values.clear()
|
|
442
443
|
|
|
443
444
|
|
|
445
|
+
class FrozenNumSet[Size](Record):
|
|
446
|
+
_values: Array[Num, Size]
|
|
447
|
+
|
|
448
|
+
@classmethod
|
|
449
|
+
@meta_fn
|
|
450
|
+
def of(cls, *values: Num) -> Self:
|
|
451
|
+
if ctx():
|
|
452
|
+
try:
|
|
453
|
+
num_values = [Num._accept_(v) for v in values]
|
|
454
|
+
except TypeError:
|
|
455
|
+
raise TypeError("Only sets of numeric values are supported") from None
|
|
456
|
+
if all(v._is_py_() for v in num_values):
|
|
457
|
+
const_values = [v._as_py_() for v in num_values]
|
|
458
|
+
arr = Array[Num, len(const_values)]._with_value([Num(v) for v in sorted(const_values)])
|
|
459
|
+
return cls(arr)
|
|
460
|
+
else:
|
|
461
|
+
arr = Array[Num, len(values)](*values)
|
|
462
|
+
compile_and_call(arr.sort)
|
|
463
|
+
else:
|
|
464
|
+
arr = Array[Num, len(values)](*sorted(values))
|
|
465
|
+
return cls(arr)
|
|
466
|
+
|
|
467
|
+
def __len__(self) -> int:
|
|
468
|
+
return len(self._values)
|
|
469
|
+
|
|
470
|
+
def __contains__(self, value: Num) -> bool:
|
|
471
|
+
if len(self) < 15:
|
|
472
|
+
for i in range(len(self)): # noqa: SIM110
|
|
473
|
+
if self._values.get_unchecked(i) == value:
|
|
474
|
+
return True
|
|
475
|
+
return False
|
|
476
|
+
else:
|
|
477
|
+
left = 0
|
|
478
|
+
right = len(self) - 1
|
|
479
|
+
while left <= right:
|
|
480
|
+
mid = (left + right) // 2
|
|
481
|
+
mid_value = self._values.get_unchecked(mid)
|
|
482
|
+
if mid_value == value:
|
|
483
|
+
return True
|
|
484
|
+
elif mid_value < value:
|
|
485
|
+
left = mid + 1
|
|
486
|
+
else:
|
|
487
|
+
right = mid - 1
|
|
488
|
+
return False
|
|
489
|
+
|
|
490
|
+
def __iter__(self) -> SonolusIterator[Num]:
|
|
491
|
+
return self._values.__iter__()
|
|
492
|
+
|
|
493
|
+
|
|
444
494
|
class _ArrayMapEntry[K, V](Record):
|
|
445
495
|
key: K
|
|
446
496
|
value: V
|
|
@@ -551,7 +551,11 @@ def context_to_cfg(context: Context) -> BasicBlock:
|
|
|
551
551
|
edge = FlowEdge(src=blocks[current], dst=blocks[target], cond=condition)
|
|
552
552
|
blocks[current].outgoing.add(edge)
|
|
553
553
|
blocks[target].incoming.add(edge)
|
|
554
|
-
|
|
554
|
+
result = blocks[context]
|
|
555
|
+
for current in tuple(iter_contexts(context)):
|
|
556
|
+
# Break cycles so memory can be cleaned without gc
|
|
557
|
+
del current.outgoing
|
|
558
|
+
return result
|
|
555
559
|
|
|
556
560
|
|
|
557
561
|
def unique[T](iterable: Iterable[T]) -> list[T]:
|
sonolus/script/internal/impl.py
CHANGED
|
@@ -77,6 +77,10 @@ def try_validate_value(value: Any) -> Value | None:
|
|
|
77
77
|
return TupleImpl._accept_(value)
|
|
78
78
|
case dict():
|
|
79
79
|
return DictImpl._accept_(value)
|
|
80
|
+
case set() | frozenset():
|
|
81
|
+
from sonolus.script.containers import FrozenNumSet
|
|
82
|
+
|
|
83
|
+
return FrozenNumSet.of(*value)
|
|
80
84
|
case (
|
|
81
85
|
PartialGeneric()
|
|
82
86
|
| TypeVar()
|
|
@@ -90,11 +94,7 @@ def try_validate_value(value: Any) -> Value | None:
|
|
|
90
94
|
| super()
|
|
91
95
|
):
|
|
92
96
|
return BasicConstantValue.of(value)
|
|
93
|
-
case special_form if value
|
|
94
|
-
Literal,
|
|
95
|
-
Annotated,
|
|
96
|
-
Union,
|
|
97
|
-
}:
|
|
97
|
+
case special_form if value == Literal or value == Annotated or value == Union: # noqa: PLR1714, SIM109
|
|
98
98
|
return TypingSpecialFormConstant.of(special_form)
|
|
99
99
|
case other_type if get_origin(value) in {Literal, Annotated, UnionType, tuple, type}:
|
|
100
100
|
return BasicConstantValue.of(other_type)
|
|
@@ -91,6 +91,12 @@ class TupleImpl(TransientValue):
|
|
|
91
91
|
other = TupleImpl._accept_(other)
|
|
92
92
|
return TupleImpl._accept_(self.value + other.value)
|
|
93
93
|
|
|
94
|
+
def __contains__(self, item):
|
|
95
|
+
for element in self.value: # noqa: SIM110
|
|
96
|
+
if element == item:
|
|
97
|
+
return True
|
|
98
|
+
return False
|
|
99
|
+
|
|
94
100
|
@staticmethod
|
|
95
101
|
@meta_fn
|
|
96
102
|
def _is_tuple_impl(value: Any) -> bool:
|
|
@@ -3,7 +3,7 @@ sonolus/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
3
3
|
sonolus/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
4
|
sonolus/backend/blocks.py,sha256=3peyb9eYBy0s53xNVJ1KmK4IgoyVkkwG-lqDQ_VZTHc,18531
|
|
5
5
|
sonolus/backend/excepthook.py,sha256=ezsTi8hPXSUhqZ7-H0rmkWcndBQcZFAShF543zzaEPM,1912
|
|
6
|
-
sonolus/backend/finalize.py,sha256=
|
|
6
|
+
sonolus/backend/finalize.py,sha256=kytaqAVyoryWJTyJEbvIGysfxmt_DeCic2oxmrqAPYI,5508
|
|
7
7
|
sonolus/backend/interpret.py,sha256=B0jqlLmEGoyO2mxpcvwRwV17Tq_gOE9wLNt26Q5QOfs,14306
|
|
8
8
|
sonolus/backend/ir.py,sha256=eyNXorOQY4zgKOvN4kO1MdJF3sU8H0Qw5RTPqbEjJHY,3854
|
|
9
9
|
sonolus/backend/mode.py,sha256=NkcPZJm8dn83LX35uP24MtQOCnfRDFZ280dHeEEfauE,613
|
|
@@ -11,7 +11,7 @@ sonolus/backend/node.py,sha256=eEzPP14jzWJp2xrZCAaPlNtokxdoqg0bSM7xQiwx1j8,1254
|
|
|
11
11
|
sonolus/backend/ops.py,sha256=5weB_vIxbkwCSJuzYZyKUk7vVXsSIEDJYRlvE-2ke8A,10572
|
|
12
12
|
sonolus/backend/place.py,sha256=7qwV732hZ4WP-9GNN8FQSEKssPJZELip1wLXTWfop7Y,4717
|
|
13
13
|
sonolus/backend/utils.py,sha256=OwD1EPh8j-hsfkLzeKNzPQojT_3kklpJou0WTJNoCbc,2337
|
|
14
|
-
sonolus/backend/visitor.py,sha256=
|
|
14
|
+
sonolus/backend/visitor.py,sha256=lEq_lkCh74_mK_saE4JeRI9_mM8MMeWRzw4mqJ0Et7c,64450
|
|
15
15
|
sonolus/backend/optimize/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
16
16
|
sonolus/backend/optimize/allocate.py,sha256=CuumoMphkpQlGRNeKLHT4FBGE0XVj5pwhfNdrqiLFSs,7535
|
|
17
17
|
sonolus/backend/optimize/constant_evaluation.py,sha256=_u_VfLmd4Rlq9aKyRSeKb47352CXuf8uNgNhNTK1qe0,21510
|
|
@@ -20,7 +20,7 @@ sonolus/backend/optimize/dead_code.py,sha256=ZRJ95zJ49R-wZTzJtcSSbl5LYKHWI-byHM3
|
|
|
20
20
|
sonolus/backend/optimize/dominance.py,sha256=3jAgXqXTbuYLpXvIm8UB06NkIOLtaoVp7pBVPcLb5vY,3259
|
|
21
21
|
sonolus/backend/optimize/flow.py,sha256=xUoBpWIYi-NjqXahA6obAZaPvLj_HaDNNv7cO13e2ps,7192
|
|
22
22
|
sonolus/backend/optimize/inlining.py,sha256=BEXjPbJMGTJbgA4ydC38TbEuYEFqb6oxDS0roZTmuds,10417
|
|
23
|
-
sonolus/backend/optimize/liveness.py,sha256=
|
|
23
|
+
sonolus/backend/optimize/liveness.py,sha256=cj0oUrqItVjj58ZQq86nRBO5k0fuTxbmWkvrSv3H-pY,7420
|
|
24
24
|
sonolus/backend/optimize/optimize.py,sha256=2gW0n1AIlwgVjY6teQlt9YP-GsFUxU-mr1ZqAZamnUo,1672
|
|
25
25
|
sonolus/backend/optimize/passes.py,sha256=YyFKy6qCwcR_Ua2_SXpcBODfvBbm_ygVYcqloOlfDZI,1911
|
|
26
26
|
sonolus/backend/optimize/simplify.py,sha256=wvhixe0SfditrGMh0nX0Wt0JR00JqAmz4BKBzMoBAVI,14701
|
|
@@ -35,11 +35,11 @@ sonolus/build/level.py,sha256=KLqUAtxIuIqrzeFURJA97rdqjA5pcvYSmwNZQhElaMQ,702
|
|
|
35
35
|
sonolus/build/node.py,sha256=gnX71RYDUOK_gYMpinQi-bLWO4csqcfiG5gFmhxzSec,1330
|
|
36
36
|
sonolus/build/project.py,sha256=Uuz82QtTNFdklrVJ_i7EPp8hSjyOxLU1xAeOloa6G00,8579
|
|
37
37
|
sonolus/script/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
38
|
-
sonolus/script/archetype.py,sha256=
|
|
38
|
+
sonolus/script/archetype.py,sha256=J_0E6a183Spez8NTd_jyH0kjIO81Q1a3i6GrNzjyWuw,49631
|
|
39
39
|
sonolus/script/array.py,sha256=EbrNwl_WuJ0JjjkX0s_VJNXWqvYdm_ljTbyrDEMLGUY,13348
|
|
40
40
|
sonolus/script/array_like.py,sha256=E6S4TW2muXgcyVkhUASQVt7JSYUkpvdJPgHz6YiSHNo,14708
|
|
41
41
|
sonolus/script/bucket.py,sha256=LNePLmCwgXfKLmH4Z7ZcTFKWR32eq4AnnagI7jacrsU,7782
|
|
42
|
-
sonolus/script/containers.py,sha256=
|
|
42
|
+
sonolus/script/containers.py,sha256=iZWPVvVr24iHBb8umuYV0LrCkr9Xgj1piWaat_he7-w,28643
|
|
43
43
|
sonolus/script/debug.py,sha256=21_bvhP2cZ4kwS3Spxp8tP6ojIfmthQxlq4gtqrt0lo,7757
|
|
44
44
|
sonolus/script/easing.py,sha256=2FUJI_nfp990P_armCcRqHm2329O985glJAhSC6tnxs,11379
|
|
45
45
|
sonolus/script/effect.py,sha256=SfJxSNF3RlPCRXnkt62ZlWhCXw3mmmRCsoMsvTErUP0,7960
|
|
@@ -72,12 +72,12 @@ sonolus/script/internal/__init__.py,sha256=T6rzLoiOUaiSQtaHMZ88SNO-ijSjSSv33TKtU
|
|
|
72
72
|
sonolus/script/internal/builtin_impls.py,sha256=1fo6UuWlaLoqpVwFSrFS5BabNeRCdS2T2mjsS4BPYcY,13603
|
|
73
73
|
sonolus/script/internal/callbacks.py,sha256=vWzJG8uiJoEtsNnbeZPqOHogCwoLpz2D1MnHY2wVV8s,2801
|
|
74
74
|
sonolus/script/internal/constant.py,sha256=3ycbGkDJVUwcrCZ96vLjAoAARgsvaqDM8rJ_YCrLrvo,4289
|
|
75
|
-
sonolus/script/internal/context.py,sha256=
|
|
75
|
+
sonolus/script/internal/context.py,sha256=fRvdxkx7EILU54-ogR1HSjLOZnH2PVw2gQri9m86K5Y,19852
|
|
76
76
|
sonolus/script/internal/descriptor.py,sha256=XRFey-EjiAm_--KsNl-8N0Mi_iyQwlPh68gDp0pKf3E,392
|
|
77
77
|
sonolus/script/internal/dict_impl.py,sha256=alu_wKGSk1kZajNf64qbe7t71shEzD4N5xNIATH8Swo,1885
|
|
78
78
|
sonolus/script/internal/error.py,sha256=ZNnsvQVQAnFKzcvsm6-sste2lo-tP5pPI8sD7XlAZWc,490
|
|
79
79
|
sonolus/script/internal/generic.py,sha256=_3d5Rn_tn214-77fPE67vdbdqt1PQF8-2WB_XDu5YRg,7551
|
|
80
|
-
sonolus/script/internal/impl.py,sha256=
|
|
80
|
+
sonolus/script/internal/impl.py,sha256=R88cl4nLcfF0UhA9qdYRBOsl4nMx8ucgz8l7_oRY-l8,3503
|
|
81
81
|
sonolus/script/internal/introspection.py,sha256=guL9_NR2D3OJAnNpeFdyYkO_vVXk-3KQr2-y4YielM0,1133
|
|
82
82
|
sonolus/script/internal/math_impls.py,sha256=ox2pBJ6ELRO0LdLn_RZxgHHs_PCgQOHIhmDkwmLxJaU,2975
|
|
83
83
|
sonolus/script/internal/native.py,sha256=zOuRtgI3XJ_ExyR_ZkvbDABVc_JIWaKl62lFEL_bMaw,2007
|
|
@@ -85,10 +85,10 @@ sonolus/script/internal/random.py,sha256=6Ku5edRcDUh7rtqEEYCJz0BQavw69RALsVHS25z
|
|
|
85
85
|
sonolus/script/internal/range.py,sha256=j94uV1NTZoCdZ8mOw3v51vD8L7h8l5vZpOAp6breD9I,3521
|
|
86
86
|
sonolus/script/internal/simulation_context.py,sha256=LGxLTvxbqBIhoe1R-SfwGajNIDwIJMVsHle0kvzd500,4818
|
|
87
87
|
sonolus/script/internal/transient.py,sha256=y2AWABqF1aoaP6H4_2u4MMpNioC4OsZQCtPyNI0txqo,1634
|
|
88
|
-
sonolus/script/internal/tuple_impl.py,sha256=
|
|
88
|
+
sonolus/script/internal/tuple_impl.py,sha256=WaI5HSF5h03ddXiSHEwzY9ttfsPUItaf86Y5VbZypek,3754
|
|
89
89
|
sonolus/script/internal/value.py,sha256=OngrCdmY_h6mV2Zgwqhuo4eYFad0kTk6263UAxctZcY,6963
|
|
90
|
-
sonolus_py-0.
|
|
91
|
-
sonolus_py-0.
|
|
92
|
-
sonolus_py-0.
|
|
93
|
-
sonolus_py-0.
|
|
94
|
-
sonolus_py-0.
|
|
90
|
+
sonolus_py-0.11.0.dist-info/METADATA,sha256=hhf11U7J2Zk1rkB-vixzUjS94Ygoh2R1DZ2jmdhnbC4,554
|
|
91
|
+
sonolus_py-0.11.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
92
|
+
sonolus_py-0.11.0.dist-info/entry_points.txt,sha256=oTYspY_b7SA8TptEMTDxh4-Aj-ZVPnYC9f1lqH6s9G4,54
|
|
93
|
+
sonolus_py-0.11.0.dist-info/licenses/LICENSE,sha256=JEKpqVhQYfEc7zg3Mj462sKbKYmO1K7WmvX1qvg9IJk,1067
|
|
94
|
+
sonolus_py-0.11.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|