From de9fc71b1efd1cbcd5049e5b7c162844a6909a6c Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Wed, 18 Nov 2009 20:31:58 +0000 Subject: [PATCH] Fixed a bug where the identifier merging algorithm would fail horribly on pre-merged identfiers and factored the weird variable rename debugging code to -grename. --- Console.cpp | 17 ++++++++--------- Replace.cpp | 8 ++++++-- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/Console.cpp b/Console.cpp index 65eeb4f..b6bcedf 100644 --- a/Console.cpp +++ b/Console.cpp @@ -112,10 +112,8 @@ void Setup(CYDriver &driver, cy::parser &parser) { driver.strict_ = true; } -void Setup(CYOutput &out, CYDriver &driver) { +void Setup(CYOutput &out, CYDriver &driver, CYOptions &options) { out.pretty_ = pretty_; - - CYOptions options; CYContext context(driver.pool_, options); driver.program_->Replace(context); } @@ -183,7 +181,7 @@ void Run(int client, std::string &code, FILE *fout = NULL, bool expand = false) int (*append_history$)(int, const char *); -static void Console(apr_pool_t *pool, int client) { +static void Console(apr_pool_t *pool, int client, CYOptions &options) { passwd *passwd; if (const char *username = getenv("LOGNAME")) passwd = getpwnam(username); @@ -325,9 +323,8 @@ static void Console(apr_pool_t *pool, int client) { code = command; else { std::ostringstream str; - CYOptions options; CYOutput out(str, options); - Setup(out, driver); + Setup(out, driver, options); out << *driver.program_; code = str.str(); } @@ -375,6 +372,7 @@ void InjectLibrary(pid_t pid); int Main(int argc, char const * const argv[], char const * const envp[]) { bool tty(isatty(STDIN_FILENO)); bool compile(false); + CYOptions options; append_history$ = reinterpret_cast(dlsym(RTLD_DEFAULT, "append_history")); @@ -422,6 +420,8 @@ int Main(int argc, char const * const argv[], char const * const envp[]) { case 'g': if (false); + else if (strcmp(arg, "rename") == 0) + options.verbose_ = true; #if YYDEBUG else if (strcmp(arg, "bison") == 0) bison_ = true; @@ -568,7 +568,7 @@ int Main(int argc, char const * const argv[], char const * const envp[]) { #endif if (script == NULL && tty) - Console(pool, client); + Console(pool, client, options); else { CYDriver driver(script ?: ""); cy::parser parser(driver); @@ -608,9 +608,8 @@ int Main(int argc, char const * const argv[], char const * const envp[]) { Run(client, code, stdout); } else { std::ostringstream str; - CYOptions options; CYOutput out(str, options); - Setup(out, driver); + Setup(out, driver, options); out << *driver.program_; std::string code(str.str()); if (compile) diff --git a/Replace.cpp b/Replace.cpp index 37b7068..0cfbfdc 100644 --- a/Replace.cpp +++ b/Replace.cpp @@ -368,8 +368,9 @@ CYStatement *CYFunctionStatement::Replace(CYContext &context) { } CYIdentifier *CYIdentifier::Replace(CYContext &context) { - if (replace_ == NULL) - replace_ = context.scope_->Lookup(context, this); + if (replace_ != NULL && replace_ != this) + return replace_->Replace(context); + replace_ = context.scope_->Lookup(context, this); return replace_; } @@ -481,6 +482,8 @@ void CYProgram::Replace(CYContext &context) { // XXX: totalling the probable occurrences and sorting by them would improve the result for (CYIdentifierAddressVector::const_iterator i(rename_.begin()); i != rename_.end(); ++i, ++offset) { + //std::cout << *i << ":" << (*i)->offset_ << std::endl; + const char *name; if (context.options_.verbose_) @@ -610,6 +613,7 @@ void CYScope::Scope(CYContext &context, CYStatement *&statements) { for (CYIdentifierValueSet::const_iterator i(identifiers_.begin()); i != identifiers_.end(); ++i) if (internal_.find(*i) == internal_.end()) { + //std::cout << *i << '=' << offset << std::endl; if ((*i)->offset_ < offset) (*i)->offset_ = offset; parent_->Merge(context, *i); -- 2.47.2