]> git.saurik.com Git - cycript.git/blobdiff - Replace.cpp
Remove as many double-replaces as could be found.
[cycript.git] / Replace.cpp
index 3818c0bc5348aa9837b465ca632f6b33bc1beea0..5ec0b9346c12d69433011f2857d015417ead414b 100644 (file)
@@ -55,7 +55,6 @@ CYExpression *CYAdd::Replace(CYContext &context) {
 }
 
 CYExpression *CYAddressOf::Replace(CYContext &context) {
-    CYPrefix::Replace(context);
     return $C0($M(rhs_, $S("$cya")));
 }
 
@@ -196,8 +195,16 @@ CYStatement *CYContinue::Replace(CYContext &context) {
 }
 
 CYAssignment *CYDeclaration::Assignment(CYContext &context) {
-    CYExpression *variable(Replace(context));
-    return initialiser_ == NULL ? NULL : $ CYAssign(variable, initialiser_);
+    if (initialiser_ == NULL)
+        return NULL;
+
+    CYAssignment *value($ CYAssign(Variable(context), initialiser_));
+    initialiser_ = NULL;
+    return value;
+}
+
+CYVariable *CYDeclaration::Variable(CYContext &context) {
+    return $V(identifier_);
 }
 
 CYStatement *CYDeclaration::ForEachIn(CYContext &context, CYExpression *value) {
@@ -207,22 +214,36 @@ CYStatement *CYDeclaration::ForEachIn(CYContext &context, CYExpression *value) {
 CYExpression *CYDeclaration::Replace(CYContext &context) {
     context.Replace(identifier_);
     context.scope_->Declare(context, identifier_, CYIdentifierVariable);
-    return $V(identifier_);
+    return Variable(context);
+}
+
+void CYDeclarations::Replace(CYContext &context) { $T()
+    declaration_->Replace(context);
+    next_->Replace(context);
 }
 
 CYProperty *CYDeclarations::Property(CYContext &context) { $T(NULL)
     return $ CYProperty(declaration_->identifier_, declaration_->initialiser_ ?: $U, next_->Property(context));
 }
 
-CYCompound *CYDeclarations::Replace(CYContext &context) {
-    CYCompound *compound(next_ == NULL ? $ CYCompound() : next_->Replace(context));
+CYFunctionParameter *CYDeclarations::Parameter(CYContext &context) { $T(NULL)
+    return $ CYFunctionParameter(declaration_->identifier_, next_->Parameter(context));
+}
+
+CYArgument *CYDeclarations::Argument(CYContext &context) { $T(NULL)
+    return $ CYArgument(declaration_->initialiser_ ?: $U, next_->Argument(context));
+}
+
+CYCompound *CYDeclarations::Compound(CYContext &context) { $T(NULL)
+    CYCompound *compound(next_->Compound(context) ?: $ CYCompound());
     if (CYAssignment *assignment = declaration_->Assignment(context))
         compound->AddPrev(assignment);
     return compound;
 }
 
 CYExpression *CYDirectMember::Replace(CYContext &context) {
-    Replace_(context);
+    context.Replace(object_);
+    context.Replace(property_);
     return this;
 }
 
@@ -294,20 +315,23 @@ CYStatement *CYFor::Replace(CYContext &context) {
     return this;
 }
 
+CYCompound *CYForDeclarations::Replace(CYContext &context) {
+    declarations_->Replace(context);
+    return declarations_->Compound(context);
+}
+
+// XXX: this still feels highly suboptimal
 CYStatement *CYForIn::Replace(CYContext &context) {
-    CYAssignment *assignment(initialiser_->Assignment(context));
+    if (CYAssignment *assignment = initialiser_->Assignment(context))
+        return $ CYBlock($$->*
+            $E(assignment)->*
+            this
+        );
 
     context.Replace(initialiser_);
     context.Replace(set_);
     context.Replace(code_);
-
-    if (assignment == NULL)
-        return this;
-
-    return $ CYBlock($$->*
-        $E(assignment)->*
-        this
-    );
+    return this;
 }
 
 CYFunctionParameter *CYForInComprehension::Parameter(CYContext &context) const {
@@ -427,12 +451,10 @@ CYStatement *CYIfComprehension::Replace(CYContext &context, CYStatement *stateme
 }
 
 CYExpression *CYIndirect::Replace(CYContext &context) {
-    CYPrefix::Replace(context);
     return $M(rhs_, $S("$cyi"));
 }
 
 CYExpression *CYIndirectMember::Replace(CYContext &context) {
-    Replace_(context);
     return $M($ CYIndirect(object_), property_);
 }
 
@@ -448,12 +470,7 @@ CYStatement *CYLabel::Replace(CYContext &context) {
 }
 
 CYStatement *CYLet::Replace(CYContext &context) {
-    return $ CYWith($ CYObject(declarations_->Property(context)), &code_);
-}
-
-void CYMember::Replace_(CYContext &context) {
-    context.Replace(object_);
-    context.Replace(property_);
+    return $E($ CYCall($ CYFunctionExpression(NULL, declarations_->Parameter(context), code_), declarations_->Argument(context)));
 }
 
 namespace cy {
@@ -804,7 +821,8 @@ CYStatement *Try::Replace(CYContext &context) {
 } }
 
 CYStatement *CYVar::Replace(CYContext &context) {
-    return $E(declarations_->Replace(context));
+    declarations_->Replace(context);
+    return $E(declarations_->Compound(context));
 }
 
 CYExpression *CYVariable::Replace(CYContext &context) {