Skip to content

Commit db9fd05

Browse files
author
Minggang Wang
authored
Merge pull request #274 from minggangw/fix-issue-243-1
Check the consistency of the message's members when being serialized
2 parents 4303f6b + 925966b commit db9fd05

File tree

4 files changed

+59
-11
lines changed

4 files changed

+59
-11
lines changed

lib/message_translator.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ function isTypedArray(value) {
2525
function copyMsgObject(msg, obj) {
2626
if (typeof obj === 'object') {
2727
for (let i in obj) {
28-
if (typeof msg[i] !== 'undefined') {
28+
if (msg.hasMember(i)) {
2929
const type = typeof obj[i];
3030
if (type === 'string' || type === 'number' || type === 'boolean') {
3131
// A primitive-type value

rosidl_gen/generator.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "rosidl-generator",
3-
"version": "0.0.7",
3+
"version": "0.0.8",
44
"description": "Generate JavaScript object from ROS IDL(.msg) files",
55
"authors": [
66
"Minggang Wang <[email protected]>",

rosidl_gen/templates/message.dot

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,14 @@ function getPackageNameByType(type) {
178178
return type.pkgName;
179179
}
180180
}
181+
182+
function extractMemberNames(fields) {
183+
let memberNames = [];
184+
fields.forEach(field => {
185+
memberNames.push(field.name);
186+
});
187+
return JSON.stringify(memberNames);
188+
}
181189
}}
182190

183191
{{? usePlainTypedArray}}
@@ -231,9 +239,13 @@ class {{=objectWrapper}} {
231239
this._{{=field.name}}Array = [];
232240
{{?}}
233241
{{~}}
242+
234243
if (typeof other === 'object' && other._refObject) {
235244
this._refObject = new {{=refObjectType}}(other._refObject.toObject());
236245
{{~ it.spec.fields :field}}
246+
{{? field.type.isPrimitiveType && !field.type.isArray}}
247+
this._{{=field.name}}Intialized = true;
248+
{{?}}
237249
{{? field.type.isArray}}
238250
this._wrapperFields.{{=field.name}} = {{=getWrapperNameByType(field.type)}}.createArray();
239251
this._wrapperFields.{{=field.name}}.copy(other._wrapperFields.{{=field.name}});
@@ -247,6 +259,9 @@ class {{=objectWrapper}} {
247259
} else {
248260
this._refObject = new {{=refObjectType}}();
249261
{{~ it.spec.fields :field}}
262+
{{? field.type.isPrimitiveType && !field.type.isArray}}
263+
this._{{=field.name}}Intialized = false;
264+
{{?}}
250265
{{? field.type.isArray}}
251266
this._wrapperFields.{{=field.name}} = {{=getWrapperNameByType(field.type)}}.createArray();
252267
{{?? !field.type.isPrimitiveType || (field.type.type === 'string' && it.spec.msgName !== 'String')}}
@@ -287,14 +302,23 @@ class {{=objectWrapper}} {
287302
return this._refObject.ref();
288303
}
289304

290-
freeze(own = false) {
305+
freeze(own = false, checkConsistency = false) {
306+
if (checkConsistency) {
307+
{{~ it.spec.fields :field}}
308+
{{? field.type.isPrimitiveType && !field.type.isArray}}
309+
if (!this._{{=field.name}}Intialized) {
310+
throw new TypeError('Invalid argument: {{=field.name}} in {{=it.spec.msgName}}');
311+
}
312+
{{?}}
313+
{{~}}
314+
}
291315
{{~ it.spec.fields :field}}
292316
{{? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
293317
this._wrapperFields.{{=field.name}}.fill(this._{{=field.name}}Array);
294-
this._wrapperFields.{{=field.name}}.freeze(own);
318+
this._wrapperFields.{{=field.name}}.freeze(own, checkConsistency);
295319
this._refObject.{{=field.name}} = this._wrapperFields.{{=field.name}}.refObject;
296320
{{?? !field.type.isPrimitiveType || field.type.isArray}}
297-
this._wrapperFields.{{=field.name}}.freeze(own);
321+
this._wrapperFields.{{=field.name}}.freeze(own, checkConsistency);
298322
this._refObject.{{=field.name}} = this._wrapperFields.{{=field.name}}.refObject;
299323
{{?? field.type.type === 'string' && it.spec.msgName !== 'String'}}
300324
if (own) {
@@ -310,12 +334,15 @@ class {{=objectWrapper}} {
310334
}
311335

312336
serialize() {
313-
this.freeze();
337+
this.freeze(false, true);
314338
return this._refObject.ref();
315339
}
316340

317341
deserialize(refObject) {
318342
{{~ it.spec.fields :field}}
343+
{{? field.type.isPrimitiveType && !field.type.isArray}}
344+
this._{{=field.name}}Intialized = true;
345+
{{?}}
319346
{{? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
320347
refObject.{{=field.name}}.data.length = refObject.{{=field.name}}.size;
321348
for (let index = 0; index < refObject.{{=field.name}}.size; index++) {
@@ -381,13 +408,23 @@ class {{=objectWrapper}} {
381408
{{?? !field.type.isPrimitiveType && !field.type.isArray}}
382409
return this._wrapperFields.{{=field.name}};
383410
{{?? !field.type.isArray && field.type.type === 'string' && it.spec.msgName !== 'String'}}
411+
if (!this._{{=field.name}}Intialized) {
412+
return undefined;
413+
}
384414
return this._wrapperFields.{{=field.name}}.data;
385415
{{?? true}}
416+
if (!this._{{=field.name}}Intialized) {
417+
return undefined;
418+
}
386419
return this._refObject.{{=field.name}};
387420
{{?}}
388421
}
389422

390423
set {{=field.name}}(value) {
424+
{{? field.type.isPrimitiveType && !field.type.isArray}}
425+
this._{{=field.name}}Intialized = true;
426+
{{?}}
427+
391428
{{? field.type.isArray && isTypedArrayType(field.type)}}
392429
this._wrapperFields['{{=field.name}}'].fill(value);
393430
{{?? field.type.isArray && field.type.isPrimitiveType}}
@@ -412,6 +449,9 @@ class {{=objectWrapper}} {
412449
this._refObject = new {{=refObjectType}}(refObject.toObject());
413450

414451
{{~ it.spec.fields :field}}
452+
{{? field.type.isPrimitiveType && !field.type.isArray}}
453+
this._{{=field.name}}Intialized = true;
454+
{{?}}
415455
{{? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
416456
refObject.{{=field.name}}.data.length = refObject.{{=field.name}}.size;
417457
for (let index = 0; index < refObject.{{=field.name}}.size; index++) {
@@ -427,6 +467,9 @@ class {{=objectWrapper}} {
427467
this._refObject = new {{=refObjectType}}(other._refObject.toObject());
428468

429469
{{~ it.spec.fields :field}}
470+
{{? field.type.isPrimitiveType && !field.type.isArray}}
471+
this._{{=field.name}}Intialized = true;
472+
{{?}}
430473
{{? field.type.isArray && field.type.isPrimitiveType && !isTypedArrayType(field.type)}}
431474
this._{{=field.name}}Array = other._{{=field.name}}Array.slice();
432475
{{?? !field.type.isPrimitiveType || field.type.isArray || (field.type.type === 'string' && it.spec.msgName !== 'String')}}
@@ -442,6 +485,11 @@ class {{=objectWrapper}} {
442485
static get ROSMessageDef() {
443486
return {{=compactMsgDefJSON}};
444487
}
488+
489+
hasMember(name) {
490+
let memberNames = {{=extractMemberNames(it.spec.fields)}};
491+
return memberNames.indexOf(name) !== -1;
492+
}
445493
}
446494

447495
// Define the wrapper of array class.

test/test-compound-msg-type-check.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ describe('Compound types', function() {
3434
let msg = new msgColorRGBA();
3535

3636
assert.ok('r' in msg && 'g' in msg && 'b' in msg && 'a' in msg);
37-
assert.deepStrictEqual(typeof msg.r, 'number');
38-
assert.deepStrictEqual(typeof msg.g, 'number');
39-
assert.deepStrictEqual(typeof msg.b, 'number');
40-
assert.deepStrictEqual(typeof msg.a, 'number');
37+
assert.deepStrictEqual(typeof msg.r, 'undefined');
38+
assert.deepStrictEqual(typeof msg.g, 'undefined');
39+
assert.deepStrictEqual(typeof msg.b, 'undefined');
40+
assert.deepStrictEqual(typeof msg.a, 'undefined');
4141
});
4242

4343
it('Array', function() {
@@ -60,7 +60,7 @@ describe('Compound types', function() {
6060
assert.ok('frame_id' in header);
6161

6262
assert.deepStrictEqual(typeof header.stamp, 'object');
63-
assert.deepStrictEqual(typeof header.frame_id, 'string');
63+
assert.deepStrictEqual(typeof header.frame_id, 'undefined');
6464
});
6565

6666
it('Complex object', function() {

0 commit comments

Comments
 (0)