@@ -239,6 +239,20 @@ def generateClrEventPipeWriteEventsImpl(
239239
240240
241241def generateWriteEventBody (template , providerName , eventName , runtimeFlavor ):
242+ def winTypeToFixedWidthType (t ):
243+ return {'win:Int8' : 'int8_t' ,
244+ 'win:UInt8' : 'uint8_t' ,
245+ 'win:Int16' : 'int16_t' ,
246+ 'win:UInt16' : 'uint16_t' ,
247+ 'win:Int32' : 'int32_t' ,
248+ 'win:UInt32' : 'uint32_t' ,
249+ 'win:Int64' : 'int64_t' ,
250+ 'win:UInt64' : 'uint64_t' ,
251+ 'win:Pointer' : 'uintptr_t' ,
252+ 'win:AnsiString' : 'UTF8String' ,
253+ 'win:UnicodeString' : 'UTF16String'
254+ }[t ]
255+
242256 fnSig = template .signature
243257 pack_list = []
244258
@@ -267,9 +281,33 @@ def generateWriteEventBody(template, providerName, eventName, runtimeFlavor):
267281 if template .name in specialCaseSizes and paramName in specialCaseSizes [template .name ]:
268282 size = "(int)(%s)" % specialCaseSizes [template .name ][paramName ]
269283 if runtimeFlavor .mono :
284+ pack_list .append ("#if BIGENDIAN" )
285+ pack_list .append (" const uint8_t *valuePtr = %s;" % paramName )
286+ pack_list .append (" for (uint32_t i = 0; i < %s; ++i) {" % template .structs [paramName ])
287+ types = [winTypeToFixedWidthType (t ) for t in template .structTypes [paramName ]]
288+ for t in set (types ) - {"UTF8String" , "UTF16String" }:
289+ pack_list .append (" %(type)s value_%(type)s;" % {'type' : t })
290+ if "UTF8String" in types or "UTF16String" in types :
291+ pack_list .append (" size_t value_len;" )
292+ for t in types :
293+ if t == "UTF8String" :
294+ pack_list .append (" value_len = strlen((const char *)valuePtr);" )
295+ pack_list .append (" success &= write_buffer_string_utf8_t((const ep_char8_t *)valuePtr, value_len, &buffer, &offset, &size, &fixedBuffer);" )
296+ pack_list .append (" valuePtr += value_len + 1;" )
297+ elif t == "UTF16String" :
298+ pack_list .append (" value_len = strlen((const char *)valuePtr);" )
299+ pack_list .append (" success &= write_buffer_string_utf8_to_utf16_t((const ep_char8_t *)valuePtr, value_len, &buffer, &offset, &size, &fixedBuffer);" )
300+ pack_list .append (" valuePtr += value_len + 1;" )
301+ else :
302+ pack_list .append (" memcpy (&value_%(type)s, valuePtr, sizeof (value_%(type)s));" % {'type' : t })
303+ pack_list .append (" valuePtr += sizeof (%s);" % t )
304+ pack_list .append (" success &= write_buffer_%(type)s (value_%(type)s, &buffer, &offset, &size, &fixedBuffer);" % {'type' : t })
305+ pack_list .append (" }" )
306+ pack_list .append ("#else" )
270307 pack_list .append (
271308 " success &= write_buffer((const uint8_t *)%s, %s, &buffer, &offset, &size, &fixedBuffer);" %
272309 (paramName , size ))
310+ pack_list .append ("#endif // BIGENDIAN" )
273311 emittedWriteToBuffer = True
274312 elif runtimeFlavor .coreclr :
275313 pack_list .append (
@@ -283,9 +321,16 @@ def generateWriteEventBody(template, providerName, eventName, runtimeFlavor):
283321 if template .name in specialCaseSizes and paramName in specialCaseSizes [template .name ]:
284322 size = "(int)(%s)" % specialCaseSizes [template .name ][paramName ]
285323 if runtimeFlavor .mono :
324+ t = winTypeToFixedWidthType (parameter .winType )
325+ pack_list .append ("#if BIGENDIAN" )
326+ pack_list .append (" for (uint32_t i = 0; i < %s; ++i) {" % template .arrays [paramName ])
327+ pack_list .append (" success &= write_buffer_%(type)s (%(name)s[i], &buffer, &offset, &size, &fixedBuffer);" % {'name' : paramName , 'type' : t })
328+ pack_list .append (" }" )
329+ pack_list .append ("#else" )
286330 pack_list .append (
287331 " success &= write_buffer((const uint8_t *)%s, %s, &buffer, &offset, &size, &fixedBuffer);" %
288332 (paramName , size ))
333+ pack_list .append ("#endif // BIGENDIAN" )
289334 emittedWriteToBuffer = True
290335 elif runtimeFlavor .coreclr :
291336 pack_list .append (
@@ -304,13 +349,13 @@ def generateWriteEventBody(template, providerName, eventName, runtimeFlavor):
304349 emittedWriteToBuffer = True
305350 elif parameter .winType == "win:AnsiString" and runtimeFlavor .mono :
306351 pack_list .append (
307- " success &= write_buffer_string_utf8_t(%s, &buffer, &offset, &size, &fixedBuffer);" %
308- (parameter .name ,))
352+ " success &= write_buffer_string_utf8_t(%s, strlen((const char *)%s), &buffer, &offset, &size, &fixedBuffer);" %
353+ (parameter .name , parameter . name ))
309354 emittedWriteToBuffer = True
310355 elif parameter .winType == "win:UnicodeString" and runtimeFlavor .mono :
311356 pack_list .append (
312- " success &= write_buffer_string_utf8_to_utf16_t(%s, &buffer, &offset, &size, &fixedBuffer);" %
313- (parameter .name ,))
357+ " success &= write_buffer_string_utf8_to_utf16_t(%s, strlen((const char *)%s), &buffer, &offset, &size, &fixedBuffer);" %
358+ (parameter .name , parameter . name ))
314359 emittedWriteToBuffer = True
315360 elif parameter .winType == "win:UInt8" and runtimeFlavor .mono :
316361 pack_list .append (
@@ -558,6 +603,7 @@ def getMonoEventPipeHelperFileImplPrefix():
558603bool
559604write_buffer_string_utf8_to_utf16_t (
560605 const ep_char8_t *value,
606+ size_t value_len,
561607 uint8_t **buffer,
562608 size_t *offset,
563609 size_t *size,
@@ -566,6 +612,7 @@ def getMonoEventPipeHelperFileImplPrefix():
566612bool
567613write_buffer_string_utf8_t (
568614 const ep_char8_t *value,
615+ size_t value_len,
569616 uint8_t **buffer,
570617 size_t *offset,
571618 size_t *size,
@@ -640,6 +687,7 @@ def getMonoEventPipeHelperFileImplPrefix():
640687bool
641688write_buffer_string_utf8_to_utf16_t (
642689 const ep_char8_t *value,
690+ size_t value_len,
643691 uint8_t **buffer,
644692 size_t *offset,
645693 size_t *size,
@@ -653,12 +701,12 @@ def getMonoEventPipeHelperFileImplPrefix():
653701 custom_alloc_data.buffer_size = *size - *offset;
654702 custom_alloc_data.req_buffer_size = 0;
655703
656- if (!g_utf8_to_utf16_custom_alloc (value, -1 , NULL, NULL, g_fixed_buffer_custom_allocator, &custom_alloc_data, NULL)) {
704+ if (!g_utf8_to_utf16le_custom_alloc (value, (glong)value_len , NULL, NULL, g_fixed_buffer_custom_allocator, &custom_alloc_data, NULL)) {
657705 ep_raise_error_if_nok (resize_buffer (buffer, size, *offset, *size + custom_alloc_data.req_buffer_size, fixed_buffer));
658706 custom_alloc_data.buffer = *buffer + *offset;
659707 custom_alloc_data.buffer_size = *size - *offset;
660708 custom_alloc_data.req_buffer_size = 0;
661- ep_raise_error_if_nok (g_utf8_to_utf16_custom_alloc (value, -1 , NULL, NULL, g_fixed_buffer_custom_allocator, &custom_alloc_data, NULL) != NULL);
709+ ep_raise_error_if_nok (g_utf8_to_utf16le_custom_alloc (value, (glong)value_len , NULL, NULL, g_fixed_buffer_custom_allocator, &custom_alloc_data, NULL) != NULL);
662710 }
663711
664712 *offset += custom_alloc_data.req_buffer_size;
@@ -671,6 +719,7 @@ def getMonoEventPipeHelperFileImplPrefix():
671719bool
672720write_buffer_string_utf8_t (
673721 const ep_char8_t *value,
722+ size_t value_len,
674723 uint8_t **buffer,
675724 size_t *offset,
676725 size_t *size,
@@ -679,10 +728,6 @@ def getMonoEventPipeHelperFileImplPrefix():
679728 if (!value)
680729 return true;
681730
682- size_t value_len = 0;
683- while (value [value_len])
684- value_len++;
685-
686731 return write_buffer ((const uint8_t *)value, (value_len + 1) * sizeof(*value), buffer, offset, size, fixed_buffer);
687732}
688733
@@ -802,6 +847,7 @@ def getMonoEventPipeImplFilePrefix():
802847bool
803848write_buffer_string_utf8_t (
804849 const ep_char8_t *value,
850+ size_t value_len,
805851 uint8_t **buffer,
806852 size_t *offset,
807853 size_t *size,
@@ -810,6 +856,7 @@ def getMonoEventPipeImplFilePrefix():
810856bool
811857write_buffer_string_utf8_to_utf16_t (
812858 const ep_char8_t *value,
859+ size_t value_len,
813860 uint8_t **buffer,
814861 size_t *offset,
815862 size_t *size,
@@ -851,6 +898,7 @@ def getMonoEventPipeImplFilePrefix():
851898 size_t *size,
852899 bool *fixed_buffer)
853900{
901+ value = ep_rt_val_uint16_t (value);
854902 return write_buffer ((const uint8_t *)&value, sizeof (uint16_t), buffer, offset, size, fixed_buffer);
855903}
856904
@@ -864,6 +912,7 @@ def getMonoEventPipeImplFilePrefix():
864912 size_t *size,
865913 bool *fixed_buffer)
866914{
915+ value = ep_rt_val_uint32_t (value);
867916 return write_buffer ((const uint8_t *)&value, sizeof (uint32_t), buffer, offset, size, fixed_buffer);
868917}
869918
@@ -877,6 +926,7 @@ def getMonoEventPipeImplFilePrefix():
877926 size_t *size,
878927 bool *fixed_buffer)
879928{
929+ value = ep_rt_val_int32_t (value);
880930 return write_buffer ((const uint8_t *)&value, sizeof (int32_t), buffer, offset, size, fixed_buffer);
881931}
882932
@@ -890,6 +940,7 @@ def getMonoEventPipeImplFilePrefix():
890940 size_t *size,
891941 bool *fixed_buffer)
892942{
943+ value = ep_rt_val_uint64_t (value);
893944 return write_buffer ((const uint8_t *)&value, sizeof (uint64_t), buffer, offset, size, fixed_buffer);
894945}
895946
@@ -903,6 +954,7 @@ def getMonoEventPipeImplFilePrefix():
903954 size_t *size,
904955 bool *fixed_buffer)
905956{
957+ value = ep_rt_val_int64_t (value);
906958 return write_buffer ((const uint8_t *)&value, sizeof (int64_t), buffer, offset, size, fixed_buffer);
907959}
908960
@@ -916,6 +968,12 @@ def getMonoEventPipeImplFilePrefix():
916968 size_t *size,
917969 bool *fixed_buffer)
918970{
971+ #if BIGENDIAN
972+ uint64_t value_as_uint64_t;
973+ memcpy (&value_as_uint64_t, &value, sizeof (uint64_t));
974+ value_as_uint64_t = ep_rt_val_uint64_t (value_as_uint64_t);
975+ memcpy (&value, &value_as_uint64_t, sizeof (uint64_t));
976+ #endif
919977 return write_buffer ((const uint8_t *)&value, sizeof (double), buffer, offset, size, fixed_buffer);
920978}
921979
@@ -942,6 +1000,7 @@ def getMonoEventPipeImplFilePrefix():
9421000 size_t *size,
9431001 bool *fixed_buffer)
9441002{
1003+ value = ep_rt_val_uintptr_t (value);
9451004 return write_buffer ((const uint8_t *)&value, sizeof (uintptr_t), buffer, offset, size, fixed_buffer);
9461005}
9471006
0 commit comments