ffi_type *GetFFI() {
if (ffi_ == NULL) {
- ffi_ = new(*pool_) ffi_type;
-
sig::Element element;
element.name = NULL;
element.type = type_;
ffi_cif cif;
sig::sig_ffi_cif(*pool_, &sig::ObjectiveC, &signature, &cif);
+
+ ffi_ = new(*pool_) ffi_type;
*ffi_ = *cif.rtype;
}
struct Functor :
CYValue
{
+ private:
+ void set() {
+ sig::sig_ffi_cif(*pool_, &sig::ObjectiveC, &signature_, &cif_);
+ }
+
+ public:
sig::Signature signature_;
ffi_cif cif_;
- Functor(const char *type, void (*value)()) :
+ Functor(const sig::Signature &signature, void (*value)()) :
CYValue(reinterpret_cast<void *>(value))
{
- sig::Parse(*pool_, &signature_, type, &Structor_);
- sig::sig_ffi_cif(*pool_, &sig::ObjectiveC, &signature_, &cif_);
+ sig::Copy(*pool_, signature_, signature);
+ set();
+ }
+
+ Functor(const char *encoding, void (*value)()) :
+ CYValue(reinterpret_cast<void *>(value))
+ {
+ sig::Parse(*pool_, &signature_, encoding, &Structor_);
+ set();
}
void (*GetValue() const)() {
JSGlobalContextRef context_;
JSObjectRef function_;
- Closure_privateData(JSContextRef context, JSObjectRef function, const char *type) :
- cy::Functor(type, NULL),
+ Closure_privateData(JSContextRef context, JSObjectRef function, const sig::Signature &signature) :
+ cy::Functor(signature, NULL),
context_(CYGetJSContext(context)),
function_(function)
{
}
};
-Closure_privateData *CYMakeFunctor_(JSContextRef context, JSObjectRef function, const char *type, void (*callback)(ffi_cif *, void *, void **, void *));
+Closure_privateData *CYMakeFunctor_(JSContextRef context, JSObjectRef function, const sig::Signature &signature, void (*callback)(ffi_cif *, void *, void **, void *));
void CYExecuteClosure(ffi_cif *cif, void *result, void **arguments, void *arg, JSValueRef (*adapter)(JSContextRef, size_t, JSValueRef[], JSObjectRef));
#endif/*CYCRIPT_INTERNAL_HPP*/