@@ -191,9 +191,14 @@ for member in message.structure.members:
191
191
elif isinstance (member .type , AbstractSequence) and ' array.array' not in lazy_import_methods :
192
192
lazy_import_methods .add (' array.array' )
193
193
TEMPLATE (' _import_type.c.em' , full_type_name = ' array.array' , func_name = ' lazy_import_array' )
194
- }@
195
- @ {
194
+
196
195
module_name = ' _' + convert_camel_case_to_lower_case_underscore (interface_path .stem )
196
+ full_type_name = ' .' .join (message .structure .namespaced_type .namespaces + [module_name, message .structure .namespaced_type .name ])
197
+ import_func_name = ' lazy_import_' + convert_camel_case_to_lower_case_underscore (message .structure .namespaced_type .name )
198
+ no_fields = len (message .structure .members ) == 1 and message .structure .members [0 ].name == EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME
199
+ TEMPLATE (
200
+ ' _import_type.c.em' ,
201
+ full_type_name = full_type_name, func_name = import_func_name, ensure_is_type = True)
197
202
}@
198
203
ROSIDL_GENERATOR_C_EXPORT
199
204
bool @ (' __' .join (message .structure .namespaced_type .namespaces + [convert_camel_case_to_lower_case_underscore (message .structure .namespaced_type .name )]))__convert_from_py (PyObject * _pymsg, void * _ros_message)
@@ -203,36 +208,17 @@ full_classname = '%s.%s.%s' % ('.'.join(message.structure.namespaced_type.namesp
203
208
}@
204
209
// check that the passed message is of the expected Python class
205
210
{
206
- char full_classname_dest[@ (len (full_classname) + 1 )];
207
- {
208
- char * class_name = NULL;
209
- char * module_name = NULL;
210
- {
211
- PyObject * class_attr = PyObject_GetAttrString (_pymsg, " __class__" );
212
- if (class_attr) {
213
- PyObject * name_attr = PyObject_GetAttrString (class_attr, " __name__" );
214
- if (name_attr) {
215
- class_name = (char * )PyUnicode_1BYTE_DATA (name_attr);
216
- Py_DECREF (name_attr);
217
- }
218
- PyObject * module_attr = PyObject_GetAttrString (class_attr, " __module__" );
219
- if (module_attr) {
220
- module_name = (char * )PyUnicode_1BYTE_DATA (module_attr);
221
- Py_DECREF (module_attr);
222
- }
223
- Py_DECREF (class_attr);
224
- }
225
- }
226
- if (! class_name || ! module_name) {
227
- return false ;
228
- }
229
- snprintf (full_classname_dest, sizeof (full_classname_dest), " %s.%s" , module_name, class_name);
230
- }
231
- assert (strncmp (" @(full_classname)" , full_classname_dest, @ (len (full_classname))) == 0 );
211
+ PyTypeObject * py_type = (PyTypeObject * )@ (import_func_name)();
212
+ assert (Py_TYPE (_pymsg) == py_type);
232
213
}
233
214
@ (msg_typename) * ros_message = _ros_message;
215
+ @ [if no_fields]@
216
+ ros_message-> @ (member .name ) = 0 ;
217
+ @ [else ]
218
+ @ (message .structure .namespaced_type .name )Base * base_msg = (@ (message .structure .namespaced_type .name )Base * )_pymsg;
219
+ @ [end if ]@
234
220
@ [for member in message .structure .members ]@
235
- @ [ if len ( message . structure . members ) == 1 and member . name == EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME ]@
221
+ @ [ if no_fields ]@
236
222
ros_message-> @ (member .name ) = 0 ;
237
223
@ [ continue ]@
238
224
@ [ end if ]@
@@ -242,31 +228,30 @@ if isinstance(type_, AbstractNestedType):
242
228
type_ = type_ .value_type
243
229
}@
244
230
{ // @ (member .name )
245
- PyObject * field = PyObject_GetAttrString (_pymsg, " @(member.name)" );
231
+ @ [ if not isinstance (member .type , BasicType)]@
232
+ PyObject * field = base_msg-> _@ (member .name );
246
233
if (! field) {
247
234
return false ;
248
235
}
236
+ @ [ end if ]@
249
237
@ [ if isinstance (type_, NamespacedType)]@
250
238
@ {
251
239
nested_type = ' __' .join (type_ .namespaced_name ())
252
240
}@
253
241
@ [ if isinstance (member .type , AbstractNestedType)]@
254
242
PyObject * seq_field = PySequence_Fast (field, " expected a sequence in '@(member.name)'" );
255
243
if (! seq_field) {
256
- Py_DECREF (field);
257
244
return false ;
258
245
}
259
246
@ [ if isinstance (member .type , AbstractSequence)]@
260
247
Py_ssize_t size = PySequence_Size (field);
261
248
if (- 1 == size) {
262
249
Py_DECREF (seq_field);
263
- Py_DECREF (field);
264
250
return false ;
265
251
}
266
252
if (! @ (nested_type)__Sequence__init (& (ros_message-> @ (member .name )), size)) {
267
253
PyErr_SetString (PyExc_RuntimeError, " unable to create @(nested_type)__Sequence ros_message" );
268
254
Py_DECREF (seq_field);
269
- Py_DECREF (field);
270
255
return false ;
271
256
}
272
257
@ (nested_type) * dest = ros_message-> @ (member .name ).data ;
@@ -277,14 +262,12 @@ nested_type = '__'.join(type_.namespaced_name())
277
262
for (Py_ssize_t i = 0 ; i < size; ++ i) {
278
263
if (! @ (' __' .join (type_ .namespaces + [convert_camel_case_to_lower_case_underscore (type_ .name )]))__convert_from_py (PySequence_Fast_GET_ITEM (seq_field, i), & dest[i])) {
279
264
Py_DECREF (seq_field);
280
- Py_DECREF (field);
281
265
return false ;
282
266
}
283
267
}
284
268
Py_DECREF (seq_field);
285
269
@ [ else ]@
286
270
if (! @ (' __' .join (type_ .namespaces + [convert_camel_case_to_lower_case_underscore (type_ .name )]))__convert_from_py (field, & ros_message-> @ (member .name ))) {
287
- Py_DECREF (field);
288
271
return false ;
289
272
}
290
273
@ [ end if ]@
@@ -295,21 +278,18 @@ nested_type = '__'.join(type_.namespaced_name())
295
278
Py_buffer view;
296
279
int rc = PyObject_GetBuffer (field, & view, PyBUF_SIMPLE);
297
280
if (rc < 0 ) {
298
- Py_DECREF (field);
299
281
return false ;
300
282
}
301
283
Py_ssize_t size = view .len / sizeof (@ primitive_msg_type_to_c (member .type .value_type ));
302
284
if (! rosidl_runtime_c__@ (member .type .value_type .typename )__Sequence__init (& (ros_message-> @ (member .name )), size)) {
303
285
PyErr_SetString (PyExc_RuntimeError, " unable to create @(member.type.value_type.typename)__Sequence ros_message" );
304
286
PyBuffer_Release (& view);
305
- Py_DECREF (field);
306
287
return false ;
307
288
}
308
289
@ primitive_msg_type_to_c (member .type .value_type ) * dest = ros_message-> @ (member .name ).data ;
309
290
rc = PyBuffer_ToContiguous (dest, & view, view .len , ' C' );
310
291
if (rc < 0 ) {
311
292
PyBuffer_Release (& view);
312
- Py_DECREF (field);
313
293
return false ;
314
294
}
315
295
PyBuffer_Release (& view);
@@ -329,36 +309,31 @@ nested_type = '__'.join(type_.namespaced_name())
329
309
@ [ else ]@
330
310
PyObject * seq_field = PySequence_Fast (field, " expected a sequence in '@(member.name)'" );
331
311
if (! seq_field) {
332
- Py_DECREF (field);
333
312
return false ;
334
313
}
335
314
@ [ end if ]@
336
315
@ [ if isinstance (member .type , AbstractSequence)]@
337
316
Py_ssize_t size = PySequence_Size (field);
338
317
if (- 1 == size) {
339
318
Py_DECREF (seq_field);
340
- Py_DECREF (field);
341
319
return false ;
342
320
}
343
321
@ [ if isinstance (member .type .value_type , AbstractString)]@
344
322
if (! rosidl_runtime_c__String__Sequence__init (& (ros_message-> @ (member .name )), size)) {
345
323
PyErr_SetString (PyExc_RuntimeError, " unable to create String__Sequence ros_message" );
346
324
Py_DECREF (seq_field);
347
- Py_DECREF (field);
348
325
return false ;
349
326
}
350
327
@ [ elif isinstance (member .type .value_type , AbstractWString)]@
351
328
if (! rosidl_runtime_c__U16String__Sequence__init (& (ros_message-> @ (member .name )), size)) {
352
329
PyErr_SetString (PyExc_RuntimeError, " unable to create U16String__Sequence ros_message" );
353
330
Py_DECREF (seq_field);
354
- Py_DECREF (field);
355
331
return false ;
356
332
}
357
333
@ [ else ]@
358
334
if (! rosidl_runtime_c__@ (member .type .value_type .typename )__Sequence__init (& (ros_message-> @ (member .name )), size)) {
359
335
PyErr_SetString (PyExc_RuntimeError, " unable to create @(member.type.value_type.typename)__Sequence ros_message" );
360
336
Py_DECREF (seq_field);
361
- Py_DECREF (field);
362
337
return false ;
363
338
}
364
339
@ [ end if ]@
@@ -372,7 +347,6 @@ nested_type = '__'.join(type_.namespaced_name())
372
347
PyObject * item = PySequence_Fast_GET_ITEM (seq_field, i);
373
348
if (! item) {
374
349
Py_DECREF (seq_field);
375
- Py_DECREF (field);
376
350
return false ;
377
351
}
378
352
@ [ end if ]@
@@ -396,7 +370,6 @@ nested_type = '__'.join(type_.namespaced_name())
396
370
PyObject * encoded_item = PyUnicode_AsUTF8String (item);
397
371
if (! encoded_item) {
398
372
Py_DECREF (seq_field);
399
- Py_DECREF (field);
400
373
return false ;
401
374
}
402
375
rosidl_runtime_c__String__assign (& dest[i], PyBytes_AS_STRING (encoded_item));
@@ -407,7 +380,6 @@ nested_type = '__'.join(type_.namespaced_name())
407
380
PyObject * encoded_item = PyUnicode_AsUTF16String (item);
408
381
if (! encoded_item) {
409
382
Py_DECREF (seq_field);
410
- Py_DECREF (field);
411
383
return false ;
412
384
}
413
385
char * buffer;
@@ -416,15 +388,13 @@ nested_type = '__'.join(type_.namespaced_name())
416
388
if (rc) {
417
389
Py_DECREF (encoded_item);
418
390
Py_DECREF (seq_field);
419
- Py_DECREF (field);
420
391
return false ;
421
392
}
422
393
// use offset of 2 to skip BOM mark
423
394
bool succeeded = rosidl_runtime_c__U16String__assignn_from_char (& dest[i], buffer + 2 , length - 2 );
424
395
Py_DECREF (encoded_item);
425
396
if (! succeeded) {
426
397
Py_DECREF (seq_field);
427
- Py_DECREF (field);
428
398
return false ;
429
399
}
430
400
@ [ elif isinstance (member .type .value_type , BasicType) and member .type .value_type .typename == ' boolean' ]@
@@ -468,18 +438,6 @@ nested_type = '__'.join(type_.namespaced_name())
468
438
}
469
439
Py_DECREF (seq_field);
470
440
}
471
- @ [ elif isinstance (member .type , BasicType) and member .type .typename == ' char' ]@
472
- assert (PyUnicode_Check (field));
473
- PyObject * encoded_field = PyUnicode_AsUTF8String (field);
474
- if (! encoded_field) {
475
- Py_DECREF (field);
476
- return false ;
477
- }
478
- ros_message-> @ (member .name ) = PyBytes_AS_STRING (encoded_field)[0 ];
479
- Py_DECREF (encoded_field);
480
- @ [ elif isinstance (member .type , BasicType) and member .type .typename == ' octet' ]@
481
- assert (PyBytes_Check (field));
482
- ros_message-> @ (member .name ) = PyBytes_AS_STRING (field)[0 ];
483
441
@ [ elif isinstance (member .type , AbstractString)]@
484
442
assert (PyUnicode_Check (field));
485
443
PyObject * encoded_field = PyUnicode_AsUTF8String (field);
@@ -494,78 +452,38 @@ nested_type = '__'.join(type_.namespaced_name())
494
452
// the returned string starts with a BOM mark and uses native byte order
495
453
PyObject * encoded_field = PyUnicode_AsUTF16String (field);
496
454
if (! encoded_field) {
497
- Py_DECREF (field);
498
455
return false ;
499
456
}
500
457
char * buffer;
501
458
Py_ssize_t length;
502
459
int rc = PyBytes_AsStringAndSize (encoded_field, & buffer, & length);
503
460
if (rc) {
504
461
Py_DECREF (encoded_field);
505
- Py_DECREF (field);
506
462
return false ;
507
463
}
508
464
// use offset of 2 to skip BOM mark
509
465
{
510
466
bool succeeded = rosidl_runtime_c__U16String__assignn_from_char (& ros_message-> @ (member .name ), buffer + 2 , length - 2 );
511
467
Py_DECREF (encoded_field);
512
468
if (! succeeded) {
513
- Py_DECREF (field);
514
469
return false ;
515
470
}
516
471
}
517
- @ [ elif isinstance (member .type , BasicType) and member .type .typename == ' boolean' ]@
518
- assert (PyBool_Check (field));
519
- ros_message-> @ (member .name ) = (Py_True == field);
520
- @ [ elif isinstance (member .type , BasicType) and member .type .typename in (' float' , ' double' )]@
521
- assert (PyFloat_Check (field));
472
+ @ [ elif isinstance (member .type , BasicType)]@
522
473
@ [ if member .type .typename == ' float' ]@
523
- ros_message-> @ (member .name ) = (float)PyFloat_AS_DOUBLE (field );
474
+ ros_message-> @ (member .name ) = (float)base_msg -> _ @ ( member . name );
524
475
@ [ else ]@
525
- ros_message-> @ (member .name ) = PyFloat_AS_DOUBLE (field );
476
+ ros_message-> @ (member .name ) = base_msg -> _ @ ( member . name );
526
477
@ [ end if ]@
527
- @ [ elif isinstance (member .type , BasicType) and member .type .typename in (
528
- ' int8' ,
529
- ' int16' ,
530
- ' int32' ,
531
- )]@
532
- assert (PyLong_Check (field));
533
- ros_message-> @ (member .name ) = (@ (primitive_msg_type_to_c (member .type )))PyLong_AsLong (field);
534
- @ [ elif isinstance (member .type , BasicType) and member .type .typename in (
535
- ' uint8' ,
536
- ' uint16' ,
537
- ' uint32' ,
538
- )]@
539
- assert (PyLong_Check (field));
540
- @ [ if member .type .typename == ' uint32' ]@
541
- ros_message-> @ (member .name ) = PyLong_AsUnsignedLong (field);
542
- @ [ else ]@
543
- ros_message-> @ (member .name ) = (@ (primitive_msg_type_to_c (member .type )))PyLong_AsUnsignedLong (field);
544
- @ [ end if ]@
545
- @ [ elif isinstance (member .type , BasicType) and member .type .typename == ' int64' ]@
546
- assert (PyLong_Check (field));
547
- ros_message-> @ (member .name ) = PyLong_AsLongLong (field);
548
- @ [ elif isinstance (member .type , BasicType) and member .type .typename == ' uint64' ]@
549
- assert (PyLong_Check (field));
550
- ros_message-> @ (member .name ) = PyLong_AsUnsignedLongLong (field);
551
478
@ [ else ]@
552
479
assert (false );
553
480
@ [ end if ]@
554
- Py_DECREF (field);
555
481
}
556
482
@ [end for ]@
557
483
558
484
return true ;
559
485
}
560
486
561
- @ {
562
- full_type_name = ' .' .join (message .structure .namespaced_type .namespaces + [module_name, message .structure .namespaced_type .name ])
563
- import_func_name = ' lazy_import_' + convert_camel_case_to_lower_case_underscore (message .structure .namespaced_type .name )
564
- TEMPLATE (
565
- ' _import_type.c.em' ,
566
- full_type_name = full_type_name, func_name = import_func_name, ensure_is_type = True)
567
- }@
568
-
569
487
ROSIDL_GENERATOR_C_EXPORT
570
488
PyObject * @ (' __' .join (message .structure .namespaced_type .namespaces + [convert_camel_case_to_lower_case_underscore (message .structure .namespaced_type .name )]))__convert_to_py (void * raw_ros_message)
571
489
{
@@ -591,13 +509,13 @@ PyObject * @('__'.join(message.structure.namespaced_type.namespaces + [convert_c
591
509
return NULL;
592
510
}
593
511
}
594
- @ [if len ( message . structure . members ) == 1 and member . name == EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME ]@
512
+ @ [if no_fields ]@
595
513
(void )raw_ros_message;
596
514
@ [else ]@
597
515
@ (msg_typename) * ros_message = (@ (msg_typename) * )raw_ros_message;
598
516
@ [end if ]@
599
517
@ [for member in message .structure .members ]@
600
- @ [ if len ( message . structure . members ) == 1 and member . name == EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME ]@
518
+ @ [ if no_fields ]@
601
519
@ [ continue ]@
602
520
@ [ end if ]@
603
521
@ {
0 commit comments