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.

@@ -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
- return FunctionNode(Op.Block, [FunctionNode(Op.JumpLoop, block_statements)])
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.live = set()
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 = set()
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
 
@@ -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
- raise NotImplementedError("Set literals are not supported")
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")
@@ -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
@@ -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
- return blocks[context]
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]:
@@ -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 in {
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:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sonolus.py
3
- Version: 0.10.9
3
+ Version: 0.11.0
4
4
  Summary: Sonolus engine development in Python
5
5
  Project-URL: Documentation, https://sonolus.py.qwewqa.xyz/
6
6
  Project-URL: Repository, https://github.com/qwewqa/sonolus.py
@@ -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=ivl32G7rDSVZl2EEI1HvOHpLdhhOh-ZjavwBZgPe9uA,5286
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=UuyOqHlX-On_gHlJTJAYoXFRk63JuAnheLcavVzXQZw,64362
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=KYQlXdKuwnRvY9JeAjwm1bzPbFwshcUxtYs7ycMRS-M,7279
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=ck_LR8z0ipVq3T9b735VwvQI2mxVUyjHylr4BFagXT8,49631
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=SnLXflwlX47EMQmTWnSzm9NYCi-as8lWnKzgCIK0PmM,26940
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=56pPjiPy8ZaxY3t5iEufsOMEj6BSy31G-5SoYqS6tPo,19694
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=U9D8A207yBbA-R9Qa9xE9zK4f0uDvGbHuFhwaIO81Ew,3364
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=DPNdmmRmupU8Ah4_XKq6-PdT336l4nt15_uCJKQGkkk,3587
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.10.9.dist-info/METADATA,sha256=iSSv7Kjw-_TmCXbf8qFfFtO3zd8nqyTsQ7YpxgHVoqc,554
91
- sonolus_py-0.10.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
92
- sonolus_py-0.10.9.dist-info/entry_points.txt,sha256=oTYspY_b7SA8TptEMTDxh4-Aj-ZVPnYC9f1lqH6s9G4,54
93
- sonolus_py-0.10.9.dist-info/licenses/LICENSE,sha256=JEKpqVhQYfEc7zg3Mj462sKbKYmO1K7WmvX1qvg9IJk,1067
94
- sonolus_py-0.10.9.dist-info/RECORD,,
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,,