You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
4.0 KiB
113 lines
4.0 KiB
From 580fcef90ab970ad37ea9f7059373f773b3e55d2 Mon Sep 17 00:00:00 2001
|
|
From: Jakub Pawlowski <jpawlowski@google.com>
|
|
Date: Fri, 03 Aug 2018 08:46:10 +0000
|
|
Subject: [PATCH] Fix data_types_definition.tmpl
|
|
|
|
This template can generate code that does not compile, if there are
|
|
multiple fields with different versions where at least one has version 0
|
|
and end up being laid out in a way that does not match the ordinal order
|
|
|
|
Sample Mojo file:
|
|
// Describes ARC package.
|
|
struct ArcPackageInfo {
|
|
string package_name;
|
|
int32 package_version;
|
|
int64 last_backup_android_id;
|
|
int64 last_backup_time;
|
|
bool sync; // true if package installation should be synced
|
|
[MinVersion=11] bool system; // true if package is system package.
|
|
// true if package registers VPNService intent.
|
|
[MinVersion=25] bool vpn_provider;
|
|
};
|
|
|
|
Sample badly generated code (no closing "}" for last if):
|
|
|
|
@SuppressWarnings("unchecked")
|
|
public static ArcPackageInfo decode(org.chromium.mojo.bindings.Decoder decoder0) {
|
|
if (decoder0 == null) {
|
|
return null;
|
|
}
|
|
decoder0.increaseStackDepth();
|
|
ArcPackageInfo result;
|
|
try {
|
|
org.chromium.mojo.bindings.DataHeader mainDataHeader = decoder0.readAndValidateDataHeader(VERSION_ARRAY);
|
|
final int elementsOrVersion = mainDataHeader.elementsOrVersion;
|
|
result = new ArcPackageInfo(elementsOrVersion);
|
|
{
|
|
|
|
result.packageName = decoder0.readString(8, false);
|
|
}
|
|
{
|
|
|
|
result.packageVersion = decoder0.readInt(16);
|
|
}
|
|
{
|
|
|
|
result.sync = decoder0.readBoolean(20, 0);
|
|
}
|
|
if (elementsOrVersion >= 11) {
|
|
{
|
|
|
|
result.system = decoder0.readBoolean(20, 1);
|
|
}
|
|
}
|
|
if (elementsOrVersion >= 25) {
|
|
{
|
|
|
|
result.vpnProvider = decoder0.readBoolean(20, 2);
|
|
}
|
|
}
|
|
if (elementsOrVersion >= 0) {
|
|
{
|
|
|
|
result.lastBackupAndroidId = decoder0.readLong(24);
|
|
}
|
|
{
|
|
|
|
result.lastBackupTime = decoder0.readLong(32);
|
|
}
|
|
} finally {
|
|
decoder0.decreaseStackDepth();
|
|
}
|
|
return result;
|
|
}
|
|
|
|
Change-Id: I4c1b573a71b20cc6a0828a2cceff6bbfbb4ac5bc
|
|
Reviewed-on: https://chromium-review.googlesource.com/1158702
|
|
Reviewed-by: Luis Hector Chavez <lhchavez@chromium.org>
|
|
Reviewed-by: Ken Rockot <rockot@chromium.org>
|
|
Commit-Queue: Jakub x Jakub Pawlowski <jpawlowski@google.com>
|
|
Cr-Commit-Position: refs/heads/master@{#580480}
|
|
---
|
|
|
|
diff --git a/mojo/public/tools/bindings/generators/java_templates/data_types_definition.tmpl b/mojo/public/tools/bindings/generators/java_templates/data_types_definition.tmpl
|
|
index 59c6fee..7af57bd 100644
|
|
--- a/mojo/public/tools/bindings/generators/java_templates/data_types_definition.tmpl
|
|
+++ b/mojo/public/tools/bindings/generators/java_templates/data_types_definition.tmpl
|
|
@@ -175,6 +175,7 @@
|
|
org.chromium.mojo.bindings.DataHeader mainDataHeader = decoder0.readAndValidateDataHeader(VERSION_ARRAY);
|
|
final int elementsOrVersion = mainDataHeader.elementsOrVersion;
|
|
result = new {{struct|name}}(elementsOrVersion);
|
|
+
|
|
{%- set prev_ver = [0] %}
|
|
{%- for byte in struct.bytes %}
|
|
{%- for packed_field in byte.packed_fields %}
|
|
@@ -183,7 +184,9 @@
|
|
}
|
|
{%- endif %}
|
|
{%- set _ = prev_ver.append(packed_field.min_version) %}
|
|
+{%- if prev_ver[-1] != 0 %}
|
|
if (elementsOrVersion >= {{packed_field.min_version}}) {
|
|
+{%- endif %}
|
|
{%- endif %}
|
|
{
|
|
{{decode('result.' ~ packed_field.field|name, packed_field.field.kind, 8+packed_field.offset, packed_field.bit)|indent(16)}}
|
|
@@ -193,6 +196,7 @@
|
|
{%- if prev_ver[-1] != 0 %}
|
|
}
|
|
{%- endif %}
|
|
+
|
|
} finally {
|
|
decoder0.decreaseStackDepth();
|
|
}
|