MCPcopy Create free account
hub / github.com/defold/defold / DoSaveMessage

Function DoSaveMessage

engine/ddf/src/ddf/ddf_save.cpp:30–204  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

28 }
29
30 Result DoSaveMessage(const void* message_, const Descriptor* desc, void* context, SaveFunction save_function)
31 {
32 OutputStream output_stream(save_function, context);
33 const uint8_t* message = (const uint8_t*) message_;
34
35 for (int i = 0; i < desc->m_FieldCount; ++i)
36 {
37 bool write_result;
38 FieldDescriptor* field_desc = &desc->m_Fields[i];
39 Type type = (Type) field_desc->m_Type;
40
41 if (field_desc->m_OneOfIndex != DDF_NO_ONE_OF_INDEX)
42 {
43 // Resolve the oneof member for this field
44 assert(field_desc->m_OneOfIndex > 0);
45 uint32_t oneof_offset = desc->m_OneOfDataOffsets[field_desc->m_OneOfIndex-1];
46 uint8_t oneof_member = message[oneof_offset];
47 if (oneof_member != field_desc->m_Number)
48 {
49 continue;
50 }
51 }
52
53 #define DDF_SAVEMESSAGE_CASE(t, wt, func) \
54 write_result = output_stream.WriteTag(field_desc->m_Number, wt) && \
55 output_stream.func(*((t*) data)); \
56 if (!write_result)\
57 return RESULT_IO_ERROR; \
58 break;
59
60 int element_size = 0;
61 if ( field_desc->m_Type == TYPE_MESSAGE )
62 {
63 element_size = field_desc->m_MessageDescriptor->m_Size;
64 }
65 else if ( field_desc->m_Type == TYPE_STRING )
66 {
67 element_size = sizeof(const char*);
68 }
69 else if ( field_desc->m_Type == TYPE_BYTES )
70 {
71 element_size = sizeof(RepeatedField);
72 }
73 else
74 {
75 element_size = ScalarTypeSize(type);
76 }
77
78 uint32_t count = 1;
79 const uint8_t* data_start = &message[field_desc->m_Offset];
80 if (field_desc->m_Label == LABEL_REPEATED)
81 {
82 RepeatedField* repeated = (RepeatedField*) data_start;
83 count = repeated->m_ArrayCount;
84 data_start = (const uint8_t *) repeated->m_Array;
85 }
86
87 for (uint32_t j = 0; j < count; ++j)

Callers 1

SaveMessageFunction · 0.85

Calls 5

ScalarTypeSizeFunction · 0.85
WriteTagMethod · 0.80
WriteVarInt32Method · 0.80
WriteMethod · 0.80
assertFunction · 0.50

Tested by

no test coverage detected