From a06663061c35a475ef947bf228512f8df92e36f0 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Fri, 8 Jan 2016 16:58:27 -0800 Subject: [PATCH] Correctly handle "high bytes" in "native" strings. --- Execute.cpp | 8 +++++--- Output.cpp | 10 +++++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Execute.cpp b/Execute.cpp index 70fce72..11b54f9 100644 --- a/Execute.cpp +++ b/Execute.cpp @@ -1005,7 +1005,8 @@ static JSValueRef CString_getProperty(JSContextRef context, JSObjectRef object, else if (!CYGetOffset(pool, context, property, offset)) return NULL; - return CYCastJSValue(context, CYJSString(CYUTF8String(&internal->value_[offset], 1))); + uint16_t value(uint8_t(internal->value_[offset])); + return CYCastJSValue(context, CYJSString(CYUTF16String(&value, 1))); } CYCatch(NULL) } static bool CString_setProperty(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef value, JSValueRef *exception) { CYTry { @@ -1018,8 +1019,9 @@ static bool CString_setProperty(JSContextRef context, JSObjectRef object, JSStri else if (!CYGetOffset(pool, context, property, offset)) return false; - const char *data(CYPoolCString(pool, context, value)); - internal->value_[offset] = *data; + auto data(CYCastUTF16String(CYJSString(context, value))); + _assert(data.size == 1); + internal->value_[offset] = data.data[0]; return true; } CYCatch(false) } diff --git a/Output.cpp b/Output.cpp index a2e3213..3daf4cf 100644 --- a/Output.cpp +++ b/Output.cpp @@ -92,6 +92,12 @@ void CYStringify(std::ostringstream &str, const char *data, size_t size, CYStrin case '\t': str << "\\t"; break; case '\v': str << "\\v"; break; + case '\a': + if (mode == CYStringifyModeNative) + str << "\\a"; + else goto simple; + break; + case '\n': if (!split) str << "\\n"; @@ -130,7 +136,7 @@ void CYStringify(std::ostringstream &str, const char *data, size_t size, CYStrin break; case '\0': - if (value[1] >= '0' && value[1] <= '9') + if (mode != CYStringifyModeNative && value[1] >= '0' && value[1] <= '9') str << "\\x00"; else str << "\\0"; @@ -139,6 +145,8 @@ void CYStringify(std::ostringstream &str, const char *data, size_t size, CYStrin default: if (next >= 0x20 && next < 0x7f) simple: str << *value; + else if (mode == CYStringifyModeNative) + str << "\\x" << std::setbase(16) << std::setw(2) << std::setfill('0') << unsigned(*value & 0xff); else { unsigned levels(1); if ((next & 0x80) != 0) -- 2.47.2