X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/00b9328fc47038f081ad49fff7c14cc6a7d212b3..bc3080fdd24b9858d9c9dcbd3d8dd78ae010962a:/JavaScript.hpp diff --git a/JavaScript.hpp b/JavaScript.hpp index b45e3bf..ca2b0c1 100644 --- a/JavaScript.hpp +++ b/JavaScript.hpp @@ -1,50 +1,41 @@ -/* Cycript - Error.hppution Server and Disassembler - * Copyright (C) 2009 Jay Freeman (saurik) +/* Cycript - Optimizing JavaScript Compiler/Runtime + * Copyright (C) 2009-2012 Jay Freeman (saurik) */ -/* Modified BSD License {{{ */ +/* GNU Lesser 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 Lesser 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 Lesser 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 Lesser General Public License + * along with Cycript. If not, see . +**/ /* }}} */ #ifndef CYCRIPT_JAVASCRIPT_HPP #define CYCRIPT_JAVASCRIPT_HPP -extern JSObjectRef Array_; -extern JSObjectRef Error_; -extern JSObjectRef Function_; -extern JSObjectRef String_; +#include +#include +#include +#include +#include + +#ifdef HAVE_FFI_FFI_H +#include +#else +#include +#endif +extern JSStringRef Array_s; +extern JSStringRef cy_s; extern JSStringRef length_s; extern JSStringRef message_s; extern JSStringRef name_s; @@ -54,9 +45,141 @@ extern JSStringRef push_s; extern JSStringRef splice_s; extern JSStringRef toCYON_s; extern JSStringRef toJSON_s; +extern JSStringRef toPointer_s; +extern JSStringRef toString_s; + +void CYInitializeDynamic(); +JSGlobalContextRef CYGetJSContext(); +JSObjectRef CYGetGlobalObject(JSContextRef context); + +extern "C" void CYSetupContext(JSGlobalContextRef context); +const char *CYExecute(apr_pool_t *pool, CYUTF8String code); + +void CYSetArgs(int argc, const char *argv[]); + +bool CYCastBool(JSContextRef context, JSValueRef value); +double CYCastDouble(JSContextRef context, JSValueRef value); + +CYUTF8String CYPoolUTF8String(apr_pool_t *pool, JSContextRef context, JSStringRef value); +const char *CYPoolCString(apr_pool_t *pool, JSContextRef context, JSStringRef value); + +JSValueRef CYGetProperty(JSContextRef context, JSObjectRef object, size_t index); +JSValueRef CYGetProperty(JSContextRef context, JSObjectRef object, JSStringRef name); + +void CYSetProperty(JSContextRef context, JSObjectRef object, size_t index, JSValueRef value); +void CYSetProperty(JSContextRef context, JSObjectRef object, JSStringRef name, JSValueRef value, JSPropertyAttributes attributes = kJSPropertyAttributeNone); +void CYSetProperty(JSContextRef context, JSObjectRef object, JSStringRef name, JSValueRef (*callback)(JSContextRef, JSObjectRef, JSObjectRef, size_t, const JSValueRef[], JSValueRef *), JSPropertyAttributes attributes = kJSPropertyAttributeNone); + +JSObjectRef CYGetCachedObject(JSContextRef context, JSStringRef name); + +JSValueRef CYCastJSValue(JSContextRef context, bool value); +JSValueRef CYCastJSValue(JSContextRef context, double value); +JSValueRef CYCastJSValue(JSContextRef context, int value); +JSValueRef CYCastJSValue(JSContextRef context, unsigned int value); +JSValueRef CYCastJSValue(JSContextRef context, long int value); +JSValueRef CYCastJSValue(JSContextRef context, long unsigned int value); +JSValueRef CYCastJSValue(JSContextRef context, long long int value); +JSValueRef CYCastJSValue(JSContextRef context, long long unsigned int value); + +JSValueRef CYCastJSValue(JSContextRef context, JSStringRef value); +JSValueRef CYCastJSValue(JSContextRef context, const char *value); + +JSObjectRef CYCastJSObject(JSContextRef context, JSValueRef value); +JSValueRef CYJSUndefined(JSContextRef context); +JSValueRef CYJSNull(JSContextRef context); + +void *CYCastPointer_(JSContextRef context, JSValueRef value); + +template +_finline Type_ CYCastPointer(JSContextRef context, JSValueRef value) { + return reinterpret_cast(CYCastPointer_(context, value)); +} + +void CYPoolFFI(apr_pool_t *pool, JSContextRef context, sig::Type *type, ffi_type *ffi, void *data, JSValueRef value); +JSValueRef CYFromFFI(JSContextRef context, sig::Type *type, ffi_type *ffi, void *data, bool initialize = false, JSObjectRef owner = NULL); + +JSValueRef CYCallFunction(apr_pool_t *pool, JSContextRef context, size_t setups, void *setup[], size_t count, const JSValueRef arguments[], bool initialize, JSValueRef *exception, sig::Signature *signature, ffi_cif *cif, void (*function)()); + +bool CYIsCallable(JSContextRef context, JSValueRef value); +JSValueRef CYCallAsFunction(JSContextRef context, JSObjectRef function, JSObjectRef _this, size_t count, const JSValueRef arguments[]); + +const char *CYPoolCCYON(apr_pool_t *pool, JSContextRef context, JSObjectRef object); + +struct CYHooks { + void *(*ExecuteStart)(JSContextRef); + void (*ExecuteEnd)(JSContextRef, void *); + + void (*CallFunction)(JSContextRef, ffi_cif *, void (*)(), uint8_t *, void **); + + void (*Initialize)(); + void (*SetupContext)(JSContextRef); + + bool (*PoolFFI)(apr_pool_t *, JSContextRef, sig::Type *, ffi_type *, void *, JSValueRef); + JSValueRef (*FromFFI)(JSContextRef, sig::Type *, ffi_type *, void *, bool, JSObjectRef); +}; + +extern struct CYHooks *hooks_; + +JSObjectRef CYMakePointer(JSContextRef context, void *pointer, size_t length, sig::Type *type, ffi_type *ffi, JSObjectRef owner); + +void CYFinalize(JSObjectRef object); + +size_t CYArrayLength(JSContextRef context, JSObjectRef array); +JSValueRef CYArrayGet(JSContextRef context, JSObjectRef array, size_t index); +void CYArrayPush(JSContextRef context, JSObjectRef array, JSValueRef value); + +const char *CYPoolCString(apr_pool_t *pool, JSContextRef context, JSValueRef value); + +JSStringRef CYCopyJSString(const char *value); +JSStringRef CYCopyJSString(JSStringRef value); +JSStringRef CYCopyJSString(CYUTF8String value); +JSStringRef CYCopyJSString(JSContextRef context, JSValueRef value); + +class CYJSString { + private: + JSStringRef string_; + + void Clear_() { + if (string_ != NULL) + JSStringRelease(string_); + } + + public: + CYJSString(const CYJSString &rhs) : + string_(CYCopyJSString(rhs.string_)) + { + } + + template + CYJSString(Arg0_ arg0) : + string_(CYCopyJSString(arg0)) + { + } + + template + CYJSString(Arg0_ arg0, Arg1_ arg1) : + string_(CYCopyJSString(arg0, arg1)) + { + } + + CYJSString &operator =(const CYJSString &rhs) { + Clear_(); + string_ = CYCopyJSString(rhs.string_); + return *this; + } + + ~CYJSString() { + Clear_(); + } + + void Clear() { + Clear_(); + string_ = NULL; + } -extern JSObjectRef Array_prototype_; -extern JSObjectRef Function_prototype_; -extern JSObjectRef Object_prototype_; + operator JSStringRef() const { + return string_; + } +}; #endif/*CYCRIPT_JAVASCRIPT_HPP*/