X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/37954781d9756ece500551055562183a1e28e943..7ab9e6779d33d38b29b313153a6b109574699617:/JavaScript.hpp diff --git a/JavaScript.hpp b/JavaScript.hpp index 8ee5136..fcefd7b 100644 --- a/JavaScript.hpp +++ b/JavaScript.hpp @@ -1,24 +1,284 @@ +/* Cycript - The Truly Universal Scripting Language + * Copyright (C) 2009-2016 Jay Freeman (saurik) +*/ + +/* GNU Affero General Public License, Version 3 {{{ */ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program 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 Affero General Public License for more details. + + * You should have received a copy of the GNU Affero General Public License + * along with this program. 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 +#include +#include + +#ifdef HAVE_FFI_FFI_H +#include +#else +#include +#endif + +#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; +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; +extern JSStringRef weak_s; + +void CYInitializeDynamic(); +JSGlobalContextRef CYGetJSContext(); +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(const char *argv0, const char *script, int argc, const char *argv[]); + +bool CYCastBool(JSContextRef context, JSValueRef value); +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); + +bool CYHasProperty(JSContextRef context, JSObjectRef object, JSStringRef name); +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 CYGetPrototype(JSContextRef context, JSObjectRef object); +void CYSetPrototype(JSContextRef context, JSObjectRef object, JSValueRef prototype); + +JSValueRef CYGetCachedValue(JSContextRef context, JSStringRef name); +JSObjectRef CYGetCachedObject(JSContextRef context, JSStringRef name); + +JSValueRef CYCastJSValue(JSContextRef context, bool value); +JSValueRef CYCastJSValue(JSContextRef context, double 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, 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); + +JSObjectRef CYCastJSObject(JSContextRef context, JSValueRef value); +JSValueRef CYJSUndefined(JSContextRef context); +JSValueRef CYJSNull(JSContextRef context); + +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, 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[]); + +const char *CYPoolCCYON(CYPool &pool, JSContextRef context, JSObjectRef object, std::set &objects); +std::set *CYCastObjects(JSContextRef context, JSObjectRef _this, size_t count, const JSValueRef arguments[]); + +struct CYHook { + void *(*ExecuteStart)(JSContextRef); + void (*ExecuteEnd)(JSContextRef, void *); + + void (*CallFunction)(CYPool &, JSContextRef, ffi_cif *, void (*)(), void *, void **); + + void (*Initialize)(); + void (*SetupContext)(JSContextRef); + + void *(*CastSymbol)(const char *); +}; + +struct CYRegisterHook { + CYRegisterHook(CYHook *hook); +}; + +JSObjectRef CYMakePointer(JSContextRef context, void *pointer, const sig::Type &type, ffi_type *ffi, JSObjectRef owner); + +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); +void CYDestroyContext(); + +class CYJSString { + private: + JSStringRef string_; + + void Clear_() { + if (string_ != NULL) + JSStringRelease(string_); + } + + public: + CYJSString() : + string_(NULL) + { + } + + CYJSString(const CYJSString &rhs) : + string_(CYCopyJSString(rhs.string_)) + { + } + + template + CYJSString(Args_ &&... args) : + string_(CYCopyJSString(cy::Forward(args)...)) + { + } + + CYJSString &operator =(const CYJSString &rhs) { + Clear_(); + string_ = CYCopyJSString(rhs.string_); + return *this; + } + + CYJSString &operator =(CYJSString &&rhs) { + std::swap(string_, rhs.string_); + return *this; + } + + ~CYJSString() { + Clear_(); + } + + void Clear() { + Clear_(); + string_ = NULL; + } + + operator JSStringRef() const { + return string_; + } +}; + +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) _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*/