]> git.saurik.com Git - cycript.git/commitdiff
Merge CYStatement::ReplaceAll with the new CYCompound::Replace version of CYExpressio...
authorJay Freeman (saurik) <saurik@saurik.com>
Mon, 12 Jul 2010 01:32:02 +0000 (01:32 +0000)
committerJay Freeman (saurik) <saurik@saurik.com>
Mon, 12 Jul 2010 01:32:02 +0000 (01:32 +0000)
Parser.hpp
Replace.cpp

index 54ad617abbfcae0fb63e4703958bf8f66af36ed7..5d860182f315ec41d7c5a594915c1bec1edbefe7 100644 (file)
@@ -143,9 +143,7 @@ struct CYStatement :
     void Single(CYOutput &out, CYFlags flags) const;
     void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
 
-    CYStatement *ReplaceAll(CYContext &context);
     virtual CYStatement *Collapse(CYContext &context);
-
     virtual CYStatement *Replace(CYContext &context) = 0;
 
   private:
@@ -369,6 +367,15 @@ struct CYContext {
     virtual ~CYContext() {
     }
 
+    template <typename Type_>
+    void ReplaceAll(Type_ *&values) {
+        Type_ **last(&values);
+        for (Type_ *next(values); next != NULL; next = next->next_) {
+            Replace(*last);
+            last = &(*last)->next_;
+        }
+    }
+
     template <typename Type_>
     void Replace(Type_ *&value) {
         for (;;) if (value == NULL)
index 353894483deed0a2e58693bf937466d30561c50d..b804ce3cdef4f2a57e2d6b7c4abb56881523aaec 100644 (file)
@@ -86,7 +86,7 @@ CYExpression *CYAssignment::Replace(CYContext &context) {
 }
 
 CYStatement *CYBlock::Replace(CYContext &context) {
-    statements_ = statements_->ReplaceAll(context);
+    context.ReplaceAll(statements_);
     if (statements_ == NULL)
         return $ CYEmpty();
     return this;
@@ -127,7 +127,7 @@ void Catch::Replace(CYContext &context) { $T()
 
 void CYClause::Replace(CYContext &context) { $T()
     context.Replace(case_);
-    statements_ = statements_->ReplaceAll(context);
+    context.ReplaceAll(statements_);
     next_->Replace(context);
 }
 
@@ -136,9 +136,7 @@ CYStatement *CYComment::Replace(CYContext &context) {
 }
 
 CYExpression *CYCompound::Replace(CYContext &context) {
-    CYExpression **last(&expressions_);
-    for (CYExpression *next(expressions_); next != NULL; next = next->next_)
-        last = &(*last = next->Replace(context))->next_;
+    context.ReplaceAll(expressions_);
     return this;
 }
 
@@ -545,7 +543,7 @@ void CYProgram::Replace(CYContext &context) {
     CYScope scope(CYScopeProgram, context, statements_);
 
     context.nextlocal_ = $ CYNonLocal();
-    statements_ = statements_->ReplaceAll(context);
+    context.ReplaceAll(statements_);
     context.NonLocal(statements_);
 
     scope.Close();
@@ -748,13 +746,6 @@ CYStatement *CYStatement::Collapse(CYContext &context) {
     return this;
 }
 
-CYStatement *CYStatement::ReplaceAll(CYContext &context) { $T(NULL)
-    CYStatement *replace(this);
-    context.Replace(replace);
-    replace->SetNext(next_->ReplaceAll(context));
-    return replace->Collapse(context);
-}
-
 CYString *CYString::Concat(CYContext &context, CYString *rhs) const {
     size_t size(size_ + rhs->size_);
     char *value($ char[size + 1]);