1*635a8641SAndroid Build Coastguard WorkerFrom 580fcef90ab970ad37ea9f7059373f773b3e55d2 Mon Sep 17 00:00:00 2001 2*635a8641SAndroid Build Coastguard WorkerFrom: Jakub Pawlowski <[email protected]> 3*635a8641SAndroid Build Coastguard WorkerDate: Fri, 03 Aug 2018 08:46:10 +0000 4*635a8641SAndroid Build Coastguard WorkerSubject: [PATCH] Fix data_types_definition.tmpl 5*635a8641SAndroid Build Coastguard Worker 6*635a8641SAndroid Build Coastguard WorkerThis template can generate code that does not compile, if there are 7*635a8641SAndroid Build Coastguard Workermultiple fields with different versions where at least one has version 0 8*635a8641SAndroid Build Coastguard Workerand end up being laid out in a way that does not match the ordinal order 9*635a8641SAndroid Build Coastguard Worker 10*635a8641SAndroid Build Coastguard WorkerSample Mojo file: 11*635a8641SAndroid Build Coastguard Worker// Describes ARC package. 12*635a8641SAndroid Build Coastguard Workerstruct ArcPackageInfo { 13*635a8641SAndroid Build Coastguard Worker string package_name; 14*635a8641SAndroid Build Coastguard Worker int32 package_version; 15*635a8641SAndroid Build Coastguard Worker int64 last_backup_android_id; 16*635a8641SAndroid Build Coastguard Worker int64 last_backup_time; 17*635a8641SAndroid Build Coastguard Worker bool sync; // true if package installation should be synced 18*635a8641SAndroid Build Coastguard Worker [MinVersion=11] bool system; // true if package is system package. 19*635a8641SAndroid Build Coastguard Worker // true if package registers VPNService intent. 20*635a8641SAndroid Build Coastguard Worker [MinVersion=25] bool vpn_provider; 21*635a8641SAndroid Build Coastguard Worker}; 22*635a8641SAndroid Build Coastguard Worker 23*635a8641SAndroid Build Coastguard WorkerSample badly generated code (no closing "}" for last if): 24*635a8641SAndroid Build Coastguard Worker 25*635a8641SAndroid Build Coastguard Worker @SuppressWarnings("unchecked") 26*635a8641SAndroid Build Coastguard Worker public static ArcPackageInfo decode(org.chromium.mojo.bindings.Decoder decoder0) { 27*635a8641SAndroid Build Coastguard Worker if (decoder0 == null) { 28*635a8641SAndroid Build Coastguard Worker return null; 29*635a8641SAndroid Build Coastguard Worker } 30*635a8641SAndroid Build Coastguard Worker decoder0.increaseStackDepth(); 31*635a8641SAndroid Build Coastguard Worker ArcPackageInfo result; 32*635a8641SAndroid Build Coastguard Worker try { 33*635a8641SAndroid Build Coastguard Worker org.chromium.mojo.bindings.DataHeader mainDataHeader = decoder0.readAndValidateDataHeader(VERSION_ARRAY); 34*635a8641SAndroid Build Coastguard Worker final int elementsOrVersion = mainDataHeader.elementsOrVersion; 35*635a8641SAndroid Build Coastguard Worker result = new ArcPackageInfo(elementsOrVersion); 36*635a8641SAndroid Build Coastguard Worker { 37*635a8641SAndroid Build Coastguard Worker 38*635a8641SAndroid Build Coastguard Worker result.packageName = decoder0.readString(8, false); 39*635a8641SAndroid Build Coastguard Worker } 40*635a8641SAndroid Build Coastguard Worker { 41*635a8641SAndroid Build Coastguard Worker 42*635a8641SAndroid Build Coastguard Worker result.packageVersion = decoder0.readInt(16); 43*635a8641SAndroid Build Coastguard Worker } 44*635a8641SAndroid Build Coastguard Worker { 45*635a8641SAndroid Build Coastguard Worker 46*635a8641SAndroid Build Coastguard Worker result.sync = decoder0.readBoolean(20, 0); 47*635a8641SAndroid Build Coastguard Worker } 48*635a8641SAndroid Build Coastguard Worker if (elementsOrVersion >= 11) { 49*635a8641SAndroid Build Coastguard Worker { 50*635a8641SAndroid Build Coastguard Worker 51*635a8641SAndroid Build Coastguard Worker result.system = decoder0.readBoolean(20, 1); 52*635a8641SAndroid Build Coastguard Worker } 53*635a8641SAndroid Build Coastguard Worker } 54*635a8641SAndroid Build Coastguard Worker if (elementsOrVersion >= 25) { 55*635a8641SAndroid Build Coastguard Worker { 56*635a8641SAndroid Build Coastguard Worker 57*635a8641SAndroid Build Coastguard Worker result.vpnProvider = decoder0.readBoolean(20, 2); 58*635a8641SAndroid Build Coastguard Worker } 59*635a8641SAndroid Build Coastguard Worker } 60*635a8641SAndroid Build Coastguard Worker if (elementsOrVersion >= 0) { 61*635a8641SAndroid Build Coastguard Worker { 62*635a8641SAndroid Build Coastguard Worker 63*635a8641SAndroid Build Coastguard Worker result.lastBackupAndroidId = decoder0.readLong(24); 64*635a8641SAndroid Build Coastguard Worker } 65*635a8641SAndroid Build Coastguard Worker { 66*635a8641SAndroid Build Coastguard Worker 67*635a8641SAndroid Build Coastguard Worker result.lastBackupTime = decoder0.readLong(32); 68*635a8641SAndroid Build Coastguard Worker } 69*635a8641SAndroid Build Coastguard Worker } finally { 70*635a8641SAndroid Build Coastguard Worker decoder0.decreaseStackDepth(); 71*635a8641SAndroid Build Coastguard Worker } 72*635a8641SAndroid Build Coastguard Worker return result; 73*635a8641SAndroid Build Coastguard Worker } 74*635a8641SAndroid Build Coastguard Worker 75*635a8641SAndroid Build Coastguard WorkerChange-Id: I4c1b573a71b20cc6a0828a2cceff6bbfbb4ac5bc 76*635a8641SAndroid Build Coastguard WorkerReviewed-on: https://chromium-review.googlesource.com/1158702 77*635a8641SAndroid Build Coastguard WorkerReviewed-by: Luis Hector Chavez <[email protected]> 78*635a8641SAndroid Build Coastguard WorkerReviewed-by: Ken Rockot <[email protected]> 79*635a8641SAndroid Build Coastguard WorkerCommit-Queue: Jakub x Jakub Pawlowski <[email protected]> 80*635a8641SAndroid Build Coastguard WorkerCr-Commit-Position: refs/heads/master@{#580480} 81*635a8641SAndroid Build Coastguard Worker--- 82*635a8641SAndroid Build Coastguard Worker 83*635a8641SAndroid Build Coastguard Workerdiff --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 84*635a8641SAndroid Build Coastguard Workerindex 59c6fee..7af57bd 100644 85*635a8641SAndroid Build Coastguard Worker--- a/mojo/public/tools/bindings/generators/java_templates/data_types_definition.tmpl 86*635a8641SAndroid Build Coastguard Worker+++ b/mojo/public/tools/bindings/generators/java_templates/data_types_definition.tmpl 87*635a8641SAndroid Build Coastguard Worker@@ -175,6 +175,7 @@ 88*635a8641SAndroid Build Coastguard Worker org.chromium.mojo.bindings.DataHeader mainDataHeader = decoder0.readAndValidateDataHeader(VERSION_ARRAY); 89*635a8641SAndroid Build Coastguard Worker final int elementsOrVersion = mainDataHeader.elementsOrVersion; 90*635a8641SAndroid Build Coastguard Worker result = new {{struct|name}}(elementsOrVersion); 91*635a8641SAndroid Build Coastguard Worker+ 92*635a8641SAndroid Build Coastguard Worker {%- set prev_ver = [0] %} 93*635a8641SAndroid Build Coastguard Worker {%- for byte in struct.bytes %} 94*635a8641SAndroid Build Coastguard Worker {%- for packed_field in byte.packed_fields %} 95*635a8641SAndroid Build Coastguard Worker@@ -183,7 +184,9 @@ 96*635a8641SAndroid Build Coastguard Worker } 97*635a8641SAndroid Build Coastguard Worker {%- endif %} 98*635a8641SAndroid Build Coastguard Worker {%- set _ = prev_ver.append(packed_field.min_version) %} 99*635a8641SAndroid Build Coastguard Worker+{%- if prev_ver[-1] != 0 %} 100*635a8641SAndroid Build Coastguard Worker if (elementsOrVersion >= {{packed_field.min_version}}) { 101*635a8641SAndroid Build Coastguard Worker+{%- endif %} 102*635a8641SAndroid Build Coastguard Worker {%- endif %} 103*635a8641SAndroid Build Coastguard Worker { 104*635a8641SAndroid Build Coastguard Worker {{decode('result.' ~ packed_field.field|name, packed_field.field.kind, 8+packed_field.offset, packed_field.bit)|indent(16)}} 105*635a8641SAndroid Build Coastguard Worker@@ -193,6 +196,7 @@ 106*635a8641SAndroid Build Coastguard Worker {%- if prev_ver[-1] != 0 %} 107*635a8641SAndroid Build Coastguard Worker } 108*635a8641SAndroid Build Coastguard Worker {%- endif %} 109*635a8641SAndroid Build Coastguard Worker+ 110*635a8641SAndroid Build Coastguard Worker } finally { 111*635a8641SAndroid Build Coastguard Worker decoder0.decreaseStackDepth(); 112*635a8641SAndroid Build Coastguard Worker } 113