This repository was archived by the owner on Nov 12, 2022. It is now read-only.
This repository was archived by the owner on Nov 12, 2022. It is now read-only.
String conversion should use linear strings #514
Open
Description
diff --git a/src/conversions.rs b/src/conversions.rs
index a3b47a4..86b38e2 100644
--- a/src/conversions.rs
+++ b/src/conversions.rs
@@ -31,8 +31,9 @@ use error::throw_type_error;
use glue::RUST_JS_NumberValue;
use jsapi::AssertSameCompartment;
use jsapi::{ForOfIterator, ForOfIterator_NonIterableBehavior};
-use jsapi::{Heap, JS_DefineElement, JS_GetLatin1StringCharsAndLength};
+use jsapi::{Heap, JS_DefineElement, JS_EnsureLinearString, JS_GetLatin1StringCharsAndLength};
use jsapi::{JS_GetTwoByteStringCharsAndLength, JS_NewArrayObject1};
+use jsapi::{JS_GetLatin1LinearStringChars, JS_GetTwoByteLinearStringChars};
use jsapi::{JS_NewUCStringCopyN, JSPROP_ENUMERATE, JS_StringHasLatin1Chars};
use jsapi::{JSContext, JSObject, JSString, RootedObject, RootedValue};
use jsval::{BooleanValue, Int32Value, NullValue, UInt32Value, UndefinedValue};
@@ -443,7 +444,12 @@ pub unsafe fn latin1_to_string(cx: *mut JSContext, s: *mut JSString) -> String {
assert!(JS_StringHasLatin1Chars(s));
let mut length = 0;
- let chars = JS_GetLatin1StringCharsAndLength(cx, ptr::null(), s, &mut length);
+ let _ = JS_GetLatin1StringCharsAndLength(cx, ptr::null(), s, &mut length);
+
+ let s = JS_EnsureLinearString(cx, s);
+ assert!(!s.is_null());
+
+ let chars = JS_GetLatin1LinearStringChars(ptr::null(), s);
assert!(!chars.is_null());
let chars = slice::from_raw_parts(chars, length as usize);
@@ -459,7 +465,12 @@ pub unsafe fn jsstr_to_string(cx: *mut JSContext, jsstr: *mut JSString) -> Strin
}
let mut length = 0;
- let chars = JS_GetTwoByteStringCharsAndLength(cx, ptr::null(), jsstr, &mut length);
+ let _ = JS_GetTwoByteStringCharsAndLength(cx, ptr::null(), jsstr, &mut length);
+
+ let jsstr = JS_EnsureLinearString(cx, jsstr);
+ assert!(!jsstr.is_null());
+
+ let chars = JS_GetTwoByteLinearStringChars(ptr::null(), jsstr);
assert!(!chars.is_null());
let char_vec = slice::from_raw_parts(chars, length as usize);
String::from_utf16_lossy(char_vec)
Metadata
Metadata
Assignees
Labels
No labels