Skip to content

Commit 9b090bb

Browse files
committed
New: Switched to own property-aware encoders for compatibility, see #639
1 parent 3cb8262 commit 9b090bb

File tree

15 files changed

+1046
-1677
lines changed

15 files changed

+1046
-1677
lines changed

cli/pbjs.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ var targets = util.requireAll("./targets");
2020
* @returns {number|undefined} Exit code, if known
2121
*/
2222
exports.main = function(args, callback) {
23-
var lintDefault = "eslint-disable block-scoped-var, no-redeclare, no-control-regex";
23+
var lintDefault = "eslint-disable block-scoped-var, no-redeclare, no-control-regex, no-prototype-builtins";
2424
var argv = minimist(args, {
2525
alias: {
2626
target : "t",

cli/targets/static.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,10 +205,10 @@ function buildFunction(type, functionName, gen, scope) {
205205
var code = gen.str(functionName)
206206
.replace(/\(this.ctor\)/g, " $root" + type.fullName) // types: construct directly instead of using reflected ctor
207207
.replace(/(types\[\d+])(\.values)/g, "$1") // enums: use types[N] instead of reflected types[N].values
208-
.replace(/\b(?!\.)Writer\b/g, "$Writer") // use common aliases instead of binding through an iife
209-
.replace(/\b(?!\.)Reader\b/g, "$Reader")
210-
.replace(/\b(?!\.)util\.\b/g, "$util.")
211-
.replace(/\b(?!\.)types\[\b/g, "$types[");
208+
.replace(/\b(?!\.)Writer\b/g, "$Writer") // use common aliases instead of binding through an iife
209+
.replace(/\b(?!\.)Reader\b/g, "$Reader") // "
210+
.replace(/\b(?!\.)util\.\b/g, "$util.") // "
211+
.replace(/\b(?!\.)types\[\b/g, "$types["); // "
212212

213213
if (config.beautify)
214214
code = beautifyCode(code);

src/converter.js

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -230,37 +230,27 @@ converter.toObject = function toObject(mtype) {
230230
("d%s=%j", field._prop, field.typeDefault); // also messages (=null)
231231
}); gen
232232
("}");
233-
} gen
234-
("for(var ks=Object.keys(m),i=0;i<ks.length;++i){")
235-
("if(m[ks[i]]!==undefined&&m[ks[i]]!==null){")
236-
("switch(ks[i]){");
233+
}
237234
for (var i = 0; i < fields.length; ++i) {
238235
var field = fields[i],
239236
prop = field._prop; gen
240-
("case%j:", field.name);
237+
("if(m.hasOwnProperty(%j)&&m%s!==undefined&&m%s!==null){", field.name, prop, prop);
241238
if (field.map) { gen
242-
("if(m%s!==util.emptyObject){", prop, prop)
243-
("d%s={}", prop)
244-
("for(var ks2=Object.keys(m%s),j=0;j<ks2.length;++j){", prop);
245-
genValuePartial_toObject(gen, field, i, prop + "[ks2[j]]")
246-
("}")
247-
("}");
239+
("d%s={}", prop)
240+
("for(var ks2=Object.keys(m%s),j=0;j<ks2.length;++j){", prop);
241+
genValuePartial_toObject(gen, field, i, prop + "[ks2[j]]")
242+
("}");
248243
} else if (field.repeated) { gen
249-
("if(m%s.length){", prop)
250-
("d%s=[]", prop)
251-
("for(var j=0;j<m%s.length;++j){", prop);
244+
("d%s=[]", prop)
245+
("for(var j=0;j<m%s.length;++j){", prop);
252246
genValuePartial_toObject(gen, field, i, prop + "[j]")
253-
("}")
254-
("}");
247+
("}");
255248
} else
256-
genValuePartial_toObject(gen, field, i, prop);
249+
genValuePartial_toObject(gen, field, i, prop);
257250
gen
258-
("break");
251+
("}");
259252
}
260253
return gen
261-
("}")
262-
("}")
263-
("}")
264254
("return d");
265255
/* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */
266256
};

src/encoder.js

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,17 @@ function encoder(mtype) {
3535

3636
var i, ref;
3737
for (var i = 0; i < fields.length; ++i) {
38-
var field = fields[i].resolve(),
39-
type = field.resolvedType instanceof Enum ? "uint32" : field.type,
38+
var field = fields[i].resolve();
39+
if (field.partOf) // see below for oneofs
40+
continue;
41+
var type = field.resolvedType instanceof Enum ? "uint32" : field.type,
4042
wireType = types.basic[type];
4143
ref = "m" + field._prop;
4244

4345
// Map fields
4446
if (field.map) {
4547
var keyType = field.resolvedKeyType /* only valid is enum */ ? "uint32" : field.keyType; gen
46-
("if(%s&&%s!==util.emptyObject){", ref, ref)
48+
("if(m.hasOwnProperty(%j)&&%s){", field.name, ref)
4749
("for(var ks=Object.keys(%s),i=0;i<ks.length;++i){", ref)
4850
("w.uint32(%d).fork().uint32(%d).%s(ks[i])", (field.id << 3 | 2) >>> 0, 8 | types.mapKey[keyType], keyType);
4951
if (wireType === undefined) gen
@@ -60,7 +62,7 @@ function encoder(mtype) {
6062
// Packed repeated
6163
if (field.packed && types.packed[type] !== undefined) { gen
6264

63-
("if(%s&&%s.length){", ref, ref)
65+
("if(m.hasOwnProperty(%j)&&%s.length){", field.name, ref)
6466
("w.uint32(%d).fork()", (field.id << 3 | 2) >>> 0)
6567
("for(var i=0;i<%s.length;++i)", ref)
6668
("w.%s(%s[i])", type, ref)
@@ -70,7 +72,7 @@ function encoder(mtype) {
7072
// Non-packed
7173
} else { gen
7274

73-
("if(%s){", ref)
75+
("if(m.hasOwnProperty(%j)){", field.name)
7476
("for(var i=0;i<%s.length;++i)", ref);
7577
if (wireType === undefined)
7678
genTypePartial(gen, field, i, ref + "[i]");
@@ -82,18 +84,18 @@ function encoder(mtype) {
8284
}
8385

8486
// Non-repeated
85-
} else if (!field.partOf) { // see below for oneofs
87+
} else {
8688
if (!field.required) {
8789

8890
if (field.long) gen
89-
("if(%s!==undefined&&%s!==null&&util.longNe(%s,%d,%d))", ref, ref, ref, field.defaultValue.low, field.defaultValue.high);
91+
("if(m.hasOwnProperty(%j)&&%s!==undefined&&%s!==null)", field.name, ref, ref);
9092
else if (field.bytes) gen
91-
("if(%s&&%s.length" + (field.defaultValue.length ? "&&util.arrayNe(%s,%j)" : "") + ")", ref, ref, ref, Array.prototype.slice.call(field.defaultValue));
93+
("if(m.hasOwnProperty(%j)&&%s)", field.name, ref);
9294
else gen
93-
("if(%s!==undefined&&%s!==%j)", ref, ref, field.defaultValue);
95+
("if(m.hasOwnProperty(%j)&&%s!==undefined)", field.name, ref);
9496

9597
}
96-
98+
9799
if (wireType === undefined)
98100
genTypePartial(gen, field, i, ref);
99101
else gen

src/util/runtime.js

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -106,20 +106,6 @@ util.newBuffer = function newBuffer(sizeOrArray) {
106106
*/
107107
util.Array = typeof Uint8Array === "undefined" ? Array : Uint8Array;
108108

109-
/**
110-
* Tests if two arrays are not equal.
111-
* @param {Array.<*>} a Array 1
112-
* @param {Array.<*>} b Array 2
113-
* @returns {boolean} `true` if not equal, otherwise `false`
114-
*/
115-
util.arrayNe = function arrayNe(a, b) {
116-
if (a.length === b.length)
117-
for (var i = 0; i < a.length; ++i)
118-
if (a[i] !== b[i])
119-
return true;
120-
return false;
121-
};
122-
123109
util.LongBits = require("./longbits");
124110

125111
/**
@@ -152,20 +138,6 @@ util.longFromHash = function longFromHash(hash, unsigned) {
152138
return bits.toNumber(Boolean(unsigned));
153139
};
154140

155-
/**
156-
* Tests if a possibily long value equals the specified low and high bits.
157-
* @param {number|string|Long} val Value to test
158-
* @param {number} lo Low bits to test against
159-
* @param {number} hi High bits to test against
160-
* @returns {boolean} `true` if not equal
161-
*/
162-
util.longNe = function longNe(val, lo, hi) {
163-
if (typeof val === "object") // Long-like, null is invalid and throws
164-
return val.low !== lo || val.high !== hi;
165-
var bits = util.LongBits.from(val);
166-
return bits.lo !== lo || bits.hi !== hi;
167-
};
168-
169141
/**
170142
* Merges the properties of the source object into the destination object.
171143
* @param {Object.<string,*>} dst Destination object

tests/data/ambiguous-names.js

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*eslint-disable block-scoped-var, no-redeclare, no-control-regex*/
1+
/*eslint-disable block-scoped-var, no-redeclare, no-control-regex, no-prototype-builtins*/
22
"use strict";
33

44
var $protobuf = require("../../runtime");
@@ -54,7 +54,7 @@ $root.A = (function() {
5454
A.encode = function encode(message, writer) {
5555
if (!writer)
5656
writer = $Writer.create();
57-
if (message.whatever !== undefined && message.whatever !== "")
57+
if (message.hasOwnProperty("whatever") && message.whatever !== undefined)
5858
writer.uint32(/* id 1, wireType 2 =*/10).string(message.whatever);
5959
return writer;
6060
};
@@ -148,13 +148,8 @@ $root.A = (function() {
148148
var object = {};
149149
if (options.defaults)
150150
object.whatever = "";
151-
for (var keys = Object.keys(message), i = 0; i < keys.length; ++i)
152-
if (message[keys[i]] !== undefined && message[keys[i]] !== null)
153-
switch (keys[i]) {
154-
case "whatever":
155-
object.whatever = message.whatever;
156-
break;
157-
}
151+
if (message.hasOwnProperty("whatever") && message.whatever !== undefined && message.whatever !== null)
152+
object.whatever = message.whatever;
158153
return object;
159154
};
160155

@@ -223,7 +218,7 @@ $root.B = (function() {
223218
B.encode = function encode(message, writer) {
224219
if (!writer)
225220
writer = $Writer.create();
226-
if (message.A !== undefined && message.A !== null)
221+
if (message.hasOwnProperty("A") && message.A !== undefined)
227222
$types[0].encode(message.A, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();
228223
return writer;
229224
};
@@ -319,13 +314,8 @@ $root.B = (function() {
319314
var object = {};
320315
if (options.defaults)
321316
object.A = null;
322-
for (var keys = Object.keys(message), i = 0; i < keys.length; ++i)
323-
if (message[keys[i]] !== undefined && message[keys[i]] !== null)
324-
switch (keys[i]) {
325-
case "A":
326-
object.A = $types[0].toObject(message.A, options);
327-
break;
328-
}
317+
if (message.hasOwnProperty("A") && message.A !== undefined && message.A !== null)
318+
object.A = $types[0].toObject(message.A, options);
329319
return object;
330320
};
331321

tests/data/comments.js

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*eslint-disable block-scoped-var, no-redeclare, no-control-regex*/
1+
/*eslint-disable block-scoped-var, no-redeclare, no-control-regex, no-prototype-builtins*/
22
"use strict";
33

44
var $protobuf = require("../../runtime");
@@ -70,11 +70,11 @@ $root.Test1 = (function() {
7070
Test1.encode = function encode(message, writer) {
7171
if (!writer)
7272
writer = $Writer.create();
73-
if (message.field1 !== undefined && message.field1 !== "")
73+
if (message.hasOwnProperty("field1") && message.field1 !== undefined)
7474
writer.uint32(/* id 1, wireType 2 =*/10).string(message.field1);
75-
if (message.field2 !== undefined && message.field2 !== 0)
75+
if (message.hasOwnProperty("field2") && message.field2 !== undefined)
7676
writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.field2);
77-
if (message.field3 !== undefined && message.field3 !== false)
77+
if (message.hasOwnProperty("field3") && message.field3 !== undefined)
7878
writer.uint32(/* id 3, wireType 0 =*/24).bool(message.field3);
7979
return writer;
8080
};
@@ -187,19 +187,12 @@ $root.Test1 = (function() {
187187
object.field2 = 0;
188188
object.field3 = false;
189189
}
190-
for (var keys = Object.keys(message), i = 0; i < keys.length; ++i)
191-
if (message[keys[i]] !== undefined && message[keys[i]] !== null)
192-
switch (keys[i]) {
193-
case "field1":
194-
object.field1 = message.field1;
195-
break;
196-
case "field2":
197-
object.field2 = message.field2;
198-
break;
199-
case "field3":
200-
object.field3 = message.field3;
201-
break;
202-
}
190+
if (message.hasOwnProperty("field1") && message.field1 !== undefined && message.field1 !== null)
191+
object.field1 = message.field1;
192+
if (message.hasOwnProperty("field2") && message.field2 !== undefined && message.field2 !== null)
193+
object.field2 = message.field2;
194+
if (message.hasOwnProperty("field3") && message.field3 !== undefined && message.field3 !== null)
195+
object.field3 = message.field3;
203196
return object;
204197
};
205198

0 commit comments

Comments
 (0)