22#define SERIALIZERS_H
33
44extern " C" {
5- #include " Zend/zend_string.h"
65#include " Zend/zend_exceptions.h"
76}
87#include " classes/DataDecodeException.h"
@@ -184,31 +183,27 @@ static inline bool readSignedVarInt(unsigned char* bytes, size_t used, size_t& o
184183 return true ;
185184}
186185
187-
188- static inline void extendBuffer (zend_string*& buffer, size_t offset, size_t usedBytes) {
186+ static inline void extendBuffer (unsigned char *& buffer, size_t & length, size_t offset, size_t usedBytes) {
189187 size_t requiredSize = offset + usedBytes;
190- if (ZSTR_LEN (buffer) < requiredSize) {
191- size_t doubleSize = ZSTR_LEN (buffer) * 2 ;
192- buffer = zend_string_realloc (buffer, doubleSize > requiredSize ? doubleSize : requiredSize, 0 );
193- ZSTR_VAL (buffer)[ZSTR_LEN (buffer)] = ' \0 ' ; // make sure null terminator is always set, to stop sprintf reading out-of-bounds
194- }
195- else {
196- buffer = zend_string_separate (buffer, 0 );
188+ if (length < requiredSize) {
189+ size_t doubleSize = length * 2 ;
190+ length = doubleSize > requiredSize ? doubleSize : requiredSize;
191+ buffer = reinterpret_cast <unsigned char *>(erealloc (buffer, length));
197192 }
198193}
199194
200195template <typename TValue>
201- static void writeByte (zend_string *& buffer, size_t & offset, TValue value) {
202- extendBuffer (buffer, offset, sizeof (TValue));
196+ static void writeByte (unsigned char *& buffer, size_t & length , size_t & offset, TValue value) {
197+ extendBuffer (buffer, length, offset, sizeof (TValue));
203198
204- ZSTR_VAL ( buffer) [offset] = *reinterpret_cast <char *>(&value);
199+ buffer[offset] = *reinterpret_cast <char *>(&value);
205200
206201 offset += sizeof (TValue);
207202}
208203
209204template <typename TValue, ByteOrder byteOrder>
210- static void writeFixedSizeType (zend_string *& buffer, size_t & offset, TValue value) {
211- extendBuffer (buffer, offset, sizeof (TValue));
205+ static void writeFixedSizeType (unsigned char *& buffer, size_t & length , size_t & offset, TValue value) {
206+ extendBuffer (buffer, length, offset, sizeof (TValue));
212207
213208 Flipper<TValue> flipper;
214209 flipper.value = value;
@@ -217,15 +212,15 @@ static void writeFixedSizeType(zend_string*& buffer, size_t& offset, TValue valu
217212 std::reverse (std::begin (flipper.bytes ), std::end (flipper.bytes ));
218213 }
219214
220- memcpy (&ZSTR_VAL ( buffer) [offset], flipper.bytes , sizeof (flipper.bytes ));
215+ memcpy (&buffer[offset], flipper.bytes , sizeof (flipper.bytes ));
221216
222217 offset += sizeof (TValue);
223218}
224219
225220template <typename TValue, ByteOrder byteOrder>
226- static void writeFixedSizeTypeArray (zend_string *& buffer, size_t & offset, std::vector<TValue>& valueArray) {
221+ static void writeFixedSizeTypeArray (unsigned char *& buffer, size_t & length , size_t & offset, std::vector<TValue>& valueArray) {
227222 size_t arraySizeBytes = valueArray.size () * sizeof (TValue);
228- extendBuffer (buffer, offset, arraySizeBytes);
223+ extendBuffer (buffer, length, offset, arraySizeBytes);
229224
230225 if (byteOrder != ByteOrder::Native) {
231226 Flipper<TValue> flipper;
@@ -237,41 +232,41 @@ static void writeFixedSizeTypeArray(zend_string*& buffer, size_t& offset, std::v
237232 }
238233 }
239234
240- memcpy (&ZSTR_VAL ( buffer) [offset], reinterpret_cast <char *>(valueArray.data ()), arraySizeBytes);
235+ memcpy (&buffer[offset], reinterpret_cast <char *>(valueArray.data ()), arraySizeBytes);
241236 offset += arraySizeBytes;
242237}
243238
244239template <typename TValue>
245- using writeComplexTypeFunc_t = void (*) (zend_string *& buffer, size_t & offset, TValue value);
240+ using writeComplexTypeFunc_t = void (*) (unsigned char *& buffer, size_t & length , size_t & offset, TValue value);
246241
247242template <typename TValue, writeComplexTypeFunc_t<TValue> writeNaiveTypeFunc>
248- static void writeComplexTypeArray (zend_string *& buffer, size_t & offset, std::vector<TValue>& valueArray) {
243+ static void writeComplexTypeArray (unsigned char *& buffer, size_t & length , size_t & offset, std::vector<TValue>& valueArray) {
249244 for (size_t i = 0 ; i < valueArray.size (); i++) {
250- writeNaiveTypeFunc (buffer, offset, valueArray[i]);
245+ writeNaiveTypeFunc (buffer, length, offset, valueArray[i]);
251246 }
252247}
253248
254249template <typename TValue, ByteOrder byteOrder>
255- static void writeInt24 (zend_string *& buffer, size_t & offset, TValue value) {
250+ static void writeInt24 (unsigned char *& buffer, size_t & length , size_t & offset, TValue value) {
256251 const size_t SIZE = 3 ;
257- extendBuffer (buffer, offset, SIZE);
252+ extendBuffer (buffer, length, offset, SIZE);
258253
259254 if (byteOrder == ByteOrder::LittleEndian) {
260- ZSTR_VAL ( buffer) [offset] = value & 0xff ;
261- ZSTR_VAL ( buffer) [offset + 1 ] = (value >> 8 ) & 0xff ;
262- ZSTR_VAL ( buffer) [offset + 2 ] = (value >> 16 ) & 0xff ;
255+ buffer[offset] = value & 0xff ;
256+ buffer[offset + 1 ] = (value >> 8 ) & 0xff ;
257+ buffer[offset + 2 ] = (value >> 16 ) & 0xff ;
263258 }
264259 else {
265- ZSTR_VAL ( buffer) [offset] = (value >> 16 ) & 0xff ;
266- ZSTR_VAL ( buffer) [offset + 1 ] = (value >> 8 ) & 0xff ;
267- ZSTR_VAL ( buffer) [offset + 2 ] = value & 0xff ;
260+ buffer[offset] = (value >> 16 ) & 0xff ;
261+ buffer[offset + 1 ] = (value >> 8 ) & 0xff ;
262+ buffer[offset + 2 ] = value & 0xff ;
268263 }
269264
270265 offset += SIZE;
271266}
272267
273268template <typename TValue>
274- static inline void writeUnsignedVarInt (zend_string *& buffer, size_t & offset, TValue value) {
269+ static inline void writeUnsignedVarInt (unsigned char *& buffer, size_t & length , size_t & offset, TValue value) {
275270 const auto TYPE_BITS = sizeof (TValue) * CHAR_BIT;
276271 char result[VarIntConstants::MAX_BYTES<TYPE_BITS>];
277272
@@ -286,8 +281,8 @@ static inline void writeUnsignedVarInt(zend_string*& buffer, size_t& offset, TVa
286281 result[i] = nextByte;
287282
288283 auto usedBytes = i + 1 ;
289- extendBuffer (buffer, offset, usedBytes);
290- memcpy (&ZSTR_VAL ( buffer) [offset], &result[0 ], usedBytes);
284+ extendBuffer (buffer, length, offset, usedBytes);
285+ memcpy (&buffer[offset], &result[0 ], usedBytes);
291286 offset += usedBytes;
292287
293288 return ;
@@ -301,14 +296,14 @@ static inline void writeUnsignedVarInt(zend_string*& buffer, size_t& offset, TVa
301296}
302297
303298template <typename TUnsignedType, typename TSignedType>
304- static inline void writeSignedVarInt (zend_string *& buffer, size_t & offset, TSignedType value) {
299+ static inline void writeSignedVarInt (unsigned char *& buffer, size_t & length , size_t & offset, TSignedType value) {
305300 TUnsignedType mask = 0 ;
306301 if (value < 0 ) {
307302 // we don't know the type of TUnsignedType here, can't use ~0 directly (the compiler will optimise this anyway)
308303 mask = ~mask;
309304 }
310305
311- writeUnsignedVarInt<TUnsignedType>(buffer, offset, (static_cast <TUnsignedType>(value) << 1 ) ^ mask);
306+ writeUnsignedVarInt<TUnsignedType>(buffer, length, offset, (static_cast <TUnsignedType>(value) << 1 ) ^ mask);
312307}
313308
314309#endif
0 commit comments