X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/37954781d9756ece500551055562183a1e28e943..b5af12b8bc9c3fda53ebce1ba823734a279610c9:/JavaScript.hpp diff --git a/JavaScript.hpp b/JavaScript.hpp index 8ee5136..ca2b0c1 100644 --- a/JavaScript.hpp +++ b/JavaScript.hpp @@ -1,24 +1,185 @@ +/* Cycript - Optimizing JavaScript Compiler/Runtime + * Copyright (C) 2009-2012 Jay Freeman (saurik) +*/ + +/* GNU Lesser General Public License, Version 3 {{{ */ +/* + * 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. + * + * 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. + * + * 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_; - -extern JSStringRef length_; -extern JSStringRef message_; -extern JSStringRef name_; -extern JSStringRef prototype_; -extern JSStringRef toCYON_; -extern JSStringRef toJSON_; - -extern JSObjectRef Object_prototype_; -extern JSObjectRef Function_prototype_; - -extern JSObjectRef Array_prototype_; -extern JSObjectRef Array_pop_; -extern JSObjectRef Array_push_; -extern JSObjectRef Array_splice_; +#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; +extern JSStringRef pop_s; +extern JSStringRef prototype_s; +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; + } + + operator JSStringRef() const { + return string_; + } +}; #endif/*CYCRIPT_JAVASCRIPT_HPP*/