@@ -9,6 +9,7 @@ const StructType = require('ref-struct');
99const ref = require('ref');
1010const ArrayType = require('ref-array');
1111const primitiveTypes = require('../../rosidl_gen/generator_primitive.js');
12+ const deallocator = require('../../rosidl_gen/deallocator.js');
1213
1314{{
1415let objectWrapper = it.spec.msgName + 'Wrapper';
@@ -172,7 +173,7 @@ class {{=objectWrapper}} {
172173 {{?}}
173174 {{~}}
174175 }
175- this.serialize ();
176+ this.freeze ();
176177 }
177178
178179 static createFromRefObject(refObject) {
@@ -198,30 +199,64 @@ class {{=objectWrapper}} {
198199 }
199200
200201 toRawROS() {
202+ this.freeze(true);
201203 return this._refObject.ref();
202204 }
203205
204- serialize( ) {
206+ freeze(own = false ) {
205207 {{~ it.spec.fields :field}}
206208 {{? !field.type.isPrimitiveType || field.type.isArray}}
207- this._wrapperFields.{{=field.name}}.serialize( );
209+ this._wrapperFields.{{=field.name}}.freeze(own );
208210 this._refObject.{{=field.name}} = this._wrapperFields.{{=field.name}}.refObject;
209211 {{?? field.type.type === 'string' && it.spec.msgName !== 'String'}}
212+ if (own) {
213+ primitiveTypes.initString(this._wrapperFields.{{=field.name}}.refObject.ref(), own);
214+ }
210215 this._refObject.{{=field.name}} = this._wrapperFields.{{=field.name}}.refObject;
216+ {{?? it.spec.msgName === 'String'}}
217+ if (own) {
218+ primitiveTypes.initString(this._refObject.ref(), own);
219+ }
211220 {{?}}
212221 {{~}}
213222 }
214223
215- deserialize() {
224+ serialize() {
225+ this.freeze();
226+ return this._refObject.ref();
227+ }
228+
229+ deserialize(refObject) {
216230 {{~ it.spec.fields :field}}
217231 {{? !field.type.isPrimitiveType || field.type.isArray}}
218- this._wrapperFields.{{=field.name}}.copyRefObject(this._refObject .{{=field.name}});
232+ this._wrapperFields.{{=field.name}}.copyRefObject(refObject .{{=field.name}});
219233 {{?? field.type.type === 'string' && it.spec.msgName !== 'String'}}
220- this._wrapperFields.{{=field.name}}.data = this._refObject.{{=field.name}}.data;
234+ this._wrapperFields.{{=field.name}}.data = refObject.{{=field.name}}.data;
235+ {{?? field.type.isPrimitiveType}}
236+ this._refObject.{{=field.name}} = refObject.{{=field.name}};
237+ {{?}}
238+ {{~}}
239+ }
240+
241+ static freeStruct(refObject) {
242+ {{~ it.spec.fields :field}}
243+ {{? field.type.isArray}}
244+ if (refObject.{{=field.name}}.size != 0) {
245+ {{=getWrapperNameByType(field.type)}}.ArrayType.freeArray(refObject.{{=field.name}});
246+ deallocator.freeStructMember(refObject.{{=field.name}}, {{=getWrapperNameByType(field.type)}}.refObjectArrayType, 'data');
247+ }
248+ {{?? !field.type.isPrimitiveType || (field.type.type === 'string' && it.spec.msgName !== 'String')}}
249+ {{=getWrapperNameByType(field.type)}}.freeStruct(refObject.{{=field.name}});
250+ {{?? it.spec.msgName === 'String'}}
251+ deallocator.freeStructMember(refObject, {{=getWrapperNameByType(field.type)}}.refObjectType, '{{=field.name}}');
221252 {{?}}
222253 {{~}}
223254 }
224255
256+ static destoryRawROS(msg) {
257+ {{=objectWrapper}}.freeStruct(msg.refObject);
258+ }
259+
225260 static type() {
226261 return {pkgName: '{{=it.messageInfo.pkgName}}', subFolder: '{{=it.messageInfo.subFolder}}', interfaceName: '{{=it.messageInfo.interfaceName}}'};
227262 }
@@ -319,20 +354,16 @@ class {{=arrayWrapper}} {
319354 {{?}}
320355 }
321356
322- serialize( ) {
357+ freeze(own ) {
323358 this._wrappers.forEach((wrapper, index) => {
324- wrapper.serialize( );
359+ wrapper.freeze(own );
325360 this._refArray[index] = wrapper.refObject;
326361 });
327362 this._refObject.size = this._wrappers.length;
328363 this._refObject.capacity = this._wrappers.length;
329364 this._refObject.data = this._refArray.buffer;
330365 }
331366
332- deserialize(refObject) {
333- copyRefObject(refObject)
334- }
335-
336367 get refObject() {
337368 return this._refObject;
338369 }
@@ -406,6 +437,14 @@ class {{=arrayWrapper}} {
406437 this._wrappers[index].copy(wrapper);
407438 });
408439 }
440+
441+ static freeArray(refObject) {
442+ let refObjectArray = refObject.data;
443+ refObjectArray.length = refObject.size ;
444+ for (let index = 0; index < refObject.size ; index++) {
445+ {{=objectWrapper}}.freeStruct(refObjectArray[index]);
446+ }
447+ }
409448}
410449
411450{{? it.spec.constants != undefined && it.spec.constants.length}}
0 commit comments