X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/029bc65b46de676c6733fff684000c7363eda512..1560b2c8f7d30fa6b96625ae0fd30c75d4354871:/Library.cpp diff --git a/Library.cpp b/Library.cpp index 610e11b..4b7f115 100644 --- a/Library.cpp +++ b/Library.cpp @@ -1,40 +1,22 @@ -/* Cycript - Inlining/Optimizing JavaScript Compiler - * Copyright (C) 2009 Jay Freeman (saurik) +/* Cycript - Optimizing JavaScript Compiler/Runtime + * Copyright (C) 2009-2013 Jay Freeman (saurik) */ -/* Modified BSD License {{{ */ +/* GNU General Public License, Version 3 {{{ */ /* - * Redistribution and use in source and binary - * forms, with or without modification, are permitted - * provided that the following conditions are met: + * Cycript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. * - * 1. Redistributions of source code must retain the - * above copyright notice, this list of conditions - * and the following disclaimer. - * 2. Redistributions in binary form must reproduce the - * above copyright notice, this list of conditions - * and the following disclaimer in the documentation - * and/or other materials provided with the - * distribution. - * 3. The name of the author may not be used to endorse - * or promote products derived from this software - * without specific prior written permission. + * Cycript is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR - * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + * You should have received a copy of the GNU General Public License + * along with Cycript. If not, see . +**/ /* }}} */ #include @@ -43,7 +25,6 @@ #include "cycript.hpp" #include "Pooling.hpp" -#include "Context.hpp" #include @@ -60,6 +41,8 @@ #include "Error.hpp" #include "String.hpp" +#include "Execute.hpp" +#include "JavaScript.hpp" /* C Strings {{{ */ template @@ -73,7 +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) { +CYUTF8String CYPoolUTF8String(CYPool &pool, CYUTF16String utf16) { _assert(pool != NULL); const char *in(reinterpret_cast(utf16.data)); @@ -96,7 +79,7 @@ CYUTF8String CYPoolUTF8String(apr_pool_t *pool, CYUTF16String utf16) { return utf8; } -CYUTF16String CYPoolUTF16String(apr_pool_t *pool, CYUTF8String utf8) { +CYUTF16String CYPoolUTF16String(CYPool &pool, CYUTF8String utf8) { _assert(pool != NULL); const char *in(utf8.data); @@ -240,34 +223,56 @@ double CYCastDouble(const char *value) { return CYCastDouble(value, strlen(value)); } -extern "C" void CydgetPoolParse(apr_pool_t *pool, const uint16_t **data, size_t *size) { - CYDriver driver(""); - cy::parser parser(driver); +size_t CYArrayLength(JSContextRef context, JSObjectRef array) { + return CYCastDouble(context, CYGetProperty(context, array, length_s)); +} + +JSValueRef CYArrayGet(JSContextRef context, JSObjectRef array, size_t index) { + JSValueRef exception(NULL); + JSValueRef value(JSObjectGetPropertyAtIndex(context, array, index, &exception)); + CYThrow(context, exception); + return value; +} - CYUTF8String utf8(CYPoolUTF8String(pool, CYUTF16String(*data, *size))); +void CYArrayPush(JSContextRef context, JSObjectRef array, JSValueRef value) { + JSValueRef exception(NULL); + JSValueRef arguments[1]; + arguments[0] = value; + JSObjectRef Array(CYGetCachedObject(context, CYJSString("Array_prototype"))); + JSObjectCallAsFunction(context, CYCastJSObject(context, CYGetProperty(context, Array, push_s)), array, 1, arguments, &exception); + CYThrow(context, exception); +} + +extern "C" void CydgetMemoryParse(const uint16_t **data, size_t *size) { + CYLocalPool local; - driver.data_ = utf8.data; - driver.size_ = utf8.size; + CYUTF8String utf8(CYPoolUTF8String(local, CYUTF16String(*data, *size))); + CYStream stream(utf8.data, utf8.data + utf8.size); + CYDriver driver(stream); + cy::parser parser(driver); if (parser.parse() != 0 || !driver.errors_.empty()) return; CYOptions options; - CYContext context(driver.pool_, options); + CYContext context(options); driver.program_->Replace(context); std::ostringstream str; CYOutput out(str, options); out << *driver.program_; std::string code(str.str()); + CYPool pool; CYUTF16String utf16(CYPoolUTF16String(pool, CYUTF8String(code.c_str(), code.size()))); - *data = utf16.data; + size_t bytes(utf16.size * sizeof(uint16_t)); + uint16_t *copy(reinterpret_cast(malloc(bytes))); + memcpy(copy, utf16.data, bytes); + + *data = copy; *size = utf16.size; } -static apr_pool_t *Pool_; - static bool initialized_; void CYInitializeStatic() { @@ -276,12 +281,12 @@ void CYInitializeStatic() { else return; _aprcall(apr_initialize()); - _aprcall(apr_pool_create(&Pool_, NULL)); } -apr_pool_t *CYGetGlobalPool() { +CYPool &CYGetGlobalPool() { CYInitializeStatic(); - return Pool_; + static CYPool pool; + return pool; } void CYThrow(const char *format, ...) { @@ -292,17 +297,17 @@ 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 char *format, ...) { va_list args; va_start(args, format); - message_ = apr_pvsprintf(pool_, format, args); + message_ = pool_.vsprintf(format, args); va_end(args); } CYPoolError::CYPoolError(const char *format, va_list args) { - message_ = apr_pvsprintf(pool_, format, args); + message_ = pool_.vsprintf(format, args); }