@@ -220,6 +220,7 @@ _Py_uop_sym_set_type_version(JitOptContext *ctx, JitOptSymbol *sym, unsigned int
220220 }
221221 case JIT_SYM_KNOWN_VALUE_TAG :
222222 if (Py_TYPE (sym -> value .value )-> tp_version_tag != version ) {
223+ Py_CLEAR (sym -> value .value );
223224 sym_set_bottom (ctx , sym );
224225 return false;
225226 };
@@ -275,18 +276,16 @@ _Py_uop_sym_set_const(JitOptContext *ctx, JitOptSymbol *sym, PyObject *const_val
275276 }
276277 return ;
277278 case JIT_SYM_TUPLE_TAG :
278- // TODO: We should do something smarter here. It's not as simple
279- // as sym_set_const, though, since we need to sym_set_bottom if
280- // the length doesn't match, or one of the symbolic types within
281- // the tuple contradicts its constant counterpart:
282279 if (PyTuple_CheckExact (const_val )) {
283- Py_ssize_t len = PyTuple_GET_SIZE ( const_val );
284- if (len == sym -> tuple . length ) {
280+ Py_ssize_t len = _Py_uop_sym_tuple_length ( sym );
281+ if (len == PyTuple_GET_SIZE ( const_val ) ) {
285282 for (Py_ssize_t i = 0 ; i < len ; i ++ ) {
286- JitOptSymbol * item = allocation_base (ctx ) + sym -> tuple . items [ i ] ;
287- PyObject * item_const = PyTuple_GET_ITEM (const_val , i );
288- _Py_uop_sym_set_const (ctx , item , item_const );
283+ JitOptSymbol * sym_item = _Py_uop_sym_tuple_getitem (ctx , sym , i ) ;
284+ PyObject * item = PyTuple_GET_ITEM (const_val , i );
285+ _Py_uop_sym_set_const (ctx , sym_item , item );
289286 }
287+ _Py_uop_sym_set_const (ctx , sym , const_val );
288+ return ;
290289 }
291290 }
292291 sym_set_bottom (ctx , sym );
0 commit comments