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