From 1ef7d0617fe7f188e5bae5649552bac62718acf7 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Fri, 16 Oct 2009 22:19:56 +0000 Subject: [PATCH] Broke apart Connector from Library and fixed cases where '- -' was serialized as '--'. --- Connector.cpp | 87 +++++++++++++++++++++++++++++++++++++++++++ Library.mm | 100 ++++++++------------------------------------------ Output.cpp | 12 ++++-- Parser.hpp | 1 + Pooling.hpp | 26 ++++++++++++- cycript.hpp | 2 + makefile | 11 ++++-- 7 files changed, 148 insertions(+), 91 deletions(-) create mode 100644 Connector.cpp diff --git a/Connector.cpp b/Connector.cpp new file mode 100644 index 0000000..dddaa8b --- /dev/null +++ b/Connector.cpp @@ -0,0 +1,87 @@ +#include + +#include "cycript.hpp" +#include "Pooling.hpp" + +#include +#include +#include +#include + +#include + +#include +#include + +#import + +struct CYServer : + CYData +{ + int socket_; +}; + +apr_status_t CYPoolDLClose_(void *data) { + void *handle(reinterpret_cast(data)); + dlclose(handle); + return APR_SUCCESS; +} + +static void * APR_THREAD_FUNC Cyrver(apr_thread_t *thread, void *data) { + CYServer *server(reinterpret_cast(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(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(&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")); + } +} diff --git a/Library.mm b/Library.mm index 0dce485..2c642c6 100644 --- a/Library.mm +++ b/Library.mm @@ -48,18 +48,11 @@ #include "Pooling.hpp" #include "Struct.hpp" -#include - #include #include #include -#include -#include -#include -#include - #include #include @@ -73,8 +66,6 @@ #include "Parser.hpp" #include "Cycript.tab.hh" -#include - #include #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(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(data)->pool_); - } - - static void Finalize(JSObjectRef object) { - delete reinterpret_cast(JSObjectGetPrivate(object)); - } -}; +static void Finalize(JSObjectRef object) { + delete reinterpret_cast(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(&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; diff --git a/Output.cpp b/Output.cpp index a10705a..fdbc733 100644 --- a/Output.cpp +++ b/Output.cpp @@ -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; diff --git a/Parser.hpp b/Parser.hpp index 71bdee4..88a4b13 100644 --- a/Parser.hpp +++ b/Parser.hpp @@ -202,6 +202,7 @@ enum CYFlags { CYNoLeader = (1 << 2), CYNoTrailer = (1 << 3), CYNoIn = (1 << 4), + CYNoHyphen = (1 << 5), }; struct CYExpression : diff --git a/Pooling.hpp b/Pooling.hpp index 97bd172..73f1c80 100644 --- a/Pooling.hpp +++ b/Pooling.hpp @@ -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(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(data)->pool_); + } + +}; + #endif/*CYPOOLING_HPP*/ diff --git a/cycript.hpp b/cycript.hpp index 6bfe378..f89d8ca 100644 --- a/cycript.hpp +++ b/cycript.hpp @@ -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 bool CYRecvAll(int socket, Type_ *data, size_t size) { return CYRecvAll_(socket, reinterpret_cast(data), size); diff --git a/makefile b/makefile index cb440ec..249611e 100644 --- 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) -- 2.47.2