From 579301290fa12f6d54af8d840e8740c8aaefe954 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Fri, 17 Jan 2014 00:20:46 -0800 Subject: [PATCH] Separate useful CYPoolCode from CydgetMemoryParse. --- Library.cpp | 31 +++++++++++++++++++------------ Pooling.hpp | 12 ++++++++++++ cycript.hpp | 2 ++ 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/Library.cpp b/Library.cpp index f79711b..28f9395 100644 --- a/Library.cpp +++ b/Library.cpp @@ -191,31 +191,38 @@ double CYCastDouble(const char *value) { return CYCastDouble(value, strlen(value)); } -extern "C" bool CydgetMemoryParse(const uint16_t **data, size_t *size) { +CYUTF8String CYPoolCode(CYPool &pool, CYUTF8String code) { CYLocalPool local; - - CYUTF8String utf8(CYPoolUTF8String(local, CYUTF16String(*data, *size))); - CYStream stream(utf8.data, utf8.data + utf8.size); + CYStream stream(code.data, code.data + code.size); CYDriver driver(stream); cy::parser parser(driver); - if (parser.parse() != 0 || !driver.errors_.empty()) { - *data = NULL; - *size = 0; - return false; - } + _assert(parser.parse() == 0); + _assert(driver.errors_.empty()); CYOptions options; CYContext context(options); driver.program_->Replace(context); - std::ostringstream str; + + std::ostringstream &str(pool.object()); CYOutput out(str, options); out << *driver.program_; - std::string code(str.str()); + return str.str().c_str(); +} +extern "C" bool CydgetMemoryParse(const uint16_t **data, size_t *size) { CYPool pool; - CYUTF16String utf16(CYPoolUTF16String(pool, CYUTF8String(code.c_str(), code.size()))); + CYUTF8String utf8(CYPoolUTF8String(pool, CYUTF16String(*data, *size))); + try { + utf8 = CYPoolCode(pool, utf8); + } catch (const CYException &) { + *data = NULL; + *size = 0; + return false; + } + + CYUTF16String utf16(CYPoolUTF16String(pool, CYUTF8String(utf8.data, utf8.size))); size_t bytes(utf16.size * sizeof(uint16_t)); uint16_t *copy(reinterpret_cast(malloc(bytes))); memcpy(copy, utf16.data, bytes); diff --git a/Pooling.hpp b/Pooling.hpp index 24c7cc2..e3116d9 100644 --- a/Pooling.hpp +++ b/Pooling.hpp @@ -62,6 +62,11 @@ class CYPool { return (size + 7) & ~0x3; } + template + static void delete_(void *data) { + reinterpret_cast(data)->~Type_(); + } + CYPool(const CYPool &); public: @@ -182,6 +187,13 @@ class CYPool { } void atexit(void (*code)(void *), void *data = NULL); + + template + Type_ &object() { + Type_ *value(new(*this) Type_()); + atexit(&delete_, value); + return *value; + } }; _finline void *operator new(size_t size, CYPool &pool) { diff --git a/cycript.hpp b/cycript.hpp index 5498b59..e65721a 100644 --- a/cycript.hpp +++ b/cycript.hpp @@ -51,4 +51,6 @@ bool CYSendAll(int socket, const Type_ *data, size_t size) { CYPool &CYGetGlobalPool(); +CYUTF8String CYPoolCode(CYPool &pool, CYUTF8String code); + #endif/*CYCRIPT_HPP*/ -- 2.47.2