@@ -112,9 +112,14 @@ def kernel_fallback_tuple_assign(x, y):
112112 return lhs + rhs
113113
114114
115- def test_dsl_kernel_reduced_expr ():
115+ @blosc2 .dsl_kernel
116+ def kernel_index_ramp (x ):
117+ return _i0 * _n1 + _i1 # noqa: F821 # DSL index/shape symbols resolved by miniexpr
118+
119+
120+ def test_dsl_kernel_loop_kept_as_full_dsl_function ():
116121 assert kernel_loop .dsl_source is not None
117- assert "def " not in kernel_loop .dsl_source
122+ assert "def kernel_loop(x, y):" in kernel_loop .dsl_source
118123 assert kernel_loop .input_names == ["x" , "y" ]
119124
120125 a , b , a2 , b2 = _make_arrays ()
@@ -125,9 +130,9 @@ def test_dsl_kernel_reduced_expr():
125130 np .testing .assert_allclose (res [...], expected , rtol = 1e-5 , atol = 1e-6 )
126131
127132
128- def test_dsl_kernel_integer_ops_reduced_expr ():
133+ def test_dsl_kernel_integer_ops_kept_as_full_dsl_function ():
129134 assert kernel_integer_ops .dsl_source is not None
130- assert "def " not in kernel_integer_ops .dsl_source
135+ assert "def kernel_integer_ops(x, y):" in kernel_integer_ops .dsl_source
131136 assert kernel_integer_ops .input_names == ["x" , "y" ]
132137
133138 a , b , a2 , b2 = _make_int_arrays ()
@@ -144,6 +149,36 @@ def test_dsl_kernel_integer_ops_reduced_expr():
144149 np .testing .assert_equal (res [...], expected )
145150
146151
152+ def test_dsl_kernel_index_symbols_keep_full_kernel (monkeypatch ):
153+ if blosc2 .IS_WASM :
154+ pytest .skip ("miniexpr fast path is not available on WASM" )
155+
156+ assert kernel_index_ramp .dsl_source is not None
157+ assert "def kernel_index_ramp(x):" in kernel_index_ramp .dsl_source
158+
159+ original_set_pref_expr = blosc2 .NDArray ._set_pref_expr
160+ captured = {"calls" : 0 , "expr" : None }
161+
162+ def wrapped_set_pref_expr (self , expression , inputs , fp_accuracy , aux_reduc = None , jit = None ):
163+ captured ["calls" ] += 1
164+ captured ["expr" ] = expression .decode ("utf-8" ) if isinstance (expression , bytes ) else expression
165+ return original_set_pref_expr (self , expression , inputs , fp_accuracy , aux_reduc , jit = jit )
166+
167+ monkeypatch .setattr (blosc2 .NDArray , "_set_pref_expr" , wrapped_set_pref_expr )
168+
169+ shape = (10 , 10 )
170+ x2 = blosc2 .zeros (shape , dtype = np .float32 )
171+ expr = blosc2 .lazyudf (kernel_index_ramp , (x2 ,), dtype = np .float32 )
172+ res = expr [:]
173+
174+ assert captured ["calls" ] >= 1
175+ assert "def kernel_index_ramp(x):" in captured ["expr" ]
176+ assert "_i0" in captured ["expr" ]
177+ assert "_n1" in captured ["expr" ]
178+ assert "_i1" in captured ["expr" ]
179+ assert res .shape == shape
180+
181+
147182def test_dsl_kernel_full_control_flow_kept_as_dsl_function ():
148183 assert kernel_control_flow_full .dsl_source is not None
149184 assert "def kernel_control_flow_full(x, y):" in kernel_control_flow_full .dsl_source
0 commit comments