]> git.saurik.com Git - cycript.git/commitdiff
Broke apart Connector from Library and fixed cases where '- -' was serialized as...
authorJay Freeman (saurik) <saurik@saurik.com>
Fri, 16 Oct 2009 22:19:56 +0000 (22:19 +0000)
committerJay Freeman (saurik) <saurik@saurik.com>
Fri, 16 Oct 2009 22:19:56 +0000 (22:19 +0000)
Connector.cpp [new file with mode: 0644]
Library.mm
Output.cpp
Parser.hpp
Pooling.hpp
cycript.hpp
makefile

diff --git a/Connector.cpp b/Connector.cpp
new file mode 100644 (file)
index 0000000..dddaa8b
--- /dev/null
@@ -0,0 +1,87 @@
+#include <substrate.h>
+
+#include "cycript.hpp"
+#include "Pooling.hpp"
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <sys/un.h>
+
+#include <apr-1/apr_thread_proc.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#import <CoreFoundation/CFLogUtilities.h>
+
+struct CYServer :
+    CYData
+{
+    int socket_;
+};
+
+apr_status_t CYPoolDLClose_(void *data) {
+    void *handle(reinterpret_cast<void *>(data));
+    dlclose(handle);
+    return APR_SUCCESS;
+}
+
+static void * APR_THREAD_FUNC Cyrver(apr_thread_t *thread, void *data) {
+    CYServer *server(reinterpret_cast<CYServer *>(data));
+
+    for (;;) {
+        int socket(_syscall(accept(server->socket_, NULL, NULL)));
+
+        if (void *handle = dlopen("/usr/lib/libcycript.dylib", RTLD_LAZY | RTLD_LOCAL)) {
+            apr_pool_t *pool;
+            _aprcall(apr_pool_create(&pool, NULL));
+
+            apr_pool_cleanup_register(pool, handle, &CYPoolDLClose_, &apr_pool_cleanup_null);
+
+            if (void (*CYHandleClient_)(apr_pool_t *, int) = reinterpret_cast<void (*)(apr_pool_t *, int)>(dlsym(handle, "CYHandleClient")))
+                (*CYHandleClient_)(pool, socket);
+            else
+                apr_pool_destroy(pool);
+        } else
+            CFLog(kCFLogLevelError, CFSTR("CY:Error: cannot load: %s"), dlerror());
+    }
+
+    delete server;
+    return NULL;
+}
+
+static void Unlink() {
+    pid_t pid(getpid());
+    char path[104];
+    sprintf(path, "/tmp/.s.cy.%u", pid);
+    unlink(path);
+}
+
+MSInitialize {
+    _aprcall(apr_initialize());
+
+    CYServer *server(new CYServer());
+    server->socket_ = _syscall(socket(PF_UNIX, SOCK_STREAM, 0));
+
+    struct sockaddr_un address;
+    memset(&address, 0, sizeof(address));
+    address.sun_family = AF_UNIX;
+
+    pid_t pid(getpid());
+    sprintf(address.sun_path, "/tmp/.s.cy.%u", pid);
+
+    try {
+        _syscall(bind(server->socket_, reinterpret_cast<sockaddr *>(&address), SUN_LEN(&address)));
+        atexit(&Unlink);
+        _syscall(listen(server->socket_, 0));
+
+        apr_threadattr_t *attr;
+        _aprcall(apr_threadattr_create(&attr, server->pool_));
+
+        apr_thread_t *thread;
+        _aprcall(apr_thread_create(&thread, attr, &Cyrver, server, server->pool_));
+    } catch (...) {
+        CFLog(kCFLogLevelError, CFSTR("CY:Error: cannot bind unix domain socket"));
+    }
+}
index 0dce4856d7038c034eb77dc9c7edfe57b4e2bb8f..2c642c61b9fbc2a4c38f4a12dbf795f54837bd9b 100644 (file)
 #include "Pooling.hpp"
 #include "Struct.hpp"
 
-#include <unistd.h>
-
 #include <CoreFoundation/CoreFoundation.h>
 #include <CoreFoundation/CFLogUtilities.h>
 
 #include <WebKit/WebScriptObject.h>
 
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <sys/un.h>
-
 #include <sys/mman.h>
 
 #include <iostream>
@@ -73,8 +66,6 @@
 #include "Parser.hpp"
 #include "Cycript.tab.hh"
 
-#include <fcntl.h>
-
 #include <apr-1/apr_thread_proc.h>
 
 #undef _assert
@@ -142,32 +133,9 @@ static Class Object_;
 
 static NSArray *Bridge_;
 
-struct CYData {
-    apr_pool_t *pool_;
-
-    virtual ~CYData() {
-    }
-
-    static void *operator new(size_t size, apr_pool_t *pool) {
-        void *data(apr_palloc(pool, size));
-        reinterpret_cast<CYData *>(data)->pool_ = pool;
-        return data;
-    }
-
-    static void *operator new(size_t size) {
-        apr_pool_t *pool;
-        apr_pool_create(&pool, NULL);
-        return operator new(size, pool);
-    }
-
-    static void operator delete(void *data) {
-        apr_pool_destroy(reinterpret_cast<CYData *>(data)->pool_);
-    }
-
-    static void Finalize(JSObjectRef object) {
-        delete reinterpret_cast<CYData *>(JSObjectGetPrivate(object));
-    }
-};
+static void Finalize(JSObjectRef object) {
+    delete reinterpret_cast<CYData *>(JSObjectGetPrivate(object));
+}
 
 class Type_privateData;
 
@@ -2874,7 +2842,6 @@ bool CYSendAll_(int socket, const uint8_t *data, size_t size) {
     return true;
 }
 
-static int Socket_;
 apr_pool_t *Pool_;
 
 struct CYExecute_ {
@@ -2966,23 +2933,11 @@ static void * APR_THREAD_FUNC OnClient(apr_thread_t *thread, void *data) {
     return NULL;
 }
 
-static void * APR_THREAD_FUNC Cyrver(apr_thread_t *thread, void *data) {
-    for (;;) {
-        int socket(_syscall(accept(Socket_, NULL, NULL)));
-        CYClient *client(new CYClient(socket));
-        apr_threadattr_t *attr;
-        _aprcall(apr_threadattr_create(&attr, Pool_));
-        _aprcall(apr_thread_create(&client->thread_, attr, &OnClient, client, client->pool_));
-    }
-
-    return NULL;
-}
-
-void Unlink() {
-    pid_t pid(getpid());
-    char path[104];
-    sprintf(path, "/tmp/.s.cy.%u", pid);
-    unlink(path);
+extern "C" void CYHandleClient(apr_pool_t *pool, int socket) {
+    CYClient *client(new(pool) CYClient(socket));
+    apr_threadattr_t *attr;
+    _aprcall(apr_threadattr_create(&attr, client->pool_));
+    _aprcall(apr_thread_create(&client->thread_, attr, &OnClient, client, client->pool_));
 }
 
 MSInitialize { _pooled
@@ -2999,29 +2954,6 @@ MSInitialize { _pooled
     NSMessageBuilder_ = objc_getClass("NSMessageBuilder");
     NSZombie_ = objc_getClass("_NSZombie_");
     Object_ = objc_getClass("Object");
-
-    Socket_ = _syscall(socket(PF_UNIX, SOCK_STREAM, 0));
-
-    struct sockaddr_un address;
-    memset(&address, 0, sizeof(address));
-    address.sun_family = AF_UNIX;
-
-    pid_t pid(getpid());
-    sprintf(address.sun_path, "/tmp/.s.cy.%u", pid);
-
-    try {
-        _syscall(bind(Socket_, reinterpret_cast<sockaddr *>(&address), SUN_LEN(&address)));
-        atexit(&Unlink);
-        _syscall(listen(Socket_, 0));
-
-        apr_threadattr_t *attr;
-        _aprcall(apr_threadattr_create(&attr, Pool_));
-
-        apr_thread_t *thread;
-        _aprcall(apr_thread_create(&thread, attr, &Cyrver, NULL, Pool_));
-    } catch (...) {
-        NSLog(@"failed to setup Cyrver");
-    }
 }
 
 JSGlobalContextRef CYGetJSContext() {
@@ -3032,7 +2964,7 @@ JSGlobalContextRef CYGetJSContext() {
         definition.className = "Functor";
         definition.staticFunctions = Functor_staticFunctions;
         definition.callAsFunction = &Functor_callAsFunction;
-        definition.finalize = &CYData::Finalize;
+        definition.finalize = &Finalize;
         Functor_ = JSClassCreate(&definition);
 
         definition = kJSClassDefinitionEmpty;
@@ -3045,7 +2977,7 @@ JSGlobalContextRef CYGetJSContext() {
         definition.deleteProperty = &Instance_deleteProperty;
         definition.getPropertyNames = &Instance_getPropertyNames;
         definition.callAsConstructor = &Instance_callAsConstructor;
-        definition.finalize = &CYData::Finalize;
+        definition.finalize = &Finalize;
         Instance_ = JSClassCreate(&definition);
 
         definition = kJSClassDefinitionEmpty;
@@ -3055,7 +2987,7 @@ JSGlobalContextRef CYGetJSContext() {
         definition.getProperty = &Internal_getProperty;
         definition.setProperty = &Internal_setProperty;
         definition.getPropertyNames = &Internal_getPropertyNames;
-        definition.finalize = &CYData::Finalize;
+        definition.finalize = &Finalize;
         Internal_ = JSClassCreate(&definition);
 
         definition = kJSClassDefinitionEmpty;
@@ -3064,7 +2996,7 @@ JSGlobalContextRef CYGetJSContext() {
         definition.staticFunctions = Pointer_staticFunctions;
         definition.getProperty = &Pointer_getProperty;
         definition.setProperty = &Pointer_setProperty;
-        definition.finalize = &CYData::Finalize;
+        definition.finalize = &Finalize;
         Pointer_ = JSClassCreate(&definition);
 
         definition = kJSClassDefinitionEmpty;
@@ -3073,7 +3005,7 @@ JSGlobalContextRef CYGetJSContext() {
         //definition.staticValues = Selector_staticValues;
         definition.staticFunctions = Selector_staticFunctions;
         definition.callAsFunction = &Selector_callAsFunction;
-        definition.finalize = &CYData::Finalize;
+        definition.finalize = &Finalize;
         Selector_ = JSClassCreate(&definition);
 
         definition = kJSClassDefinitionEmpty;
@@ -3082,7 +3014,7 @@ JSGlobalContextRef CYGetJSContext() {
         definition.getProperty = &Struct_getProperty;
         definition.setProperty = &Struct_setProperty;
         definition.getPropertyNames = &Struct_getPropertyNames;
-        definition.finalize = &CYData::Finalize;
+        definition.finalize = &Finalize;
         Struct_ = JSClassCreate(&definition);
 
         definition = kJSClassDefinitionEmpty;
@@ -3091,7 +3023,7 @@ JSGlobalContextRef CYGetJSContext() {
         //definition.getProperty = &Type_getProperty;
         definition.callAsFunction = &Type_callAsFunction;
         definition.callAsConstructor = &Type_callAsConstructor;
-        definition.finalize = &CYData::Finalize;
+        definition.finalize = &Finalize;
         Type_ = JSClassCreate(&definition);
 
         definition = kJSClassDefinitionEmpty;
@@ -3115,7 +3047,7 @@ JSGlobalContextRef CYGetJSContext() {
         definition.className = "ObjectiveC::Image::Classes";
         definition.getProperty = &ObjectiveC_Image_Classes_getProperty;
         definition.getPropertyNames = &ObjectiveC_Image_Classes_getPropertyNames;
-        definition.finalize = &CYData::Finalize;
+        definition.finalize = &Finalize;
         ObjectiveC_Image_Classes_ = JSClassCreate(&definition);
 
         definition = kJSClassDefinitionEmpty;
index a10705a61854f11d6b32b18b9164b6218ac6ab4e..fdbc733e4eeb2c426f3aaef93bd785d99fb6fa3f 100644 (file)
@@ -360,6 +360,8 @@ void CYInfix::Output(std::ostream &out, CYFlags flags) const {
     CYFlags right(protect ? CYNoFlags : CYRight(flags));
     if (alphabetic)
         right |= CYNoLeader;
+    if (strcmp(name, "-") == 0)
+        right |= CYNoHyphen;
     rhs_->Output(out, Precedence() - 1, right);
     if (protect)
         out << ')';
@@ -426,10 +428,11 @@ void CYNull::Output(std::ostream &out, CYFlags flags) const {
 }
 
 void CYNumber::Output(std::ostream &out, CYFlags flags) const {
-    if ((flags & CYNoLeader) != 0)
+    double value(Value());
+    if ((flags & CYNoLeader) != 0 || value < 0 && (flags & CYNoHyphen) != 0)
         out << ' ';
     // XXX: decide on correct precision
-    out << std::setprecision(9) << Value();
+    out << std::setprecision(9) << value;
     if ((flags & CYNoTrailer) != 0)
         out << ' ';
 }
@@ -456,8 +459,11 @@ void CYPostfix::Output(std::ostream &out, CYFlags flags) const {
 }
 
 void CYPrefix::Output(std::ostream &out, CYFlags flags) const {
+    const char *name(Operator());
     bool alphabetic(Alphabetic());
-    out << Operator();
+    if (alphabetic && (flags & CYNoLeader) != 0 || name[0] == '-' && (flags & CYNoHyphen) != 0)
+        out << ' ';
+    out << name;
     CYFlags right(CYRight(flags));
     if (alphabetic)
         right |= CYNoLeader;
index 71bdee4443e8d431b337f612fd4aa135e632b673..88a4b1344ad4299926793ebf0a124f13302568ff 100644 (file)
@@ -202,6 +202,7 @@ enum CYFlags {
     CYNoLeader =   (1 << 2),
     CYNoTrailer =  (1 << 3),
     CYNoIn =       (1 << 4),
+    CYNoHyphen =   (1 << 5),
 };
 
 struct CYExpression :
index 97bd17245ee900e6d919f6220815d18395459e03..73f1c805fe8620ec1c79e04679558440566ef926 100644 (file)
@@ -20,7 +20,7 @@ class CYPool {
 
   public:
     CYPool() {
-        apr_pool_create(&pool_, NULL);
+        _aprcall(apr_pool_create(&pool_, NULL));
     }
 
     ~CYPool() {
@@ -44,4 +44,28 @@ class CYPool {
     }
 };
 
+struct CYData {
+    apr_pool_t *pool_;
+
+    virtual ~CYData() {
+    }
+
+    static void *operator new(size_t size, apr_pool_t *pool) {
+        void *data(apr_palloc(pool, size));
+        reinterpret_cast<CYData *>(data)->pool_ = pool;
+        return data;
+    }
+
+    static void *operator new(size_t size) {
+        apr_pool_t *pool;
+        _aprcall(apr_pool_create(&pool, NULL));
+        return operator new(size, pool);
+    }
+
+    static void operator delete(void *data) {
+        apr_pool_destroy(reinterpret_cast<CYData *>(data)->pool_);
+    }
+
+};
+
 #endif/*CYPOOLING_HPP*/
index 6bfe37824815aa2333814bd6a69f74fe204b4cd5..f89d8ca9ae8820925b7fdde266104a8c1070a36c 100644 (file)
@@ -55,6 +55,8 @@
 bool CYRecvAll_(int socket, uint8_t *data, size_t size);
 bool CYSendAll_(int socket, const uint8_t *data, size_t size);
 
+extern "C" void CYHandleClient(apr_pool_t *pool, int socket);
+
 template <typename Type_>
 bool CYRecvAll(int socket, Type_ *data, size_t size) {
     return CYRecvAll_(socket, reinterpret_cast<uint8_t *>(data), size);
index cb440ec894e4838271d46aeb39eb563fb2e3c4cc..249611eb680e1e3e710c94cab723256c70dd731b 100644 (file)
--- a/makefile
+++ b/makefile
@@ -9,7 +9,7 @@ flags += -F${PKG_ROOT}/System/Library/PrivateFrameworks
 
 svn := $(shell svnversion)
 deb := $(shell grep ^Package: control | cut -d ' ' -f 2-)_$(shell grep ^Version: control | cut -d ' ' -f 2 | sed -e 's/\#/$(svn)/')_iphoneos-arm.deb
-all := cycript libcycript.dylib libcycript.plist
+all := cycript libcycript.dylib libcycript.plist Cycript.dylib
 
 header := Cycript.tab.hh Parser.hpp Pooling.hpp Struct.hpp cycript.hpp
 
@@ -58,6 +58,12 @@ lex.cy.o: lex.cy.c Cycript.tab.hh Parser.hpp Pooling.hpp
 %.o: %.mm $(header)
        $(target)g++ $(flags) -c -o $@ $<
 
+Cycript.dylib: Connector.o
+       $(target)g++ $(flags) -dynamiclib -o $@ $(filter %.o,$^) \
+           -lobjc -lapr-1 -lsubstrate \
+           -framework CoreFoundation
+       ldid -S $@
+
 libcycript.dylib: ffi_type.o parse.o Output.o Cycript.tab.o lex.cy.o Library.o
        $(target)g++ $(flags) -dynamiclib -o $@ $(filter %.o,$^) \
            -install_name /usr/lib/libcycript.dylib \
@@ -86,10 +92,9 @@ $(deb): $(all)
            cp -a Settings.plist package/Library/PreferenceLoader/Preferences/Cycript.plist; \
        fi
        if [[ -e Tweak.plist ]]; then cp -a Tweak.plist package/Library/MobileSubstrate/DynamicLibraries/Cycript.plist; fi
-       #cp -a Cycript.dylib package/Library/MobileSubstrate/DynamicLibraries
+       cp -a Cycript.dylib package/Library/MobileSubstrate/DynamicLibraries
        mkdir -p package/usr/{bin,lib}
        cp -a libcycript.dylib package/usr/lib
-       ln -s /usr/lib/libcycript.dylib package/Library/MobileSubstrate/DynamicLibraries/Cycript.dylib
        cp -a cycript package/usr/bin
        cp -a libcycript.plist package/usr/lib
        dpkg-deb -b package $(deb)