]>
git.saurik.com Git - cycript.git/blob - Trampoline.t.cpp
ad1f5156643b77a75f5eacefb634c690b3793843
   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
)); 
  51 void *Routine(void *arg
) { 
  52     Baton 
*baton(reinterpret_cast<Baton 
*>(arg
)); 
  54     void *(*dlopen
)(const char *, int); 
  55     dlset(baton
, dlopen
, "dlopen"); 
  57     void *handle(dlopen(baton
->library
, RTLD_LAZY 
| RTLD_LOCAL
)); 
  59     void (*CYHandleServer
)(pid_t
); 
  60     dlset(baton
, CYHandleServer
, "CYHandleServer", handle
); 
  62     CYHandleServer(baton
->pid
); 
  67 static void $
bzero(void *data
, size_t size
) { 
  68     char *bytes(reinterpret_cast<char *>(data
)); 
  69     for (size_t i(0); i 
!= size
; ++i
) 
  73 extern "C" void Start(Baton 
*baton
) { 
  75     $
bzero(&self
, sizeof(self
)); 
  77     // this code comes from _pthread_set_self 
  79     baton
->__pthread_set_self(&self
); 
  81     int (*pthread_create
)(pthread_t 
*, const pthread_attr_t 
*, void *(*)(void *), void *); 
  82     dlset(baton
, pthread_create
, "pthread_create"); 
  85     baton
->pthread_create(&thread
, NULL
, &Routine
, baton
); 
  87     int (*pthread_join
)(pthread_t
, void **); 
  88     dlset(baton
, pthread_join
, "pthread_join"); 
  91     baton
->pthread_join(thread
, &result
); 
  93     mach_port_t (*mach_thread_self
)(); 
  94     dlset(baton
, mach_thread_self
, "mach_thread_self"); 
  96     kern_return_t (*thread_terminate
)(thread_act_t
); 
  97     dlset(baton
, thread_terminate
, "thread_terminate"); 
  99     baton
->thread_terminate(baton
->mach_thread_self());