]> git.saurik.com Git - cycript.git/blobdiff - Handler.mm
On Mac OS X 10.9, cstddef is needed for offsetof.
[cycript.git] / Handler.mm
index 833ebf3450cf165cd423d9edefba93f4b522fe60..39624e3a08204609003955916cfe93c3db45375d 100644 (file)
@@ -1,40 +1,22 @@
-/* Cycript - Inlining/Optimizing JavaScript Compiler
- * Copyright (C) 2009  Jay Freeman (saurik)
+/* Cycript - Optimizing JavaScript Compiler/Runtime
+ * Copyright (C) 2009-2013  Jay Freeman (saurik)
 */
 
-/* Modified BSD License {{{ */
+/* GNU General Public License, Version 3 {{{ */
 /*
- *        Redistribution and use in source and binary
- * forms, with or without modification, are permitted
- * provided that the following conditions are met:
+ * Cycript is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
  *
- * 1. Redistributions of source code must retain the
- *    above copyright notice, this list of conditions
- *    and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the
- *    above copyright notice, this list of conditions
- *    and the following disclaimer in the documentation
- *    and/or other materials provided with the
- *    distribution.
- * 3. The name of the author may not be used to endorse
- *    or promote products derived from this software
- *    without specific prior written permission.
+ * Cycript is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
  *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
+ * You should have received a copy of the GNU General Public License
+ * along with Cycript.  If not, see <http://www.gnu.org/licenses/>.
+**/
 /* }}} */
 
 #include "cycript.hpp"
@@ -46,7 +28,7 @@
 #include "Cycript.tab.hh"
 
 #include <Foundation/Foundation.h>
-#include <apr_thread_proc.h>
+#include <pthread.h>
 #include <unistd.h>
 #include <sstream>
 
@@ -56,7 +38,7 @@
 #include <sys/un.h>
 
 struct CYExecute_ {
-    apr_pool_t *pool_;
+    CYPool &pool_;
     const char * volatile data_;
 };
 
@@ -74,7 +56,7 @@ struct CYExecute_ {
     CYExecute_ *execute(reinterpret_cast<CYExecute_ *>([value pointerValue]));
     const char *data(execute->data_);
     execute->data_ = NULL;
-    execute->data_ = CYExecute(execute->pool_, data);
+    execute->data_ = CYExecute(execute->pool_, CYUTF8String(data));
 }
 
 @end
@@ -83,7 +65,7 @@ struct CYClient :
     CYData
 {
     int socket_;
-    apr_thread_t *thread_;
+    pthread_t thread_;
 
     CYClient(int socket) :
         socket_(socket)
@@ -107,31 +89,30 @@ struct CYClient :
             dispatch = false;
 
         for (;;) {
-            size_t size;
+            uint32_t size;
             if (!CYRecvAll(socket_, &size, sizeof(size)))
                 return;
 
-            CYPool pool;
+            CYLocalPool pool;
             char *data(new(pool) char[size + 1]);
             if (!CYRecvAll(socket_, data, size))
                 return;
             data[size] = '\0';
 
-            CYDriver driver;
-            cy::parser parser(driver);
+            CYStream stream(data, data + size);
+            CYDriver driver(stream);
 
-            driver.data_ = data;
-            driver.size_ = size;
+            cy::parser parser(driver);
 
             const char *json;
             if (parser.parse() != 0 || !driver.errors_.empty()) {
                 json = NULL;
-                size = _not(size_t);
+                size = _not(uint32_t);
             } else {
                 NSAutoreleasePool *ar = [[NSAutoreleasePool alloc] init];
 
                 CYOptions options;
-                CYContext context(driver.pool_, options);
+                CYContext context(options);
                 driver.program_->Replace(context);
                 std::ostringstream str;
                 CYOutput out(str, options);
@@ -144,7 +125,7 @@ struct CYClient :
                 else
                     [client execute:value];
                 json = execute.data_;
-                size = json == NULL ? _not(size_t) : strlen(json);
+                size = json == NULL ? _not(uint32_t) : strlen(json);
 
                 [ar release];
             }
@@ -160,18 +141,16 @@ struct CYClient :
     }
 };
 
-static void * APR_THREAD_FUNC OnClient(apr_thread_t *thread, void *data) {
+static void *OnClient(void *data) {
     CYClient *client(reinterpret_cast<CYClient *>(data));
     client->Handle();
     delete client;
     return NULL;
 }
 
-extern "C" void CYHandleClient(apr_pool_t *pool, int socket) {
+extern "C" void CYHandleClient(CYPool &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_));
+    _assert(pthread_create(&client->thread_, NULL, &OnClient, client) == 0);
 }
 
 extern "C" void CYHandleServer(pid_t pid) {
@@ -185,10 +164,8 @@ extern "C" void CYHandleServer(pid_t pid) {
 
         _syscall(connect(socket, reinterpret_cast<sockaddr *>(&address), SUN_LEN(&address)));
 
-        apr_pool_t *pool;
-        apr_pool_create(&pool, NULL);
-
-        CYHandleClient(pool, socket);
+        // XXX: this leaks memory... really?
+        CYHandleClient(*new CYPool(), socket);
     } catch (const CYException &error) {
         CYPool pool;
         fprintf(stderr, "%s\n", error.PoolCString(pool));