Skip to content

Commit f03fecc

Browse files
author
Ivan Dlugos
committed
fix C generated code - support using in both C and C++ projects
1 parent d88365e commit f03fecc

2 files changed

Lines changed: 32 additions & 9 deletions

File tree

internal/generator/c/templates/binding-c.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,12 @@ static bool {{$entity.Meta.CName}}_from_flatbuffer(const void* data, size_t size
151151
const flatbuffers_uoffset_t* val;
152152
size_t len;
153153
154-
*out_object = ({{$entity.Meta.CName}}) {0}; // reset so that dangling pointers are freed properly on malloc() failures
154+
// reset so that dangling pointers are freed properly on malloc() failures
155+
#ifdef __cplusplus
156+
*out_object = {};
157+
#else
158+
*out_object = ({{$entity.Meta.CName}}){0};{{/* Only works in C99, fails to compile on MSVC in a C++ project*/}}
159+
#endif
155160
{{range $property := $entity.Properties}}{{$propType := PropTypeName $property.Type -}}
156161
if ((offset = {{$.FileIdentifier}}_fb_field_offset(vs, vt, {{$property.FbSlot}}))) {
157162
{{- if $property.Meta.FbIsVector}}

test/comparison/testdata/fbs/typeful/c/schema.obx.h.expected

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ static obx_id schema_obx_h_put_object(OBX_box* box, void* object,
1818
static void* schema_obx_h_get_object(OBX_box* box, obx_id id, void* (*from_flatbuffer)(const void*, size_t));
1919

2020
/// Internal function used in other generated functions to get a vTable offset for a given field.
21-
static flatbuffers_voffset_t schema_obx_h_fb_field_offset(flatbuffers_voffset_t vs, const flatbuffers_voffset_t* vt,
22-
size_t field);
21+
static flatbuffers_voffset_t schema_obx_h_fb_field_offset(flatbuffers_voffset_t vs, const flatbuffers_voffset_t* vt, size_t field);
2322

2423

2524
/// Entity documentation is copied
@@ -385,7 +384,12 @@ static bool Typeful_from_flatbuffer(const void* data, size_t size, Typeful* out_
385384
const flatbuffers_uoffset_t* val;
386385
size_t len;
387386

388-
*out_object = (Typeful) {0}; // reset so that dangling pointers are freed properly on malloc() failures
387+
// reset so that dangling pointers are freed properly on malloc() failures
388+
#ifdef __cplusplus
389+
*out_object = {};
390+
#else
391+
*out_object = (Typeful){0};
392+
#endif
389393
if ((offset = schema_obx_h_fb_field_offset(vs, vt, 0))) {
390394
out_object->id = flatbuffers_uint64_read_from_pe(table + offset);
391395
}
@@ -672,7 +676,12 @@ static bool ns_Annotated_from_flatbuffer(const void* data, size_t size, ns_Annot
672676
const flatbuffers_uoffset_t* val;
673677
size_t len;
674678

675-
*out_object = (ns_Annotated) {0}; // reset so that dangling pointers are freed properly on malloc() failures
679+
// reset so that dangling pointers are freed properly on malloc() failures
680+
#ifdef __cplusplus
681+
*out_object = {};
682+
#else
683+
*out_object = (ns_Annotated){0};
684+
#endif
676685
if ((offset = schema_obx_h_fb_field_offset(vs, vt, 0))) {
677686
out_object->identifier = flatbuffers_uint64_read_from_pe(table + offset);
678687
}
@@ -865,7 +874,12 @@ static bool ns_TSDate_from_flatbuffer(const void* data, size_t size, ns_TSDate*
865874
const flatbuffers_uoffset_t* val;
866875
size_t len;
867876

868-
*out_object = (ns_TSDate) {0}; // reset so that dangling pointers are freed properly on malloc() failures
877+
// reset so that dangling pointers are freed properly on malloc() failures
878+
#ifdef __cplusplus
879+
*out_object = {};
880+
#else
881+
*out_object = (ns_TSDate){0};
882+
#endif
869883
if ((offset = schema_obx_h_fb_field_offset(vs, vt, 0))) {
870884
out_object->id = flatbuffers_uint64_read_from_pe(table + offset);
871885
}
@@ -967,7 +981,12 @@ static bool ns_TSDateNano_from_flatbuffer(const void* data, size_t size, ns_TSDa
967981
const flatbuffers_uoffset_t* val;
968982
size_t len;
969983

970-
*out_object = (ns_TSDateNano) {0}; // reset so that dangling pointers are freed properly on malloc() failures
984+
// reset so that dangling pointers are freed properly on malloc() failures
985+
#ifdef __cplusplus
986+
*out_object = {};
987+
#else
988+
*out_object = (ns_TSDateNano){0};
989+
#endif
971990
if ((offset = schema_obx_h_fb_field_offset(vs, vt, 0))) {
972991
out_object->id = flatbuffers_uint64_read_from_pe(table + offset);
973992
}
@@ -1062,7 +1081,6 @@ static void* schema_obx_h_get_object(OBX_box* box, obx_id id, void* (*from_flatb
10621081
return result;
10631082
}
10641083

1065-
static flatbuffers_voffset_t schema_obx_h_fb_field_offset(flatbuffers_voffset_t vs,
1066-
const flatbuffers_voffset_t* vt, size_t field) {
1084+
static flatbuffers_voffset_t schema_obx_h_fb_field_offset(flatbuffers_voffset_t vs, const flatbuffers_voffset_t* vt, size_t field) {
10671085
return (vs < sizeof(vt[0]) * (field + 3)) ? 0 : __flatbuffers_voffset_read_from_pe(vt + field + 2);
10681086
}

0 commit comments

Comments
 (0)