Skip to content

Commit 3d23eed

Browse files
committed
New: Made .verify behave more like .encode, see #710
1 parent 79d0ba2 commit 3d23eed

File tree

9 files changed

+364
-372
lines changed

9 files changed

+364
-372
lines changed

src/encoder.js

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ function encoder(mtype) {
4242
type = field.resolvedType instanceof Enum ? "uint32" : field.type,
4343
wireType = types.basic[type];
4444
ref = "m" + util.safeProp(field.name);
45-
45+
4646
// Map fields
4747
if (field.map) {
4848
gen
49-
("if(%s&&m.hasOwnProperty(%j)){", ref, field.name)
49+
("if(%s!=null&&m.hasOwnProperty(%j)){", ref, field.name) // !== undefined && !== null
5050
("for(var ks=Object.keys(%s),i=0;i<ks.length;++i){", ref)
5151
("w.uint32(%d).fork().uint32(%d).%s(ks[i])", (field.id << 3 | 2) >>> 0, 8 | types.mapKey[field.keyType], field.keyType);
5252
if (wireType === undefined) gen
@@ -59,7 +59,7 @@ function encoder(mtype) {
5959

6060
// Repeated fields
6161
} else if (field.repeated) { gen
62-
("if(%s&&%s.length){", ref, ref);
62+
("if(%s!=null&&%s.length){", ref, ref); // !== undefined && !== null
6363

6464
// Packed repeated
6565
if (field.packed && types.packed[type] !== undefined) { gen
@@ -83,15 +83,9 @@ function encoder(mtype) {
8383

8484
// Non-repeated
8585
} else {
86-
if (field.optional) {
87-
88-
if (field.bytes || field.resolvedType && !(field.resolvedType instanceof Enum)) gen
89-
("if(%s&&m.hasOwnProperty(%j))", ref, field.name);
90-
else gen
86+
if (field.optional) gen
9187
("if(%s!=null&&m.hasOwnProperty(%j))", ref, field.name); // !== undefined && !== null
9288

93-
}
94-
9589
if (wireType === undefined)
9690
genTypePartial(gen, field, index, ref);
9791
else gen

src/verifier.js

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -129,33 +129,30 @@ function verifier(mtype) {
129129
for (var i = 0; i < /* initializes */ mtype.fieldsArray.length; ++i) {
130130
var field = mtype._fieldsArray[i].resolve(),
131131
ref = "m" + util.safeProp(field.name);
132+
133+
if (field.optional) gen
134+
("if(%s!=null&&m.hasOwnProperty(%j)){", ref, field.name); // !== undefined && !== null
132135

133136
// map fields
134137
if (field.map) { gen
135-
("if(%s!=null){", ref) // !== undefined && !== null
136-
("if(!util.isObject(%s))", ref)
137-
("return%j", invalid(field, "object"))
138-
("var k=Object.keys(%s)", ref)
139-
("for(var i=0;i<k.length;++i){");
140-
genVerifyKey(gen, field, "k[i]");
141-
genVerifyValue(gen, field, i, ref + "[k[i]]")
142-
("}")
138+
("if(!util.isObject(%s))", ref)
139+
("return%j", invalid(field, "object"))
140+
("var k=Object.keys(%s)", ref)
141+
("for(var i=0;i<k.length;++i){");
142+
genVerifyKey(gen, field, "k[i]");
143+
genVerifyValue(gen, field, i, ref + "[k[i]]")
143144
("}");
144145

145146
// repeated fields
146147
} else if (field.repeated) { gen
147-
("if(%s!=null){", ref) // !== undefined && !== null
148-
("if(!Array.isArray(%s))", ref)
149-
("return%j", invalid(field, "array"))
150-
("for(var i=0;i<%s.length;++i){", ref);
151-
genVerifyValue(gen, field, i, ref + "[i]")
152-
("}")
148+
("if(!Array.isArray(%s))", ref)
149+
("return%j", invalid(field, "array"))
150+
("for(var i=0;i<%s.length;++i){", ref);
151+
genVerifyValue(gen, field, i, ref + "[i]")
153152
("}");
154153

155154
// required or present fields
156155
} else {
157-
if (field.optional) gen
158-
("if(%s!=null){", ref); // !== undefined && !== null
159156
if (field.partOf) {
160157
var oneofProp = util.safeProp(field.partOf.name);
161158
if (seenFirstField[field.partOf.name] === 1) gen
@@ -165,11 +162,12 @@ function verifier(mtype) {
165162
gen
166163
("p%s=1", oneofProp);
167164
}
168-
genVerifyValue(gen, field, i, ref);
169-
if (field.optional) gen
170-
("}");
165+
genVerifyValue(gen, field, i, ref);
171166
}
172-
} return gen
167+
if (field.optional) gen
168+
("}");
169+
}
170+
return gen
173171
("return null");
174172
/* eslint-enable no-unexpected-multiline */
175173
}

tests/data/comments.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,13 +144,13 @@ $root.Test1 = (function() {
144144
Test1.verify = function verify(message) {
145145
if (typeof message !== "object" || message === null)
146146
return "object expected";
147-
if (message.field1 != null)
147+
if (message.field1 != null && message.hasOwnProperty("field1"))
148148
if (!$util.isString(message.field1))
149149
return "field1: string expected";
150-
if (message.field2 != null)
150+
if (message.field2 != null && message.hasOwnProperty("field2"))
151151
if (!$util.isInteger(message.field2))
152152
return "field2: integer expected";
153-
if (message.field3 != null)
153+
if (message.field3 != null && message.hasOwnProperty("field3"))
154154
if (typeof message.field3 !== "boolean")
155155
return "field3: boolean expected";
156156
return null;

tests/data/convert.js

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -117,31 +117,31 @@ $root.Message = (function() {
117117
writer = $Writer.create();
118118
if (message.stringVal != null && message.hasOwnProperty("stringVal"))
119119
writer.uint32(/* id 1, wireType 2 =*/10).string(message.stringVal);
120-
if (message.stringRepeated && message.stringRepeated.length)
120+
if (message.stringRepeated != null && message.stringRepeated.length)
121121
for (var i = 0; i < message.stringRepeated.length; ++i)
122122
writer.uint32(/* id 2, wireType 2 =*/18).string(message.stringRepeated[i]);
123123
if (message.uint64Val != null && message.hasOwnProperty("uint64Val"))
124124
writer.uint32(/* id 3, wireType 0 =*/24).uint64(message.uint64Val);
125-
if (message.uint64Repeated && message.uint64Repeated.length) {
125+
if (message.uint64Repeated != null && message.uint64Repeated.length) {
126126
writer.uint32(/* id 4, wireType 2 =*/34).fork();
127127
for (var i = 0; i < message.uint64Repeated.length; ++i)
128128
writer.uint64(message.uint64Repeated[i]);
129129
writer.ldelim();
130130
}
131-
if (message.bytesVal && message.hasOwnProperty("bytesVal"))
131+
if (message.bytesVal != null && message.hasOwnProperty("bytesVal"))
132132
writer.uint32(/* id 5, wireType 2 =*/42).bytes(message.bytesVal);
133-
if (message.bytesRepeated && message.bytesRepeated.length)
133+
if (message.bytesRepeated != null && message.bytesRepeated.length)
134134
for (var i = 0; i < message.bytesRepeated.length; ++i)
135135
writer.uint32(/* id 6, wireType 2 =*/50).bytes(message.bytesRepeated[i]);
136136
if (message.enumVal != null && message.hasOwnProperty("enumVal"))
137137
writer.uint32(/* id 7, wireType 0 =*/56).uint32(message.enumVal);
138-
if (message.enumRepeated && message.enumRepeated.length) {
138+
if (message.enumRepeated != null && message.enumRepeated.length) {
139139
writer.uint32(/* id 8, wireType 2 =*/66).fork();
140140
for (var i = 0; i < message.enumRepeated.length; ++i)
141141
writer.uint32(message.enumRepeated[i]);
142142
writer.ldelim();
143143
}
144-
if (message.int64Map && message.hasOwnProperty("int64Map"))
144+
if (message.int64Map != null && message.hasOwnProperty("int64Map"))
145145
for (var keys = Object.keys(message.int64Map), i = 0; i < keys.length; ++i)
146146
writer.uint32(/* id 9, wireType 2 =*/74).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 0 =*/16).int64(message.int64Map[keys[i]]).ldelim();
147147
return writer;
@@ -251,45 +251,45 @@ $root.Message = (function() {
251251
Message.verify = function verify(message) {
252252
if (typeof message !== "object" || message === null)
253253
return "object expected";
254-
if (message.stringVal != null)
254+
if (message.stringVal != null && message.hasOwnProperty("stringVal"))
255255
if (!$util.isString(message.stringVal))
256256
return "stringVal: string expected";
257-
if (message.stringRepeated != null) {
257+
if (message.stringRepeated != null && message.hasOwnProperty("stringRepeated")) {
258258
if (!Array.isArray(message.stringRepeated))
259259
return "stringRepeated: array expected";
260260
for (var i = 0; i < message.stringRepeated.length; ++i)
261261
if (!$util.isString(message.stringRepeated[i]))
262262
return "stringRepeated: string[] expected";
263263
}
264-
if (message.uint64Val != null)
264+
if (message.uint64Val != null && message.hasOwnProperty("uint64Val"))
265265
if (!$util.isInteger(message.uint64Val) && !(message.uint64Val && $util.isInteger(message.uint64Val.low) && $util.isInteger(message.uint64Val.high)))
266266
return "uint64Val: integer|Long expected";
267-
if (message.uint64Repeated != null) {
267+
if (message.uint64Repeated != null && message.hasOwnProperty("uint64Repeated")) {
268268
if (!Array.isArray(message.uint64Repeated))
269269
return "uint64Repeated: array expected";
270270
for (var i = 0; i < message.uint64Repeated.length; ++i)
271271
if (!$util.isInteger(message.uint64Repeated[i]) && !(message.uint64Repeated[i] && $util.isInteger(message.uint64Repeated[i].low) && $util.isInteger(message.uint64Repeated[i].high)))
272272
return "uint64Repeated: integer|Long[] expected";
273273
}
274-
if (message.bytesVal != null)
274+
if (message.bytesVal != null && message.hasOwnProperty("bytesVal"))
275275
if (!(message.bytesVal && typeof message.bytesVal.length === "number" || $util.isString(message.bytesVal)))
276276
return "bytesVal: buffer expected";
277-
if (message.bytesRepeated != null) {
277+
if (message.bytesRepeated != null && message.hasOwnProperty("bytesRepeated")) {
278278
if (!Array.isArray(message.bytesRepeated))
279279
return "bytesRepeated: array expected";
280280
for (var i = 0; i < message.bytesRepeated.length; ++i)
281281
if (!(message.bytesRepeated[i] && typeof message.bytesRepeated[i].length === "number" || $util.isString(message.bytesRepeated[i])))
282282
return "bytesRepeated: buffer[] expected";
283283
}
284-
if (message.enumVal != null)
284+
if (message.enumVal != null && message.hasOwnProperty("enumVal"))
285285
switch (message.enumVal) {
286286
default:
287287
return "enumVal: enum value expected";
288288
case 1:
289289
case 2:
290290
break;
291291
}
292-
if (message.enumRepeated != null) {
292+
if (message.enumRepeated != null && message.hasOwnProperty("enumRepeated")) {
293293
if (!Array.isArray(message.enumRepeated))
294294
return "enumRepeated: array expected";
295295
for (var i = 0; i < message.enumRepeated.length; ++i)
@@ -301,7 +301,7 @@ $root.Message = (function() {
301301
break;
302302
}
303303
}
304-
if (message.int64Map != null) {
304+
if (message.int64Map != null && message.hasOwnProperty("int64Map")) {
305305
if (!$util.isObject(message.int64Map))
306306
return "int64Map: object expected";
307307
var key = Object.keys(message.int64Map);

0 commit comments

Comments
 (0)