Skip to content

Commit 8d99815

Browse files
committed
CLI: Check upfront if key-var is required in static decoders with maps, see protobufjs#726
1 parent 16adff0 commit 8d99815

File tree

7 files changed

+108
-105
lines changed

7 files changed

+108
-105
lines changed

cli/pbts.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,8 @@ exports.main = function(args, callback) {
118118
out = out.join("").replace(/\s*JSDoc \d+\.\d+\.\d+ [^$]+/, "");
119119
process.stderr.write(out);
120120
var err = Error("code " + code);
121-
if (callback) {
122-
callback(err);
123-
return;
124-
}
121+
if (callback)
122+
return callback(err);
125123
throw err;
126124
}
127125

src/decoder.js

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ function decoder(mtype) {
1919
var gen = util.codegen("r", "l")
2020
("if(!(r instanceof Reader))")
2121
("r=Reader.create(r)")
22-
("var c=l===undefined?r.len:r.pos+l,m=new this.ctor")
22+
("var c=l===undefined?r.len:r.pos+l,m=new this.ctor" + (mtype.fieldsArray.filter(function(field) { return field.map; }).length ? ",k" : ""))
2323
("while(r.pos<c){")
2424
("var t=r.uint32()");
2525
if (mtype.group) gen
@@ -37,16 +37,22 @@ function decoder(mtype) {
3737

3838
// Map fields
3939
if (field.map) { gen
40-
4140
("r.skip().pos++") // assumes id 1 + key wireType
4241
("if(%s===util.emptyObject)", ref)
4342
("%s={}", ref)
44-
("var k=r.%s()", field.keyType)
43+
("k=r.%s()", field.keyType)
4544
("r.pos++"); // assumes id 2 + value wireType
46-
if (types.basic[type] === undefined) gen
45+
if (field.long) {
46+
if (types.basic[type] === undefined) gen
4747
("%s[typeof k===\"object\"?util.longToHash(k):k]=types[%d].decode(r,r.uint32())", ref, i); // can't be groups
48-
else gen
48+
else gen
4949
("%s[typeof k===\"object\"?util.longToHash(k):k]=r.%s()", ref, type);
50+
} else {
51+
if (types.basic[type] === undefined) gen
52+
("%s[k]=types[%d].decode(r,r.uint32())", ref, i); // can't be groups
53+
else gen
54+
("%s[k]=r.%s()", ref, type);
55+
}
5056

5157
// Repeated fields
5258
} else if (field.repeated) { gen
@@ -77,7 +83,6 @@ function decoder(mtype) {
7783
("%s=r.%s()", ref, type);
7884
gen
7985
("break");
80-
8186
// Unknown fields
8287
} gen
8388
("default:")

src/encoder.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ function encoder(mtype) {
5959

6060
// Repeated fields
6161
} else if (field.repeated) { gen
62-
("if(%s&&%s.length&&m.hasOwnProperty(%j)){", ref, ref, field.name);
62+
("if(%s&&%s.length){", ref, ref);
6363

6464
// Packed repeated
6565
if (field.packed && types.packed[type] !== undefined) { gen

tests/data/convert.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,25 +109,25 @@ $root.Message = (function() {
109109
writer = $Writer.create();
110110
if (message.stringVal != null && message.hasOwnProperty("stringVal"))
111111
writer.uint32(/* id 1, wireType 2 =*/10).string(message.stringVal);
112-
if (message.stringRepeated && message.stringRepeated.length && message.hasOwnProperty("stringRepeated"))
112+
if (message.stringRepeated && message.stringRepeated.length)
113113
for (var i = 0; i < message.stringRepeated.length; ++i)
114114
writer.uint32(/* id 2, wireType 2 =*/18).string(message.stringRepeated[i]);
115115
if (message.uint64Val != null && message.hasOwnProperty("uint64Val"))
116116
writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.uint64Val);
117-
if (message.uint64Repeated && message.uint64Repeated.length && message.hasOwnProperty("uint64Repeated")) {
117+
if (message.uint64Repeated && message.uint64Repeated.length) {
118118
writer.uint32(/* id 4, wireType 2 =*/34).fork();
119119
for (var i = 0; i < message.uint64Repeated.length; ++i)
120120
writer.uint64(message.uint64Repeated[i]);
121121
writer.ldelim();
122122
}
123123
if (message.bytesVal && message.hasOwnProperty("bytesVal"))
124124
writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.bytesVal);
125-
if (message.bytesRepeated && message.bytesRepeated.length && message.hasOwnProperty("bytesRepeated"))
125+
if (message.bytesRepeated && message.bytesRepeated.length)
126126
for (var i = 0; i < message.bytesRepeated.length; ++i)
127127
writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.bytesRepeated[i]);
128128
if (message.enumVal != null && message.hasOwnProperty("enumVal"))
129129
writer.uint32(/* id 7, wireType 0 =*/56).uint32(message.enumVal);
130-
if (message.enumRepeated && message.enumRepeated.length && message.hasOwnProperty("enumRepeated")) {
130+
if (message.enumRepeated && message.enumRepeated.length) {
131131
writer.uint32(/* id 8, wireType 2 =*/66).fork();
132132
for (var i = 0; i < message.enumRepeated.length; ++i)
133133
writer.uint32(message.enumRepeated[i]);
@@ -160,7 +160,7 @@ $root.Message = (function() {
160160
Message.decode = function decode(reader, length) {
161161
if (!(reader instanceof $Reader))
162162
reader = $Reader.create(reader);
163-
var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Message();
163+
var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Message(), key;
164164
while (reader.pos < end) {
165165
var tag = reader.uint32();
166166
switch (tag >>> 3) {
@@ -210,7 +210,7 @@ $root.Message = (function() {
210210
reader.skip().pos++;
211211
if (message.int64Map === $util.emptyObject)
212212
message.int64Map = {};
213-
var key = reader.string();
213+
key = reader.string();
214214
reader.pos++;
215215
message.int64Map[typeof key === "object" ? $util.longToHash(key) : key] = reader.int64();
216216
break;

tests/data/mapbox/vector_tile.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ $root.vector_tile = (function() {
6464
Tile.encode = function encode(message, writer) {
6565
if (!writer)
6666
writer = $Writer.create();
67-
if (message.layers && message.layers.length && message.hasOwnProperty("layers"))
67+
if (message.layers && message.layers.length)
6868
for (var i = 0; i < message.layers.length; ++i)
6969
$root.vector_tile.Tile.Layer.encode(message.layers[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();
7070
return writer;
@@ -625,15 +625,15 @@ $root.vector_tile = (function() {
625625
writer = $Writer.create();
626626
if (message.id != null && message.hasOwnProperty("id"))
627627
writer.uint32(/* id 1, wireType 0 =*/8).uint64(message.id);
628-
if (message.tags && message.tags.length && message.hasOwnProperty("tags")) {
628+
if (message.tags && message.tags.length) {
629629
writer.uint32(/* id 2, wireType 2 =*/18).fork();
630630
for (var i = 0; i < message.tags.length; ++i)
631631
writer.uint32(message.tags[i]);
632632
writer.ldelim();
633633
}
634634
if (message.type != null && message.hasOwnProperty("type"))
635635
writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.type);
636-
if (message.geometry && message.geometry.length && message.hasOwnProperty("geometry")) {
636+
if (message.geometry && message.geometry.length) {
637637
writer.uint32(/* id 4, wireType 2 =*/34).fork();
638638
for (var i = 0; i < message.geometry.length; ++i)
639639
writer.uint32(message.geometry[i]);
@@ -955,13 +955,13 @@ $root.vector_tile = (function() {
955955
if (!writer)
956956
writer = $Writer.create();
957957
writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);
958-
if (message.features && message.features.length && message.hasOwnProperty("features"))
958+
if (message.features && message.features.length)
959959
for (var i = 0; i < message.features.length; ++i)
960960
$root.vector_tile.Tile.Feature.encode(message.features[i], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();
961-
if (message.keys && message.keys.length && message.hasOwnProperty("keys"))
961+
if (message.keys && message.keys.length)
962962
for (var i = 0; i < message.keys.length; ++i)
963963
writer.uint32(/* id 3, wireType 2 =*/26).string(message.keys[i]);
964-
if (message.values && message.values.length && message.hasOwnProperty("values"))
964+
if (message.values && message.values.length)
965965
for (var i = 0; i < message.values.length; ++i)
966966
$root.vector_tile.Tile.Value.encode(message.values[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();
967967
if (message.extent != null && message.hasOwnProperty("extent"))

tests/data/package.js

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ $root.Package = (function() {
179179
writer.uint32(/* id 7, wireType 2 =*/58).string(message.bugs);
180180
if (message.homepage != null && message.hasOwnProperty("homepage"))
181181
writer.uint32(/* id 8, wireType 2 =*/66).string(message.homepage);
182-
if (message.keywords && message.keywords.length && message.hasOwnProperty("keywords"))
182+
if (message.keywords && message.keywords.length)
183183
for (var i = 0; i < message.keywords.length; ++i)
184184
writer.uint32(/* id 9, wireType 2 =*/74).string(message.keywords[i]);
185185
if (message.main != null && message.hasOwnProperty("main"))
@@ -201,7 +201,7 @@ $root.Package = (function() {
201201
writer.uint32(/* id 15, wireType 2 =*/122).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.devDependencies[keys[i]]).ldelim();
202202
if (message.types != null && message.hasOwnProperty("types"))
203203
writer.uint32(/* id 17, wireType 2 =*/138).string(message.types);
204-
if (message.cliDependencies && message.cliDependencies.length && message.hasOwnProperty("cliDependencies"))
204+
if (message.cliDependencies && message.cliDependencies.length)
205205
for (var i = 0; i < message.cliDependencies.length; ++i)
206206
writer.uint32(/* id 18, wireType 2 =*/146).string(message.cliDependencies[i]);
207207
if (message.versionScheme != null && message.hasOwnProperty("versionScheme"))
@@ -230,7 +230,7 @@ $root.Package = (function() {
230230
Package.decode = function decode(reader, length) {
231231
if (!(reader instanceof $Reader))
232232
reader = $Reader.create(reader);
233-
var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Package();
233+
var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Package(), key;
234234
while (reader.pos < end) {
235235
var tag = reader.uint32();
236236
switch (tag >>> 3) {
@@ -273,41 +273,41 @@ $root.Package = (function() {
273273
reader.skip().pos++;
274274
if (message.bin === $util.emptyObject)
275275
message.bin = {};
276-
var key = reader.string();
276+
key = reader.string();
277277
reader.pos++;
278-
message.bin[typeof key === "object" ? $util.longToHash(key) : key] = reader.string();
278+
message.bin[k] = reader.string();
279279
break;
280280
case 12:
281281
reader.skip().pos++;
282282
if (message.scripts === $util.emptyObject)
283283
message.scripts = {};
284-
var key = reader.string();
284+
key = reader.string();
285285
reader.pos++;
286-
message.scripts[typeof key === "object" ? $util.longToHash(key) : key] = reader.string();
286+
message.scripts[k] = reader.string();
287287
break;
288288
case 13:
289289
reader.skip().pos++;
290290
if (message.dependencies === $util.emptyObject)
291291
message.dependencies = {};
292-
var key = reader.string();
292+
key = reader.string();
293293
reader.pos++;
294-
message.dependencies[typeof key === "object" ? $util.longToHash(key) : key] = reader.string();
294+
message.dependencies[k] = reader.string();
295295
break;
296296
case 14:
297297
reader.skip().pos++;
298298
if (message.optionalDependencies === $util.emptyObject)
299299
message.optionalDependencies = {};
300-
var key = reader.string();
300+
key = reader.string();
301301
reader.pos++;
302-
message.optionalDependencies[typeof key === "object" ? $util.longToHash(key) : key] = reader.string();
302+
message.optionalDependencies[k] = reader.string();
303303
break;
304304
case 15:
305305
reader.skip().pos++;
306306
if (message.devDependencies === $util.emptyObject)
307307
message.devDependencies = {};
308-
var key = reader.string();
308+
key = reader.string();
309309
reader.pos++;
310-
message.devDependencies[typeof key === "object" ? $util.longToHash(key) : key] = reader.string();
310+
message.devDependencies[k] = reader.string();
311311
break;
312312
case 17:
313313
message.types = reader.string();

0 commit comments

Comments
 (0)