@@ -285,8 +285,10 @@ private Color reconcileObjectProtos(ColorId id, Map<ShardView, TypeProto> viewTo
285285 checkState (proto .hasObject ());
286286 ObjectTypeProto objProto = proto .getObject ();
287287
288- for (Integer p : objProto .getInstanceTypeList ()) {
289- instanceColors .add (this .lookupOrReconcileColor (shard .getId (p )));
288+ var instanceTypeIds = objProto .getInstanceTypeList ();
289+ for (int i = 0 ; i < instanceTypeIds .size (); i ++) {
290+ Integer instanceTypePointer = instanceTypeIds .get (i );
291+ instanceColors .add (this .lookupOrReconcileColor (shard .getId (instanceTypePointer )));
290292 }
291293
292294 boolean isClosureAssertBool = objProto .getClosureAssert ();
@@ -299,8 +301,11 @@ private Color reconcileObjectProtos(ColorId id, Map<ShardView, TypeProto> viewTo
299301 isConstructor |= objProto .getMarkedConstructor ();
300302 isInvalidating |= objProto .getIsInvalidating ();
301303 propertiesKeepOriginalName |= objProto .getPropertiesKeepOriginalName ();
302- for (Integer p : objProto .getPrototypeList ()) {
303- prototypes .add (this .lookupOrReconcileColor (shard .getId (p )));
304+
305+ var prototypeIds = objProto .getPrototypeList ();
306+ for (int i = 0 ; i < prototypeIds .size (); i ++) {
307+ Integer prototypePointer = prototypeIds .get (i );
308+ prototypes .add (this .lookupOrReconcileColor (shard .getId (prototypePointer )));
304309 }
305310 for (int i = 0 ; i < objProto .getOwnPropertyCount (); i ++) {
306311 ownProperties .add (shard .stringPool .get (objProto .getOwnProperty (i )));
@@ -324,7 +329,9 @@ private Color reconcileUnionProtos(ColorId id, Map<ShardView, TypeProto> viewToP
324329 viewToProto .forEach (
325330 (shard , proto ) -> {
326331 checkState (proto .hasUnion (), proto );
327- for (Integer memberPointer : proto .getUnion ().getUnionMemberList ()) {
332+ var unionMemberList = proto .getUnion ().getUnionMemberList ();
333+ for (int i = 0 ; i < unionMemberList .size (); i ++) {
334+ Integer memberPointer = unionMemberList .get (i );
328335 ColorId memberId = shard .getId (memberPointer );
329336 Color member = this .lookupOrReconcileColor (memberId );
330337 checkWellFormed (!member .isUnion (), "Reconciling union with non-union" , proto );
@@ -356,22 +363,7 @@ private static ImmutableList<ColorId> createTrimmedOffsetToId(TypePool typePool)
356363 TypeProto proto = typePool .getType (i );
357364 switch (proto .getKindCase ()) {
358365 case OBJECT -> {}
359- case UNION -> {
360- {
361- checkWellFormed (
362- proto .getUnion ().getUnionMemberCount () > 1 , "Union has too few members" , proto );
363- LinkedHashSet <ColorId > members = new LinkedHashSet <>();
364- for (Integer memberPointer : proto .getUnion ().getUnionMemberList ()) {
365- ColorId memberId =
366- isAxiomatic (memberPointer )
367- ? OFFSET_TO_AXIOMATIC_COLOR .get (memberPointer ).getId ()
368- : ids [trimOffset (memberPointer )];
369- checkWellFormed (memberId != null , "Union member not found" , proto );
370- members .add (memberId );
371- }
372- ids [i ] = ColorId .union (members );
373- }
374- }
366+ case UNION -> ids [i ] = createUnionColorId (proto , ids );
375367 default -> throw new AssertionError (proto );
376368 }
377369 }
@@ -385,6 +377,22 @@ private static ImmutableList<ColorId> createTrimmedOffsetToId(TypePool typePool)
385377 return ImmutableList .copyOf (ids );
386378 }
387379
380+ private static ColorId createUnionColorId (TypeProto proto , ColorId [] allObjectIds ) {
381+ checkWellFormed (proto .getUnion ().getUnionMemberCount () > 1 , "Union has too few members" , proto );
382+ LinkedHashSet <ColorId > members = new LinkedHashSet <>();
383+ var unionMemberList = proto .getUnion ().getUnionMemberList ();
384+ for (int i = 0 ; i < unionMemberList .size (); i ++) {
385+ Integer memberPointer = unionMemberList .get (i );
386+ ColorId memberId =
387+ isAxiomatic (memberPointer )
388+ ? OFFSET_TO_AXIOMATIC_COLOR .get (memberPointer ).getId ()
389+ : allObjectIds [trimOffset (memberPointer )];
390+ checkWellFormed (memberId != null , "Union member not found" , proto );
391+ members .add (memberId );
392+ }
393+ return ColorId .union (members );
394+ }
395+
388396 private static int validatePointer (int offset , ShardView shard ) {
389397 checkWellFormed (
390398 0 <= offset && offset < untrimOffset (shard .trimmedOffsetToId .size ()),
0 commit comments