]> git.saurik.com Git - cycript.git/blobdiff - Execute.cpp
Replace TypeInstance with Class, which is not Type.
[cycript.git] / Execute.cpp
index 7eb2f802b6103154748df75892b7fbe773881309..781b795c011606c7b2d5ad90efccbd0f1ad597bc 100644 (file)
@@ -1,5 +1,5 @@
 /* Cycript - Optimizing JavaScript Compiler/Runtime
- * Copyright (C) 2009-2010  Jay Freeman (saurik)
+ * Copyright (C) 2009-2012  Jay Freeman (saurik)
 */
 
 /* GNU Lesser General Public License, Version 3 {{{ */
@@ -401,6 +401,16 @@ const char *CYPoolCCYON(apr_pool_t *pool, JSContextRef context, JSObjectRef obje
         return cyon;
     }
 
+    if (JSObjectIsFunction(context, object)) {
+        JSValueRef toString(CYGetProperty(context, object, toString_s));
+        if (CYIsCallable(context, toString)) {
+            JSValueRef arguments[1] = {CYCastJSValue(context, CYJSString(""))};
+            JSValueRef value(CYCallAsFunction(context, (JSObjectRef) toString, object, 1, arguments));
+            _assert(value != NULL);
+            return CYPoolCString(pool, context, value);
+        }
+    }
+
     std::ostringstream str;
 
     str << '{';
@@ -937,12 +947,12 @@ static JSValueRef Functor_callAsFunction(JSContextRef context, JSObjectRef objec
     return CYCallFunction(pool, context, 0, NULL, count, arguments, false, exception, &internal->signature_, &internal->cif_, internal->GetValue());
 }
 
-static JSObjectRef CYMakeType(JSContextRef context, const char *type) {
+JSObjectRef CYMakeType(JSContextRef context, const char *type) {
     Type_privateData *internal(new Type_privateData(type));
     return JSObjectMake(context, Type_privateData::Class_, internal);
 }
 
-static JSObjectRef CYMakeType(JSContextRef context, sig::Type *type) {
+JSObjectRef CYMakeType(JSContextRef context, sig::Type *type) {
     Type_privateData *internal(new Type_privateData(type));
     return JSObjectMake(context, Type_privateData::Class_, internal);
 }
@@ -1019,7 +1029,7 @@ static void All_getPropertyNames(JSContextRef context, JSObjectRef object, JSPro
 
 static JSObjectRef Pointer_new(JSContextRef context, JSObjectRef object, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
     if (count != 2)
-        throw CYJSError(context, "incorrect number of arguments to Functor constructor");
+        throw CYJSError(context, "incorrect number of arguments to Pointer constructor");
 
     CYPool pool;
 
@@ -1135,6 +1145,16 @@ static JSValueRef Pointer_callAsFunction_toCYON(JSContextRef context, JSObjectRe
     }
 } CYCatch }
 
+static JSValueRef Type_getProperty_alignment(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) {
+    Type_privateData *internal(reinterpret_cast<Type_privateData *>(JSObjectGetPrivate(object)));
+    return CYCastJSValue(context, internal->GetFFI()->alignment);
+}
+
+static JSValueRef Type_getProperty_size(JSContextRef context, JSObjectRef object, JSStringRef property, JSValueRef *exception) {
+    Type_privateData *internal(reinterpret_cast<Type_privateData *>(JSObjectGetPrivate(object)));
+    return CYCastJSValue(context, internal->GetFFI()->size);
+}
+
 static JSValueRef Type_callAsFunction_toString(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
     Type_privateData *internal(reinterpret_cast<Type_privateData *>(JSObjectGetPrivate(_this)));
     CYPool pool;
@@ -1183,6 +1203,12 @@ namespace cy {
     JSStaticFunction const * const Functor::StaticFunctions = Functor_staticFunctions;
 }
 
+static JSStaticValue Type_staticValues[3] = {
+    {"alignment", &Type_getProperty_alignment, NULL, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
+    {"size", &Type_getProperty_size, NULL, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
+    {NULL, NULL, NULL, 0}
+};
+
 static JSStaticFunction Type_staticFunctions[4] = {
     {"toCYON", &Type_callAsFunction_toCYON, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
     {"toJSON", &Type_callAsFunction_toJSON, kJSPropertyAttributeDontEnum | kJSPropertyAttributeDontDelete},
@@ -1235,10 +1261,8 @@ const char *CYExecute(apr_pool_t *pool, CYUTF8String code) {
         return error;
     }
 
-    if (exception != NULL) { error:
-        result = CYCastJSValue(context, CYJSString(context, exception));
-        exception = NULL;
-    }
+    if (exception != NULL) error:
+        return CYPoolCString(pool, context, CYJSString(context, exception));
 
     if (JSValueIsUndefined(context, result))
         return NULL;
@@ -1313,6 +1337,7 @@ void CYInitializeDynamic() {
 
     definition = kJSClassDefinitionEmpty;
     definition.className = "Type";
+    definition.staticValues = Type_staticValues;
     definition.staticFunctions = Type_staticFunctions;
     definition.getProperty = &Type_getProperty;
     definition.callAsFunction = &Type_callAsFunction;