@@ -92,19 +92,21 @@ def add(name: str) -> None:
9292 slot_index [kind ] = len (records )
9393 records .append (source )
9494 elif records [existing ] != source :
95- raise ValueError (
96- f"Family { family .name } has incompatible recorders for "
97- f"slot { kind } : { records [existing ]} and { source } "
98- )
95+ if raw not in record_slot_keys :
96+ raise ValueError (
97+ f"Family { family .name } has incompatible recorders for "
98+ f"slot { kind } : { records [existing ]} and { source } , "
99+ f"and no raw recorder { raw } exists to use as a base."
100+ )
101+ records [existing ] = raw
99102
100103 for member in family .members :
101104 for name in instruction_records [member .name ]:
102105 add (name )
103- # Family head supplies any slots no member exercises.
106+ # Family head supplies any slots no member exercises, and may also
107+ # conflict with members (resolved via the raw recorder above).
104108 for name in instruction_records [family .name ]:
105- if record_slot_keys [name ] not in slot_index :
106- slot_index [record_slot_keys [name ]] = len (records )
107- records .append (name )
109+ add (name )
108110 return records
109111
110112
@@ -285,13 +287,13 @@ def generate_record_transform_dispatcher(
285287 "_PyOpcode_RecordTransformValue(int uop, PyObject *value)\n "
286288 "{\n "
287289 )
288- out .emit (" switch (uop) {\n " )
290+ out .emit ("switch (uop) {\n " )
289291 for name in transform_names :
290- out .emit (f" case { name } :\n " )
291- out .emit (f" return _PyOpcode_RecordTransform{ name [7 :]} (value);\n " )
292- out .emit (" default:\n " )
293- out .emit (" return value;\n " )
294- out .emit (" }\n " )
292+ out .emit (f"case { name } :\n " )
293+ out .emit (f" return _PyOpcode_RecordTransform{ name [7 :]} (value);\n " )
294+ out .emit ("default:\n " )
295+ out .emit (" return value;\n " )
296+ out .emit ("}\n " )
295297 out .emit ("}\n " )
296298
297299
0 commit comments