]> git.saurik.com Git - cycript.git/commitdiff
Make Type inherit Functin and build placement new.
authorJay Freeman (saurik) <saurik@saurik.com>
Sat, 9 Jan 2016 01:20:36 +0000 (17:20 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Sat, 9 Jan 2016 01:20:36 +0000 (17:20 -0800)
Execute.cpp

index 11b54f97e2902d87b31dbd7f1380578a211838de..1a49f26d97f268374897387490356d8c60f22329 100644 (file)
@@ -1666,7 +1666,14 @@ static JSValueRef Type_callAsFunction(JSContextRef context, JSObjectRef object,
 
     sig::Type *type(internal->type_);
     ffi_type *ffi(internal->GetFFI());
 
     sig::Type *type(internal->type_);
     ffi_type *ffi(internal->GetFFI());
-    void *data(buffer->malloc<void>(ffi->size, ffi->alignment));
+
+    void *data;
+    if (_this == NULL || CYIsStrictEqual(context, _this, CYGetGlobalObject(context)))
+        data = buffer->malloc<void>(ffi->size, ffi->alignment);
+    else {
+        CYSetProperty(context, buffer, CYJSString("$cyo"), _this, kJSPropertyAttributeDontEnum);
+        data = CYCastPointer<void *>(context, _this);
+    }
 
     type->PoolFFI(buffer, context, ffi, data, arguments[0]);
     JSValueRef value(type->FromFFI(context, ffi, data, false, buffer));
 
     type->PoolFFI(buffer, context, ffi, data, arguments[0]);
     JSValueRef value(type->FromFFI(context, ffi, data, false, buffer));
@@ -2460,7 +2467,12 @@ extern "C" void CYSetupContext(JSGlobalContextRef context) {
     CYSetProperty(context, cycript, CYJSString("Functor"), Functor);
 
     CYSetProperty(context, cycript, CYJSString("Pointer"), JSObjectMakeConstructor(context, CYPrivate<Pointer>::Class_, &Pointer_new));
     CYSetProperty(context, cycript, CYJSString("Functor"), Functor);
 
     CYSetProperty(context, cycript, CYJSString("Pointer"), JSObjectMakeConstructor(context, CYPrivate<Pointer>::Class_, &Pointer_new));
-    CYSetProperty(context, cycript, CYJSString("Type"), JSObjectMakeConstructor(context, CYPrivate<Type_privateData>::Class_, &Type_new));
+
+    JSObjectRef Type(JSObjectMakeConstructor(context, CYPrivate<Type_privateData>::Class_, &Type_new));
+    JSObjectRef Type_prototype(CYCastJSObject(context, CYGetProperty(context, Type, prototype_s)));
+    CYSetPrototype(context, Type_prototype, Function_prototype);
+    CYSetProperty(context, cy, CYJSString("Type_prototype"), Type_prototype);
+    CYSetProperty(context, cycript, CYJSString("Type"), Type);
 
     JSObjectRef modules(JSObjectMake(context, NULL, NULL));
     CYSetProperty(context, cy, CYJSString("modules"), modules);
 
     JSObjectRef modules(JSObjectMake(context, NULL, NULL));
     CYSetProperty(context, cy, CYJSString("modules"), modules);