]> git.saurik.com Git - cycript.git/commitdiff
Correctly handle "high bytes" in "native" strings.
authorJay Freeman (saurik) <saurik@saurik.com>
Sat, 9 Jan 2016 00:58:27 +0000 (16:58 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Sat, 9 Jan 2016 00:58:27 +0000 (16:58 -0800)
Execute.cpp
Output.cpp

index 70fce727cdd3362a1bbc04c8bc3a25c11be0b171..11b54f97e2902d87b31dbd7f1380578a211838de 100644 (file)
@@ -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) }
 
index a2e32130d91ade2a05606bd5ed562722a92c6caa..3daf4cfa66c6218943ea7890f63e4a7caf53e4e0 100644 (file)
@@ -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)