Skip to content

Commit 1f97b7a

Browse files
committed
New: Constructors/.create always initialize proper mutable objects/arrays, see #700
1 parent 017161c commit 1f97b7a

File tree

2 files changed

+15
-13
lines changed

2 files changed

+15
-13
lines changed

src/class.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,12 @@ function Class(type, ctor) {
7777
Class.generate = function generate(type) { // eslint-disable-line no-unused-vars
7878
/* eslint-disable no-unexpected-multiline */
7979
var gen = util.codegen("p");
80-
// see issue #700: the following would add explicitly initialized mutable object/array fields
81-
// so that these aren't just inherited from the prototype. will break test cases.
82-
/*
80+
// explicitly initialize mutable object/array fields so that these aren't just inherited from the prototype
8381
for (var i = 0, field; i < type.fieldsArray.length; ++i)
8482
if ((field = type._fieldsArray[i]).map) gen
8583
("this%s={}", util.safeProp(field.name));
8684
else if (field.repeated) gen
8785
("this%s=[]", util.safeProp(field.name));
88-
*/
8986
return gen
9087
("if(p){")
9188
("for(var ks=Object.keys(p),i=0;i<ks.length;++i)")

src/converter.js

+14-9
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ converter.toObject = function toObject(mtype) {
229229

230230
if (normalFields.length) { gen
231231
("if(o.defaults){");
232-
for (i = 0, field; i < normalFields.length; ++i) {
232+
for (i = 0; i < normalFields.length; ++i) {
233233
var field = normalFields[i],
234234
prop = util.safeProp(field.name);
235235
if (field.resolvedType instanceof Enum) gen
@@ -247,25 +247,30 @@ converter.toObject = function toObject(mtype) {
247247
} gen
248248
("}");
249249
}
250-
for (i = 0, field; i < fields.length; ++i) {
250+
for (i = 0; i < fields.length; ++i) {
251251
var field = fields[i],
252-
prop = util.safeProp(field.name); gen
253-
("if(m%s!==undefined&&m%s!==null&&m.hasOwnProperty(%j)){", prop, prop, field.name);
252+
index = mtype._fieldsArray.indexOf(field),
253+
prop = util.safeProp(field.name);
254254
if (field.map) { gen
255+
("var ks2")
256+
("if(m%s&&(ks2=Object.keys(m%s)).length){", prop, prop)
255257
("d%s={}", prop)
256-
("for(var ks2=Object.keys(m%s),j=0;j<ks2.length;++j){", prop);
257-
genValuePartial_toObject(gen, field, /* sorted */ mtype._fieldsArray.indexOf(field), prop + "[ks2[j]]")
258+
("for(var j=0;j<ks2.length;++j){");
259+
genValuePartial_toObject(gen, field, /* sorted */ index, prop + "[ks2[j]]")
258260
("}");
259261
} else if (field.repeated) { gen
262+
("if(m%s&&m%s.length){", prop, prop)
260263
("d%s=[]", prop)
261264
("for(var j=0;j<m%s.length;++j){", prop);
262-
genValuePartial_toObject(gen, field, /* sorted */ mtype._fieldsArray.indexOf(field), prop + "[j]")
265+
genValuePartial_toObject(gen, field, /* sorted */ index, prop + "[j]")
263266
("}");
264-
} else
265-
genValuePartial_toObject(gen, field, /* sorted */ mtype._fieldsArray.indexOf(field), prop);
267+
} else { gen
268+
("if(m%s!==undefined&&m%s!==null&&m.hasOwnProperty(%j)){", prop, prop, field.name);
269+
genValuePartial_toObject(gen, field, /* sorted */ index, prop);
266270
if (field.partOf) gen
267271
("if(o.oneofs)")
268272
("d%s=%j", util.safeProp(field.partOf.name), field.name);
273+
}
269274
gen
270275
("}");
271276
}

0 commit comments

Comments
 (0)