X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/5f7a1d380823e5188490c2fd41009f90d59e6fee..a4d849b7b60b43b71a5fe406ff0d78ccf197d15d:/Internal.hpp diff --git a/Internal.hpp b/Internal.hpp index 0d6ae78..9228379 100644 --- a/Internal.hpp +++ b/Internal.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 {{{ */ @@ -39,11 +39,34 @@ sig::Type *Structor_(CYPool &pool, sig::Aggregate *aggregate); extern JSClassRef Functor_; -struct Type_privateData : +template +struct CYPrivate : CYData { static JSClassRef Class_; + _finline JSValueRef GetPrototype(JSContextRef context) const { + return NULL; + } + + template + _finline static JSClassRef GetClass(Args_ &&... args) { + return Class_; + } + + template + static JSObjectRef Make(JSContextRef context, Args_ &&... args) { + Internal_ *internal(new Internal_(cy::Forward(args)...)); + JSObjectRef object(JSObjectMake(context, Internal_::GetClass(cy::Forward(args)...), internal)); + if (JSValueRef prototype = internal->GetPrototype(context)) + CYSetPrototype(context, object, prototype); + return object; + } +}; + +struct Type_privateData : + CYPrivate +{ ffi_type *ffi_; sig::Type *type_; @@ -89,16 +112,17 @@ struct Type_privateData : } }; +template struct CYValue : - CYData + CYPrivate { - void *value_; + Value_ value_; CYValue() { } - CYValue(const void *value) : - value_(const_cast(value)) + CYValue(const Value_ &value) : + value_(value) { } @@ -108,39 +132,8 @@ struct CYValue : } }; -template -struct CYValue_ : - CYValue -{ - static JSClassRef Class_; - - using CYValue::CYValue; - - _finline Value_ GetValue() const { - return reinterpret_cast(value_); - } - - _finline JSValueRef GetPrototype(JSContextRef context) const { - return NULL; - } - - template - _finline static JSClassRef GetClass(Args_ &&... args) { - return Class_; - } - - template - static JSObjectRef Make(JSContextRef context, Args_ &&... args) { - Internal_ *internal(new Internal_(cy::Forward(args)...)); - JSObjectRef object(JSObjectMake(context, Internal_::GetClass(cy::Forward(args)...), internal)); - if (JSValueRef prototype = internal->GetPrototype(context)) - CYSetPrototype(context, object, prototype); - return object; - } -}; - -template -JSClassRef CYValue_::Class_; +template +JSClassRef CYPrivate::Class_; struct CYProtect { private: @@ -178,7 +171,7 @@ struct CYProtect { namespace cy { struct Functor : - CYValue + CYValue { private: void set() { @@ -191,7 +184,7 @@ struct Functor : ffi_cif cif_; Functor(void (*value)(), bool variadic, const sig::Signature &signature) : - CYValue(reinterpret_cast(value)), + CYValue(value), variadic_(variadic) { sig::Copy(*pool_, signature_, signature); @@ -199,17 +192,13 @@ struct Functor : } Functor(void (*value)(), const char *encoding) : - CYValue(reinterpret_cast(value)), + CYValue(value), variadic_(false) { sig::Parse(*pool_, &signature_, encoding, &Structor_); set(); } - void (*GetValue() const)() { - return reinterpret_cast(value_); - } - static JSStaticFunction const * const StaticFunctions; static JSStaticValue const * const StaticValues; }; }