Preserve 'enforce UTF8' data in proto field types
Bug: 158623350
Change-Id: Id830bba5e72c923789629c5bc30445e6d2be47bb
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldType.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldType.java
index a9cff43..211589a 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldType.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldType.java
@@ -22,21 +22,25 @@
private static final int FIELD_ID_MASK = 0xFF;
private static final int FIELD_IS_REQUIRED_MASK = 0x100;
+ private static final int FIELD_ENFORCE_UTF8_MASK = 0x200;
private static final int FIELD_NEEDS_IS_INITIALIZED_CHECK_MASK = 0x400;
private static final int FIELD_IS_MAP_FIELD_WITH_PROTO_2_ENUM_VALUE_MASK = 0x800;
private final int id;
private final boolean isRequired;
+ private final boolean enforceUtf8Mask;
private final boolean needsIsInitializedCheck;
private final boolean isMapFieldWithProto2EnumValue;
ProtoFieldType(
int id,
boolean isRequired,
+ boolean enforceUtf8Mask,
boolean needsIsInitializedCheck,
boolean isMapFieldWithProto2EnumValue) {
this.id = id;
this.isRequired = isRequired;
+ this.enforceUtf8Mask = enforceUtf8Mask;
this.needsIsInitializedCheck = needsIsInitializedCheck;
this.isMapFieldWithProto2EnumValue = isMapFieldWithProto2EnumValue;
assert isValid();
@@ -48,12 +52,14 @@
return new ProtoFieldType(
fieldTypeWithExtraBits & FIELD_ID_MASK,
isBitInMaskSet(fieldTypeWithExtraBits, FIELD_IS_REQUIRED_MASK),
+ isBitInMaskSet(fieldTypeWithExtraBits, FIELD_ENFORCE_UTF8_MASK),
isBitInMaskSet(fieldTypeWithExtraBits, FIELD_NEEDS_IS_INITIALIZED_CHECK_MASK),
isBitInMaskSet(fieldTypeWithExtraBits, FIELD_IS_MAP_FIELD_WITH_PROTO_2_ENUM_VALUE_MASK));
} else {
return new ProtoOneOfFieldType(
fieldTypeWithExtraBits & FIELD_ID_MASK,
isBitInMaskSet(fieldTypeWithExtraBits, FIELD_IS_REQUIRED_MASK),
+ isBitInMaskSet(fieldTypeWithExtraBits, FIELD_ENFORCE_UTF8_MASK),
isBitInMaskSet(fieldTypeWithExtraBits, FIELD_NEEDS_IS_INITIALIZED_CHECK_MASK),
isBitInMaskSet(fieldTypeWithExtraBits, FIELD_IS_MAP_FIELD_WITH_PROTO_2_ENUM_VALUE_MASK));
}
@@ -141,6 +147,9 @@
if (isRequired) {
result |= FIELD_IS_REQUIRED_MASK;
}
+ if (enforceUtf8Mask) {
+ result |= FIELD_ENFORCE_UTF8_MASK;
+ }
if (needsIsInitializedCheck) {
result |= FIELD_NEEDS_IS_INITIALIZED_CHECK_MASK;
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldTypeFactory.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldTypeFactory.java
index 54000eb..c655ce8 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldTypeFactory.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldTypeFactory.java
@@ -15,6 +15,7 @@
ProtoFieldType result = fieldTypes.get(fieldTypeIdWithExtraBits);
if (result == null) {
result = ProtoFieldType.fromFieldIdWithExtraBits(fieldTypeIdWithExtraBits);
+ assert result.serialize() == fieldTypeIdWithExtraBits;
fieldTypes.put(fieldTypeIdWithExtraBits, result);
}
return result;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoOneOfFieldType.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoOneOfFieldType.java
index c476382..6ddef35 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoOneOfFieldType.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoOneOfFieldType.java
@@ -13,9 +13,10 @@
ProtoOneOfFieldType(
int id,
boolean isRequired,
+ boolean enforceUtf8Mask,
boolean needsIsInitializedCheck,
boolean isMapFieldWithProto2EnumValue) {
- super(id, isRequired, needsIsInitializedCheck, isMapFieldWithProto2EnumValue);
+ super(id, isRequired, enforceUtf8Mask, needsIsInitializedCheck, isMapFieldWithProto2EnumValue);
}
public ProtoFieldType getActualFieldType(ProtoFieldTypeFactory factory) {
diff --git a/src/test/java/com/android/tools/r8/internal/proto/ChromeProtoRewritingTest.java b/src/test/java/com/android/tools/r8/internal/proto/ChromeProtoRewritingTest.java
index f66df29..ddaf85f 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/ChromeProtoRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/ChromeProtoRewritingTest.java
@@ -8,7 +8,6 @@
import static com.android.tools.r8.internal.proto.ProtoShrinkingTestBase.keepAllProtosRule;
import static com.android.tools.r8.internal.proto.ProtoShrinkingTestBase.keepDynamicMethodSignatureRule;
import static com.android.tools.r8.internal.proto.ProtoShrinkingTestBase.keepNewMessageInfoSignatureRule;
-import static org.junit.Assert.fail;
import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.TestParameters;
@@ -52,12 +51,6 @@
}
private void inspect(CodeInspector inspector) throws Exception {
- try {
- assertRewrittenProtoSchemasMatch(new CodeInspector(getProgramFiles()), inspector);
- } catch (AssertionError e) {
- // TODO(b/158623350): Proto schemas should be identical.
- return;
- }
- fail("Unreachable");
+ assertRewrittenProtoSchemasMatch(new CodeInspector(getProgramFiles()), inspector);
}
}
diff --git a/src/test/java/com/android/tools/r8/internal/proto/YouTubeV1508ProtoRewritingTest.java b/src/test/java/com/android/tools/r8/internal/proto/YouTubeV1508ProtoRewritingTest.java
index 8744623..5596fc7 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/YouTubeV1508ProtoRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/YouTubeV1508ProtoRewritingTest.java
@@ -8,7 +8,6 @@
import static com.android.tools.r8.internal.proto.ProtoShrinkingTestBase.keepAllProtosRule;
import static com.android.tools.r8.internal.proto.ProtoShrinkingTestBase.keepDynamicMethodSignatureRule;
import static com.android.tools.r8.internal.proto.ProtoShrinkingTestBase.keepNewMessageInfoSignatureRule;
-import static org.junit.Assert.fail;
import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.TestParameters;
@@ -63,12 +62,6 @@
}
private void inspect(CodeInspector inspector) throws Exception {
- try {
- assertRewrittenProtoSchemasMatch(new CodeInspector(getProgramFiles()), inspector);
- } catch (AssertionError e) {
- // TODO(b/158623350): Proto schemas should be identical.
- return;
- }
- fail("Unreachable");
+ assertRewrittenProtoSchemasMatch(new CodeInspector(getProgramFiles()), inspector);
}
}