From 0df6a201bcded42c2e96ed5d2826fba49b162491 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Fri, 10 Jan 2014 02:03:52 -0800 Subject: [PATCH] Do Cycript compilation in the client (fix ?debug). --- Console.cpp | 89 +++++++++++++---------------------------------------- Handler.mm | 44 +++++++++----------------- 2 files changed, 36 insertions(+), 97 deletions(-) diff --git a/Console.cpp b/Console.cpp index 57c38e6..35aa586 100644 --- a/Console.cpp +++ b/Console.cpp @@ -26,6 +26,7 @@ #endif #include +#include #include #include @@ -42,8 +43,6 @@ #include #endif -#include - #include #include @@ -578,15 +577,11 @@ static void Console(CYOptions &options) { if (driver.program_ == NULL) goto restart; - if (client_ != -1) - code = command_; - else { - std::ostringstream str; - CYOutput out(str, options); - Setup(out, driver, options); - out << *driver.program_; - code = str.str(); - } + std::ostringstream str; + CYOutput out(str, options); + Setup(out, driver, options); + out << *driver.program_; + code = str.str(); } history += command_; @@ -600,23 +595,6 @@ static void Console(CYOptions &options) { } } -static void *Map(const char *path, size_t *psize) { - int fd; - _syscall(fd = open(path, O_RDONLY)); - - struct stat stat; - _syscall(fstat(fd, &stat)); - size_t size(stat.st_size); - - *psize = size; - - void *base; - _syscall(base = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0)); - - _syscall(close(fd)); - return base; -} - void InjectLibrary(pid_t pid); int Main(int argc, char const * const argv[], char const * const envp[]) { @@ -878,56 +856,33 @@ int Main(int argc, char const * const argv[], char const * const envp[]) { else { CYLocalPool pool; - char *start, *end; - std::istream *indirect; - + std::istream *stream; if (script == NULL) { - start = NULL; - end = NULL; - indirect = &std::cin; + stream = &std::cin; + script = ""; } else { - size_t size; - start = reinterpret_cast(Map(script, &size)); - end = start + size; - - if (size >= 2 && start[0] == '#' && start[1] == '!') { - start += 2; - - if (void *line = memchr(start, '\n', end - start)) - start = reinterpret_cast(line); - else - start = end; - } - - indirect = NULL; + stream = new std::fstream(script, std::ios::in | std::ios::binary); + _assert(!stream->fail()); } - CYStream direct(start, end); - std::istream &stream(indirect == NULL ? direct : *indirect); - CYDriver driver(stream, script ?: ""); - + CYDriver driver(*stream, script); cy::parser parser(driver); Setup(driver, parser); if (parser.parse() != 0 || !driver.errors_.empty()) { for (CYDriver::Errors::const_iterator i(driver.errors_.begin()); i != driver.errors_.end(); ++i) std::cerr << i->location_.begin << ": " << i->message_ << std::endl; - } else if (driver.program_ != NULL) - if (client_ != -1) { - // XXX: this code means that you can't pipe to another process - std::string code(start, end-start); + } else if (driver.program_ != NULL) { + std::ostringstream str; + CYOutput out(str, options); + Setup(out, driver, options); + out << *driver.program_; + std::string code(str.str()); + if (compile) + std::cout << code; + else Run(client_, false, code, &std::cout); - } else { - std::ostringstream str; - CYOutput out(str, options); - Setup(out, driver, options); - out << *driver.program_; - std::string code(str.str()); - if (compile) - std::cout << code; - else - Run(client_, false, code, &std::cout); - } + } } apr_pool_destroy(pool); diff --git a/Handler.mm b/Handler.mm index e7b2c3b..a064c78 100644 --- a/Handler.mm +++ b/Handler.mm @@ -100,36 +100,20 @@ struct CYClient : return; data[size] = '\0'; - CYStream stream(data, data + size); - CYDriver driver(stream); - - cy::parser parser(driver); - - const char *json; - if (parser.parse() != 0 || !driver.errors_.empty()) { - json = NULL; - size = _not(uint32_t); - } else { - NSAutoreleasePool *ar = [[NSAutoreleasePool alloc] init]; - - CYOptions options; - CYContext context(options); - driver.program_->Replace(context); - std::ostringstream str; - CYOutput out(str, options); - out << *driver.program_; - std::string code(str.str()); - CYExecute_ execute = {pool, code.c_str()}; - NSValue *value([NSValue valueWithPointer:&execute]); - if (dispatch) - [client performSelectorOnMainThread:@selector(execute:) withObject:value waitUntilDone:YES]; - else - [client execute:value]; - json = execute.data_; - size = json == NULL ? _not(uint32_t) : strlen(json); - - [ar release]; - } + NSAutoreleasePool *ar = [[NSAutoreleasePool alloc] init]; + + std::string code(data, size); + CYExecute_ execute = {pool, code.c_str()}; + NSValue *value([NSValue valueWithPointer:&execute]); + if (dispatch) + [client performSelectorOnMainThread:@selector(execute:) withObject:value waitUntilDone:YES]; + else + [client execute:value]; + + const char *json(execute.data_); + size = json == NULL ? _not(uint32_t) : strlen(json); + + [ar release]; if (!CYSendAll(socket_, &size, sizeof(size))) return; -- 2.45.2