@@ -34,18 +34,25 @@ static bool array_valueOf(JSContext *cx, unsigned argc, JS::Value *vp) {
34
34
bool isSharedMemory;
35
35
JS::AutoCheckCannotGC autoNoGC (cx);
36
36
uint8_t *data = JS::GetArrayBufferData (rootedArrayBuffer, &isSharedMemory, autoNoGC);
37
-
38
- const size_t STRING_LENGTH = byteLength*2 - 1 ;
37
+ size_t numberOfDigits = 0 ;
38
+ for (size_t i = 0 ; i < byteLength; i++) {
39
+ numberOfDigits += data[i] < 10 ? 1 : data[i] < 100 ? 2 : 3 ;
40
+ }
41
+ const size_t STRING_LENGTH = byteLength + numberOfDigits;
39
42
JS::Latin1Char* buffer = (JS::Latin1Char *)malloc (sizeof (JS::Latin1Char) * STRING_LENGTH);
40
-
41
- buffer[0 ] = data[0 ];
42
- for (Py_ssize_t index = 1 ; index < byteLength; index++) {
43
- buffer[index*2 - 1 ] = ' ,' ;
44
- buffer[index*2 ] = data[index];
43
+
44
+ size_t charIndex = 0 ;
45
+ sprintf ((char *)&buffer[charIndex], " %d" , data[0 ]);
46
+ charIndex += data[0 ] < 10 ? 1 : data[0 ] < 100 ? 2 : 3 ;
47
+ for (size_t dataIndex = 1 ; dataIndex < byteLength; dataIndex++) {
48
+ buffer[charIndex] = ' ,' ;
49
+ charIndex++;
50
+ sprintf ((char *)&buffer[charIndex], " %d" , data[dataIndex]);
51
+ charIndex += data[dataIndex] < 10 ? 1 : data[dataIndex] < 100 ? 2 : 3 ;
45
52
}
46
53
47
54
JS::UniqueLatin1Chars str (buffer);
48
- args.rval ().setString (JS_NewLatin1String (cx, std::move (str), STRING_LENGTH));
55
+ args.rval ().setString (JS_NewLatin1String (cx, std::move (str), STRING_LENGTH - 1 )); // don't include null byte
49
56
return true ;
50
57
}
51
58
0 commit comments