X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/c15969fd0a6280c60d2f35876b5343004fed2b11..5963ec5bc27cc5ce1ff3e6a60d0776de87c4f250:/Library.cpp diff --git a/Library.cpp b/Library.cpp index 0db5f42..1259aeb 100644 --- a/Library.cpp +++ b/Library.cpp @@ -56,9 +56,7 @@ _finline size_t iconv_(size_t (*iconv)(iconv_t, Type_, size_t *, char **, size_t #define UCS_2_INTERNAL "UCS-2-INTERNAL" #endif -CYUTF8String CYPoolUTF8String(apr_pool_t *pool, CYUTF16String utf16) { - _assert(pool != NULL); - +CYUTF8String CYPoolUTF8String(CYPool &pool, CYUTF16String utf16) { const char *in(reinterpret_cast(utf16.data)); iconv_t conversion(_syscall(iconv_open("UTF-8", UCS_2_INTERNAL))); @@ -79,9 +77,7 @@ CYUTF8String CYPoolUTF8String(apr_pool_t *pool, CYUTF16String utf16) { return utf8; } -CYUTF16String CYPoolUTF16String(apr_pool_t *pool, CYUTF8String utf8) { - _assert(pool != NULL); - +CYUTF16String CYPoolUTF16String(CYPool &pool, CYUTF8String utf8) { const char *in(utf8.data); iconv_t conversion(_syscall(iconv_open(UCS_2_INTERNAL, "UTF-8"))); @@ -243,7 +239,7 @@ void CYArrayPush(JSContextRef context, JSObjectRef array, JSValueRef value) { CYThrow(context, exception); } -extern "C" void CydgetPoolParse(apr_pool_t *remote, const uint16_t **data, size_t *size) { +extern "C" void CydgetMemoryParse(const uint16_t **data, size_t *size) { CYLocalPool local; CYUTF8String utf8(CYPoolUTF8String(local, CYUTF16String(*data, *size))); @@ -262,28 +258,20 @@ extern "C" void CydgetPoolParse(apr_pool_t *remote, const uint16_t **data, size_ out << *driver.program_; std::string code(str.str()); - CYUTF16String utf16(CYPoolUTF16String(remote, CYUTF8String(code.c_str(), code.size()))); - - *data = utf16.data; - *size = utf16.size; -} - -static apr_pool_t *Pool_; - -static bool initialized_; + CYPool pool; + CYUTF16String utf16(CYPoolUTF16String(pool, CYUTF8String(code.c_str(), code.size()))); -void CYInitializeStatic() { - if (!initialized_) - initialized_ = true; - else return; + size_t bytes(utf16.size * sizeof(uint16_t)); + uint16_t *copy(reinterpret_cast(malloc(bytes))); + memcpy(copy, utf16.data, bytes); - _aprcall(apr_initialize()); - _aprcall(apr_pool_create(&Pool_, NULL)); + *data = copy; + *size = utf16.size; } -apr_pool_t *CYGetGlobalPool() { - CYInitializeStatic(); - return Pool_; +CYPool &CYGetGlobalPool() { + static CYPool pool; + return pool; } void CYThrow(const char *format, ...) { @@ -294,17 +282,24 @@ void CYThrow(const char *format, ...) { va_end(args); } -const char *CYPoolError::PoolCString(apr_pool_t *pool) const { - return apr_pstrdup(pool, message_); +const char *CYPoolError::PoolCString(CYPool &pool) const { + return pool.strdup(message_); +} + +CYPoolError::CYPoolError(const CYPoolError &rhs) : + message_(pool_.strdup(rhs.message_)) +{ } CYPoolError::CYPoolError(const char *format, ...) { va_list args; va_start(args, format); - message_ = apr_pvsprintf(pool_, format, args); + // XXX: there might be a beter way to think about this + message_ = pool_.vsprintf(64, format, args); va_end(args); } CYPoolError::CYPoolError(const char *format, va_list args) { - message_ = apr_pvsprintf(pool_, format, args); + // XXX: there might be a beter way to think about this + message_ = pool_.vsprintf(64, format, args); }