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

Method ReadMessageField

engine/ddf/src/ddf/ddf_message.cpp:143–194  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

141 }
142
143 Result Message::ReadMessageField(LoadContext* load_context,
144 WireType wire_type,
145 const FieldDescriptor* field,
146 InputBuffer* input_buffer)
147 {
148 assert(field->m_MessageDescriptor);
149
150 if (wire_type != WIRETYPE_LENGTH_DELIMITED)
151 {
152 return RESULT_WIRE_FORMAT_ERROR;
153 }
154
155 uint32_t length;
156 if (!input_buffer->ReadVarInt32(&length))
157 {
158 return RESULT_WIRE_FORMAT_ERROR;
159 }
160
161 char* msg_buf = 0;
162 if (field->m_Label == LABEL_REPEATED)
163 {
164 msg_buf = (char*) AddMessage(field);
165 }
166 else
167 {
168 msg_buf = GetBuffer(field->m_Offset);
169
170 if (!field->m_FullyDefinedType)
171 {
172 uint32_t dynamic_offset = load_context->NextDynamicTypeOffset();
173 void* dynamic_ptr = load_context->GetDynamicTypePointer(dynamic_offset);
174
175 if (!m_DryRun)
176 {
177 // Resolve the pointer in the dynamic area
178 memcpy(msg_buf, &dynamic_ptr, sizeof(uintptr_t));
179 }
180
181 msg_buf = (char*) dynamic_ptr;
182 }
183 }
184
185 Message message(field->m_MessageDescriptor, (char*) msg_buf, field->m_MessageDescriptor->m_Size, m_DryRun);
186
187 InputBuffer sub_buffer;
188 if (!input_buffer->SubBuffer(length, &sub_buffer))
189 {
190 return RESULT_WIRE_FORMAT_ERROR;
191 }
192
193 return DoLoadMessage(load_context, &sub_buffer, field->m_MessageDescriptor, &message);
194 }
195
196 Message Message::SubMessage(const FieldDescriptor* field)
197 {

Callers

nothing calls this directly

Calls 7

DoLoadMessageFunction · 0.85
ReadVarInt32Method · 0.80
NextDynamicTypeOffsetMethod · 0.80
GetDynamicTypePointerMethod · 0.80
SubBufferMethod · 0.80
assertFunction · 0.50
GetBufferFunction · 0.50

Tested by

no test coverage detected