X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/2e862b3da8a84b110b849190e37f4a530c83941a..1fe330114b9b59b11dea95b8f941f478eae8f020:/JavaScript.hpp diff --git a/JavaScript.hpp b/JavaScript.hpp index b658a51..3265b2e 100644 --- a/JavaScript.hpp +++ b/JavaScript.hpp @@ -1,5 +1,5 @@ -/* Cycript - Optimizing JavaScript Compiler/Runtime - * Copyright (C) 2009-2015 Jay Freeman (saurik) +/* Cycript - The Truly Universal Scripting Language + * Copyright (C) 2009-2016 Jay Freeman (saurik) */ /* GNU Affero General Public License, Version 3 {{{ */ @@ -23,6 +23,7 @@ #define CYCRIPT_JAVASCRIPT_HPP #include +#include #include #include @@ -38,10 +39,14 @@ #include "Pooling.hpp" #include "String.hpp" +#include "Utility.hpp" extern JSStringRef Array_s; +extern JSStringRef constructor_s; extern JSStringRef cy_s; extern JSStringRef cyi_s; +extern JSStringRef cyt_s; +extern JSStringRef cyt__s; extern JSStringRef length_s; extern JSStringRef message_s; extern JSStringRef name_s; @@ -62,7 +67,11 @@ JSObjectRef CYGetGlobalObject(JSContextRef context); extern "C" void CYSetupContext(JSGlobalContextRef context); const char *CYExecute(JSContextRef context, CYPool &pool, CYUTF8String code); -void CYSetArgs(int argc, const char *argv[]); +#ifndef __ANDROID__ +void CYCancel(); +#endif + +void CYSetArgs(const char *argv0, const char *script, int argc, const char *argv[]); bool CYCastBool(JSContextRef context, JSValueRef value); double CYCastDouble(JSContextRef context, JSValueRef value); @@ -70,6 +79,7 @@ double CYCastDouble(JSContextRef context, JSValueRef value); bool CYIsEqual(JSContextRef context, JSValueRef lhs, JSValueRef rhs); bool CYIsStrictEqual(JSContextRef context, JSValueRef lhs, JSValueRef rhs); +CYUTF16String CYCastUTF16String(JSStringRef value); CYUTF8String CYPoolUTF8String(CYPool &pool, JSContextRef context, JSStringRef value); const char *CYPoolCString(CYPool &pool, JSContextRef context, JSStringRef value); @@ -81,6 +91,7 @@ void CYSetProperty(JSContextRef context, JSObjectRef object, size_t index, JSVal 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 CYGetPrototype(JSContextRef context, JSObjectRef object); void CYSetPrototype(JSContextRef context, JSObjectRef object, JSValueRef prototype); JSValueRef CYGetCachedValue(JSContextRef context, JSStringRef name); @@ -88,12 +99,15 @@ 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, signed short int value); +JSValueRef CYCastJSValue(JSContextRef context, unsigned short int value); +JSValueRef CYCastJSValue(JSContextRef context, signed 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, signed long int value); +JSValueRef CYCastJSValue(JSContextRef context, unsigned long int value); +JSValueRef CYCastJSValue(JSContextRef context, signed long long int value); +JSValueRef CYCastJSValue(JSContextRef context, unsigned long long int value); JSValueRef CYCastJSValue(JSContextRef context, JSStringRef value); JSValueRef CYCastJSValue(JSContextRef context, const char *value); @@ -102,18 +116,22 @@ JSObjectRef CYCastJSObject(JSContextRef context, JSValueRef value); JSValueRef CYJSUndefined(JSContextRef context); JSValueRef CYJSNull(JSContextRef context); -void *CYCastPointer_(JSContextRef context, JSValueRef value); +void *CYCastPointerEx_(JSContextRef context, JSObjectRef value); template -_finline Type_ CYCastPointer(JSContextRef context, JSValueRef value) { - return reinterpret_cast(CYCastPointer_(context, value)); +_finline Type_ CYCastPointerEx(JSContextRef context, JSObjectRef value) { + return reinterpret_cast(CYCastPointerEx_(context, value)); } -void CYPoolFFI(CYPool *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); +void *CYCastPointer_(JSContextRef context, JSValueRef value, bool *guess = NULL); + +template +_finline Type_ CYCastPointer(JSContextRef context, JSValueRef value, bool *guess = NULL) { + return reinterpret_cast(CYCastPointer_(context, value, guess)); +} void CYCallFunction(CYPool &pool, JSContextRef context, ffi_cif *cif, void (*function)(), void *value, void **values); -JSValueRef CYCallFunction(CYPool &pool, JSContextRef context, size_t setups, void *setup[], size_t count, const JSValueRef arguments[], bool initialize, sig::Signature *signature, ffi_cif *cif, void (*function)()); +JSValueRef CYCallFunction(CYPool &pool, JSContextRef context, size_t setups, void *setup[], size_t count, const JSValueRef arguments[], bool initialize, bool variadic, const 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[]); @@ -130,9 +148,6 @@ struct CYHook { void (*Initialize)(); void (*SetupContext)(JSContextRef); - bool (*PoolFFI)(CYPool *, JSContextRef, sig::Type *, ffi_type *, void *, JSValueRef); - JSValueRef (*FromFFI)(JSContextRef, sig::Type *, ffi_type *, void *, bool, JSObjectRef); - void *(*CastSymbol)(const char *); }; @@ -140,22 +155,29 @@ struct CYRegisterHook { CYRegisterHook(CYHook *hook); }; -JSObjectRef CYMakePointer(JSContextRef context, void *pointer, size_t length, sig::Type *type, ffi_type *ffi, JSObjectRef owner); +JSObjectRef CYMakePointer(JSContextRef context, void *pointer, const sig::Type &type, ffi_type *ffi, JSObjectRef owner); -JSObjectRef CYMakeType(JSContextRef context, sig::Type *type); -JSObjectRef CYMakeType(JSContextRef context, sig::Signature *signature); +JSObjectRef CYMakeType(JSContextRef context, const sig::Type &type); void CYFinalize(JSObjectRef object); +JSObjectRef CYObjectMakeArray(JSContextRef context, size_t length, const JSValueRef values[]); + size_t CYArrayLength(JSContextRef context, JSObjectRef array); JSValueRef CYArrayGet(JSContextRef context, JSObjectRef array, size_t index); + +void CYArrayPush(JSContextRef context, JSObjectRef array, size_t length, const JSValueRef arguments[]); void CYArrayPush(JSContextRef context, JSObjectRef array, JSValueRef value); +bool CYGetOffset(CYPool &pool, JSContextRef context, JSStringRef value, ssize_t &index); + const char *CYPoolCString(CYPool &pool, JSContextRef context, JSValueRef value); JSStringRef CYCopyJSString(const char *value); JSStringRef CYCopyJSString(JSStringRef value); JSStringRef CYCopyJSString(CYUTF8String value); +JSStringRef CYCopyJSString(const std::string &value); +JSStringRef CYCopyJSString(CYUTF16String value); JSStringRef CYCopyJSString(JSContextRef context, JSValueRef value); void CYGarbageCollect(JSContextRef context); @@ -171,20 +193,19 @@ class CYJSString { } public: - CYJSString(const CYJSString &rhs) : - string_(CYCopyJSString(rhs.string_)) + CYJSString() : + string_(NULL) { } - template - CYJSString(Arg0_ arg0) : - string_(CYCopyJSString(arg0)) + CYJSString(const CYJSString &rhs) : + string_(CYCopyJSString(rhs.string_)) { } - template - CYJSString(Arg0_ arg0, Arg1_ arg1) : - string_(CYCopyJSString(arg0, arg1)) + template + CYJSString(Args_ &&... args) : + string_(CYCopyJSString(cy::Forward(args)...)) { } @@ -194,6 +215,11 @@ class CYJSString { return *this; } + CYJSString &operator =(CYJSString &&rhs) { + std::swap(string_, rhs.string_); + return *this; + } + ~CYJSString() { Clear_(); } @@ -208,15 +234,59 @@ class CYJSString { } }; +template +class CYArrayBuilder { + private: + JSContextRef context_; + JSObjectRef &array_; + size_t size_; + JSValueRef values_[Size_]; + + void flush() { + if (array_ == NULL) + array_ = CYObjectMakeArray(context_, size_, values_); + else + CYArrayPush(context_, array_, size_, values_); + } + + public: + CYArrayBuilder(JSContextRef context, JSObjectRef &array) : + context_(context), + array_(array), + size_(0) + { + } + + ~CYArrayBuilder() { + flush(); + } + + void operator ()(JSValueRef value) { + if (size_ == Size_) { + flush(); + size_ = 0; + } + + values_[size_++] = value; + } +}; + #ifdef __APPLE__ +#define _weak __attribute__((__weak_import__)); +#else +#define _weak +#endif + typedef struct OpaqueJSWeakObjectMap *JSWeakObjectMapRef; typedef void (*JSWeakMapDestroyedCallback)(JSWeakObjectMapRef map, void *data); -extern "C" JSWeakObjectMapRef JSWeakObjectMapCreate(JSContextRef ctx, void *data, JSWeakMapDestroyedCallback destructor) __attribute__((__weak_import__)); -extern "C" void JSWeakObjectMapSet(JSContextRef ctx, JSWeakObjectMapRef map, void *key, JSObjectRef) __attribute__((__weak_import__)); -extern "C" JSObjectRef JSWeakObjectMapGet(JSContextRef ctx, JSWeakObjectMapRef map, void *key) __attribute__((__weak_import__)); -extern "C" bool JSWeakObjectMapClear(JSContextRef ctx, JSWeakObjectMapRef map, void *key, JSObjectRef object) __attribute__((__weak_import__)); -extern "C" void JSWeakObjectMapRemove(JSContextRef ctx, JSWeakObjectMapRef map, void* key) __attribute__((__weak_import__)); -#endif +extern "C" JSWeakObjectMapRef JSWeakObjectMapCreate(JSContextRef ctx, void *data, JSWeakMapDestroyedCallback destructor) _weak; +extern "C" void JSWeakObjectMapSet(JSContextRef ctx, JSWeakObjectMapRef map, void *key, JSObjectRef) _weak; +extern "C" JSObjectRef JSWeakObjectMapGet(JSContextRef ctx, JSWeakObjectMapRef map, void *key) _weak; +extern "C" bool JSWeakObjectMapClear(JSContextRef ctx, JSWeakObjectMapRef map, void *key, JSObjectRef object) _weak; +extern "C" void JSWeakObjectMapRemove(JSContextRef ctx, JSWeakObjectMapRef map, void* key) _weak; + +typedef bool (*JSShouldTerminateCallback)(JSContextRef ctx, void *context); +extern "C" void JSContextGroupSetExecutionTimeLimit(JSContextGroupRef, double limit, JSShouldTerminateCallback, void *context) _weak; #endif/*CYCRIPT_JAVASCRIPT_HPP*/