]>
git.saurik.com Git - cycript.git/blob - Trampoline.t.cpp
78c81837098ff6bc0bcf97171d6c44c137da3369
   1 /* Cycript - Inlining/Optimizing JavaScript Compiler 
   2  * Copyright (C) 2009  Jay Freeman (saurik) 
   5 /* Modified BSD License {{{ */ 
   7  *        Redistribution and use in source and binary 
   8  * forms, with or without modification, are permitted 
   9  * provided that the following conditions are met: 
  11  * 1. Redistributions of source code must retain the 
  12  *    above copyright notice, this list of conditions 
  13  *    and the following disclaimer. 
  14  * 2. Redistributions in binary form must reproduce the 
  15  *    above copyright notice, this list of conditions 
  16  *    and the following disclaimer in the documentation 
  17  *    and/or other materials provided with the 
  19  * 3. The name of the author may not be used to endorse 
  20  *    or promote products derived from this software 
  21  *    without specific prior written permission. 
  23  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' 
  24  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 
  25  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
  26  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
  27  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE 
  28  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
  29  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
  30  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
  31  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
  32  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
  33  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 
  34  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
  35  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
  36  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  40 #define _PTHREAD_ATTR_T 
  41 #include <pthread_internals.h> 
  43 #include "Standard.hpp" 
  46 template <typename Type_
> 
  47 static _finline 
void dlset(Baton 
*baton
, Type_ 
&function
, const char *name
, void *handle 
= RTLD_DEFAULT
) { 
  48     function 
= reinterpret_cast<Type_
>(baton
->dlsym(handle
, name
)); 
  53 #define Framework(framework) \ 
  54     "/System/Library/Frameworks/" #framework ".framework/" #framework 
  56 void *Routine(void *arg
) { 
  57     Baton 
*baton(reinterpret_cast<Baton 
*>(arg
)); 
  59     void *(*dlopen
)(const char *, int); 
  60     dlset(baton
, dlopen
, "dlopen"); 
  62     if (baton
->dlsym(RTLD_DEFAULT
, "JSEvaluateScript") == NULL
) 
  63         dlopen(Framework(JavaScriptCore
), RTLD_GLOBAL 
| RTLD_LAZY
); 
  65     void *(*objc_getClass
)(const char *); 
  66     dlset(baton
, objc_getClass
, "objc_getClass"); 
  68     if (objc_getClass("WebUndefined") == NULL
) 
  69         dlopen(Framework(WebKit
), RTLD_GLOBAL 
| RTLD_LAZY
); 
  71     void *handle(dlopen(baton
->library
, RTLD_LAZY 
| RTLD_LOCAL
)); 
  77     void (*CYHandleServer
)(pid_t
); 
  78     dlset(baton
, CYHandleServer
, "CYHandleServer", handle
); 
  80     CYHandleServer(baton
->pid
); 
  85 static void $
bzero(void *data
, size_t size
) { 
  86     char *bytes(reinterpret_cast<char *>(data
)); 
  87     for (size_t i(0); i 
!= size
; ++i
) 
  91 extern "C" void Start(Baton 
*baton
) { 
  93     $
bzero(&self
, sizeof(self
)); 
  95     // this code comes from _pthread_set_self 
  97     baton
->__pthread_set_self(&self
); 
  99     int (*pthread_create
)(pthread_t 
*, const pthread_attr_t 
*, void *(*)(void *), void *); 
 100     dlset(baton
, pthread_create
, "pthread_create"); 
 103     baton
->pthread_create(&thread
, NULL
, &Routine
, baton
); 
 105     int (*pthread_join
)(pthread_t
, void **); 
 106     dlset(baton
, pthread_join
, "pthread_join"); 
 109     baton
->pthread_join(thread
, &result
); 
 111     mach_port_t (*mach_thread_self
)(); 
 112     dlset(baton
, mach_thread_self
, "mach_thread_self"); 
 114     kern_return_t (*thread_terminate
)(thread_act_t
); 
 115     dlset(baton
, thread_terminate
, "thread_terminate"); 
 117     baton
->thread_terminate(baton
->mach_thread_self());