X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/0559abf83c4cc9bbd896b69dfaae1e8422521479..b101f7547000aaa1354792aabc459de7cc9e91de:/JavaScript.hpp?ds=sidebyside diff --git a/JavaScript.hpp b/JavaScript.hpp index 43c6be0..64dcbac 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,13 @@ #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 length_s; extern JSStringRef message_s; extern JSStringRef name_s; @@ -61,9 +65,12 @@ JSObjectRef CYGetGlobalObject(JSContextRef context); extern "C" void CYSetupContext(JSGlobalContextRef context); const char *CYExecute(JSContextRef context, CYPool &pool, CYUTF8String code); + +#ifndef __ANDROID__ void CYCancel(); +#endif -void CYSetArgs(int argc, const char *argv[]); +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); @@ -71,6 +78,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); @@ -82,6 +90,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); @@ -89,12 +98,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); @@ -103,6 +115,13 @@ JSObjectRef CYCastJSObject(JSContextRef context, JSValueRef value); JSValueRef CYJSUndefined(JSContextRef context); JSValueRef CYJSNull(JSContextRef context); +void *CYCastPointerEx_(JSContextRef context, JSObjectRef value); + +template +_finline Type_ CYCastPointerEx(JSContextRef context, JSObjectRef value) { + return reinterpret_cast(CYCastPointerEx_(context, value)); +} + void *CYCastPointer_(JSContextRef context, JSValueRef value, bool *guess = NULL); template @@ -111,7 +130,7 @@ _finline Type_ CYCastPointer(JSContextRef context, JSValueRef value, bool *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[]); @@ -135,24 +154,28 @@ struct CYRegisterHook { CYRegisterHook(CYHook *hook); }; -JSObjectRef CYMakePointer(JSContextRef context, void *pointer, size_t length, const 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, const sig::Type &type); -JSObjectRef CYMakeType(JSContextRef context, sig::Signature *signature); 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); @@ -169,20 +192,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)...)) { } @@ -192,6 +214,11 @@ class CYJSString { return *this; } + CYJSString &operator =(CYJSString &&rhs) { + std::swap(string_, rhs.string_); + return *this; + } + ~CYJSString() { Clear_(); } @@ -206,6 +233,43 @@ 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