]> git.saurik.com Git - cycript.git/commitdiff
Continuing to attempt to get build environment to be somewhat portable.
authorJay Freeman (saurik) <saurik@saurik.com>
Thu, 22 Oct 2009 21:08:55 +0000 (21:08 +0000)
committerJay Freeman (saurik) <saurik@saurik.com>
Thu, 22 Oct 2009 21:08:55 +0000 (21:08 +0000)
Cycript.y.in
Darwin.mk
Library.mm
Linux.mk
cycript.hpp
makefile
sig/parse.cpp

index 4d47834078d29b928075eb6f3555b49fd86cfb88..40126fadfea908c6675ebde21cb61ad65c3c5ab4 100644 (file)
@@ -46,7 +46,7 @@
 %code requires {
 #include "Parser.hpp"
 
-@begin ObjC
+@begin ObjectiveC
 #include "ObjectiveC.hpp"
 @end
 
@@ -89,7 +89,7 @@ typedef struct {
         CYTrue *true_;
         CYWord *word_;
 
-@begin ObjC
+@begin ObjectiveC
         CYClassName *className_;
         CYField *field_;
         CYMessage *message_;
@@ -413,7 +413,7 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 %type <statement_> WhileStatement
 %type <statement_> WithStatement
 
-@begin ObjC
+@begin ObjectiveC
 %type <statement_> CategoryStatement
 %type <expression_> ClassExpression
 %type <statement_> ClassStatement
@@ -485,7 +485,7 @@ Terminator
     |
     ;*/
 
-@begin ObjC
+@begin ObjectiveC
 NewLineOpt
     : "\n"
     |
@@ -1319,7 +1319,7 @@ SourceElement
     ;
 /* }}} */
 
-@begin ObjC
+@begin ObjectiveC
 /* Cycript (Objective-C): @class Declaration {{{ */
 ClassSuperOpt
     : ":" MemberExpressionNoBF { $$ = $2; }
index 0d9a08383779dbcd42f9882d091999c525c21694..c37e7700b3439e240b187b4521e101b1ff6392bf 100644 (file)
--- a/Darwin.mk
+++ b/Darwin.mk
@@ -1,9 +1,6 @@
 # XXX: objective-c exists on non-Darwin
 
 dll := dylib
-header += Struct.hpp ObjectiveC.hpp
-code += ObjectiveC.o Library.o
-filters += ObjC
 flags += -DCY_ATTACH -DCY_EXECUTE
 link += -lobjc -framework CoreFoundation
 console += -framework Foundation
@@ -12,5 +9,4 @@ library += -framework Foundation -framework CFNetwork
 library += -framework JavaScriptCore -framework WebCore
 library += -lsubstrate
 
-Struct.hpp:
-       $$($(target)gcc -print-prog-name=cc1obj) -print-objc-runtime-info </dev/null >$@
+include ObjectiveC.mk
index 33570807cedd2f405615b94e11139d743eea574b..b05138a498bff1a32ecede8c499bfdda74868e63 100644 (file)
@@ -37,8 +37,6 @@
 */
 /* }}} */
 
-#define _GNU_SOURCE
-
 #include <substrate.h>
 #include "cycript.hpp"
 
 #include "Pooling.hpp"
 #include "Struct.hpp"
 
+#ifdef __APPLE__
 #include <CoreFoundation/CoreFoundation.h>
 #include <CoreFoundation/CFLogUtilities.h>
-
 #include <JavaScriptCore/JSStringRefCF.h>
+#endif
+
+#include <Foundation/Foundation.h>
+
 #include <WebKit/WebScriptObject.h>
 
 #include <sys/mman.h>
@@ -135,11 +137,6 @@ void CYSetProperty(JSContextRef context, JSObjectRef object, JSStringRef name, J
 }
 /* }}} */
 /* JavaScript Strings {{{ */
-JSStringRef CYCopyJSString(id value) {
-    // XXX: this definition scares me; is anyone using this?!
-    return value == NULL ? NULL : JSStringCreateWithCFString(reinterpret_cast<CFStringRef>([value description]));
-}
-
 JSStringRef CYCopyJSString(const char *value) {
     return value == NULL ? NULL : JSStringCreateWithUTF8CString(value);
 }
@@ -203,7 +200,25 @@ class CYJSString {
         return string_;
     }
 };
+/* }}} */
+/* Objective-C Strings {{{ */
+JSStringRef CYCopyJSString_(NSString *value) {
+#ifdef __APPLE__
+    return JSStringCreateWithCFString(reinterpret_cast<CFStringRef>(string));
+#else
+    return CYCopyJSString([value UTF8String]);
+#endif
+}
+
+JSStringRef CYCopyJSString(id value) {
+    if (value == nil)
+        return NULL;
+    // XXX: this definition scares me; is anyone using this?!
+    NSString *string([value description]);
+    return CYCopyJSString_(string);
+}
 
+#ifdef __APPLE__
 CFStringRef CYCopyCFString(JSStringRef value) {
     return JSStringCopyCFString(kCFAllocatorDefault, value);
 }
@@ -211,7 +226,7 @@ CFStringRef CYCopyCFString(JSStringRef value) {
 CFStringRef CYCopyCFString(JSContextRef context, JSValueRef value) {
     return CYCopyCFString(CYJSString(context, value));
 }
-
+#endif
 /* }}} */
 
 static JSGlobalContextRef Context_;
@@ -228,7 +243,6 @@ static JSClassRef Pointer_;
 static JSClassRef Runtime_;
 static JSClassRef Selector_;
 static JSClassRef Struct_;
-static JSClassRef Type_;
 
 static JSClassRef ObjectiveC_Classes_;
 static JSClassRef ObjectiveC_Image_Classes_;
@@ -280,8 +294,8 @@ struct CYValue :
     CYValue() {
     }
 
-    CYValue(void *value) :
-        value_(value)
+    CYValue(const void *value) :
+        value_(const_cast<void *>(value))
     {
     }
 
@@ -316,7 +330,7 @@ JSValueRef CYGetClassPrototype(JSContextRef context, id self) {
         return Instance_prototype_;
 
     // XXX: I need to think through multi-context
-    typedef std::map<Class, JSValueRef> CacheMap;
+    typedef std::map<id, JSValueRef> CacheMap;
     static CacheMap cache_;
 
     JSValueRef &value(cache_[self]);
@@ -552,6 +566,8 @@ struct Type_privateData :
     static Type_privateData *Object;
     static Type_privateData *Selector;
 
+    static JSClassRef Class;
+
     ffi_type *ffi_;
     sig::Type *type_;
 
@@ -830,6 +846,7 @@ NSString *CYPoolNSCYON(apr_pool_t *pool, id value);
 - (void *) cy$symbol;
 @end
 
+#ifdef __APPLE__
 struct PropertyAttributes {
     CYPool pool_;
 
@@ -915,10 +932,13 @@ struct PropertyAttributes {
     }
 
 };
+#endif
 
+#ifdef __APPLE__
 NSString *NSCFType$cy$toJSON(id self, SEL sel, NSString *key) {
     return [(NSString *) CFCopyDescription((CFTypeRef) self) autorelease];
 }
+#endif
 
 /* Bridge: NSArray {{{ */
 @implementation NSArray (Cycript)
@@ -928,7 +948,13 @@ NSString *NSCFType$cy$toJSON(id self, SEL sel, NSString *key) {
     [json appendString:@"["];
 
     bool comma(false);
+#ifdef __APPLE__
     for (id object in self) {
+#else
+    id object;
+    for (size_t index(0), count([self count]); index != count; ++index) {
+        object = [self objectAtIndex:index];
+#endif
         if (comma)
             [json appendString:@","];
         else
@@ -957,8 +983,14 @@ NSString *NSCFType$cy$toJSON(id self, SEL sel, NSString *key) {
 }
 
 - (NSObject *) cy$getProperty:(NSString *)name {
-    if ([name isEqualToString:@"length"])
-        return [NSNumber numberWithUnsignedInteger:[self count]];
+    if ([name isEqualToString:@"length"]) {
+        NSUInteger count([self count]);
+#ifdef __APPLE__
+        return [NSNumber numberWithUnsignedInteger:count];
+#else
+        return [NSNumber numberWithUnsignedInt:count];
+#endif
+    }
 
     size_t index(CYGetIndex(NULL, name));
     if (index == _not(size_t) || index >= [self count])
@@ -977,7 +1009,12 @@ NSString *NSCFType$cy$toJSON(id self, SEL sel, NSString *key) {
     [json appendString:@"{"];
 
     bool comma(false);
+#ifdef __APPLE__
     for (id key in self) {
+#else
+    NSEnumerator *keys([self keyEnumerator]);
+    while (id key = [keys nextObject]) {
+#endif
         if (comma)
             [json appendString:@","];
         else
@@ -1008,7 +1045,12 @@ NSString *NSCFType$cy$toJSON(id self, SEL sel, NSString *key) {
 - (bool) cy$setProperty:(NSString *)name to:(NSObject *)value {
     if ([name isEqualToString:@"length"]) {
         // XXX: is this not intelligent?
-        NSUInteger size([(NSNumber *)value unsignedIntegerValue]);
+        NSNumber *number(reinterpret_cast<NSNumber *>(value));
+#ifdef __APPLE__
+        NSUInteger size([number unsignedIntegerValue]);
+#else
+        NSUInteger size([number unsignedIntValue]);
+#endif
         NSUInteger count([self count]);
         if (size < count)
             [self removeObjectsInRange:NSMakeRange(size, count - size)];
@@ -2238,11 +2280,13 @@ static JSValueRef Instance_getProperty(JSContextRef context, JSObjectRef object,
         const char *string(CYPoolCString(pool, name));
         Class _class(object_getClass(self));
 
+#ifdef __APPLE__
         if (objc_property_t property = class_getProperty(_class, string)) {
             PropertyAttributes attributes(property);
             SEL sel(sel_registerName(attributes.Getter()));
             return CYSendMessage(pool, context, self, sel, 0, NULL, false, exception);
         }
+#endif
 
         if (SEL sel = sel_getUid(string))
             if (CYImplements(self, _class, sel, true))
@@ -2270,6 +2314,7 @@ static bool Instance_setProperty(JSContextRef context, JSObjectRef object, JSStr
         const char *string(CYPoolCString(pool, name));
         Class _class(object_getClass(self));
 
+#ifdef __APPLE__
         if (objc_property_t property = class_getProperty(_class, string)) {
             PropertyAttributes attributes(property);
             if (const char *setter = attributes.Setter()) {
@@ -2279,6 +2324,7 @@ static bool Instance_setProperty(JSContextRef context, JSObjectRef object, JSStr
                 return true;
             }
         }
+#endif
 
         size_t length(strlen(string));
 
@@ -3576,7 +3622,7 @@ JSGlobalContextRef CYGetJSContext() {
         definition.callAsFunction = &Type_callAsFunction;
         definition.callAsConstructor = &Type_callAsConstructor;
         definition.finalize = &Finalize;
-        Type_ = JSClassCreate(&definition);
+        Type_privateData::Class = JSClassCreate(&definition);
 
         definition = kJSClassDefinitionEmpty;
         definition.className = "Runtime";
@@ -3663,7 +3709,9 @@ JSGlobalContextRef CYGetJSContext() {
 
         MSHookFunction(&objc_registerClassPair, MSHake(objc_registerClassPair));
 
+#ifdef __APPLE__
         class_addMethod(NSCFType_, @selector(cy$toJSON:), reinterpret_cast<IMP>(&NSCFType$cy$toJSON), "@12@0:4@8");
+#endif
 
         JSObjectRef cycript(JSObjectMake(context, NULL, NULL));
         CYSetProperty(context, global, CYJSString("Cycript"), cycript);
index 26b27ed57f88692c18a75bb46bd6d8ae80832665..56bbb6cedd0848cf20952f8af319f04cd76bf083 100644 (file)
--- a/Linux.mk
+++ b/Linux.mk
@@ -1,3 +1,4 @@
 export PATH := /usr/local/bin:$(PATH)
 flags += -I/usr/include/webkit-1.0
 depends += libffi4 libreadline5
+include GNUstep.mk
index b789731e4da737ec508209cb4f491735489089b9..3d70f5b7797d95cd285beb1e4e609432a8129167 100644 (file)
 #ifndef CYCRIPT_HPP
 #define CYCRIPT_HPP
 
-#ifdef __OBJC__
-#include <Foundation/Foundation.h>
-#endif
-
 #include <JavaScriptCore/JavaScript.h>
 
 #include <apr_pools.h>
index 2cd6880d5c503be2fea5784427379a1e85028c02..1a986ec61e6cc490a7070875a1eb2b740cf5794d 100644 (file)
--- a/makefile
+++ b/makefile
@@ -6,11 +6,7 @@ else
 target := $(PKG_TARG)-
 endif
 
-flags := -g3 -O0 -DYYDEBUG=1
-#flags := -g0 -O3
-flags += -Wall -Werror -Wno-parentheses
-flags += -fPIC -fno-common
-flags += -I. -I$(shell apr-1-config --includedir)
+flags :=
 
 svn := $(shell svnversion)
 
@@ -27,6 +23,7 @@ code := ffi_type.o parse.o
 code += Replace.o Output.o
 code += Cycript.tab.o lex.cy.o
 code += Network.o Parser.o
+code += JavaScriptCore.o Library.o
 
 filters := C
 ldid := echo
@@ -41,6 +38,12 @@ uname_p := $(shell uname -p)
 -include $(uname_s).mk
 -include $(uname_s)-$(uname_p).mk
 
+flags += -g3 -O0 -DYYDEBUG=1
+#flags += -g0 -O3
+flags += -Wall -Werror -Wno-parentheses
+flags += -fPIC -fno-common
+flags += -I. -I$(shell apr-1-config --includedir)
+
 all += libcycript.$(dll)
 
 ifdef arch
index a359e5419c097990f422d829d5740c916787ff15..57e5a10669b166aae90e027b51167c516a30b35a 100644 (file)
@@ -278,7 +278,7 @@ const char *Unparse(apr_pool_t *pool, struct Type *type) {
             return apr_psprintf(pool, "[%lu%s]", type->data.data.size, value);
         } break;
 
-        case pointer_P: return apr_psprintf(pool, "^%s", type->data.data.type == NULL ? "" : Unparse(pool, type->data.data.type));
+        case pointer_P: return apr_psprintf(pool, "^%s", type->data.data.type == NULL ? "v" : Unparse(pool, type->data.data.type));
         case bit_P: return apr_psprintf(pool, "b%zu", type->data.data.size);
         case char_P: return "c";
         case double_P: return "d";