]> git.saurik.com Git - cycript.git/commitdiff
Preserve declaration initialisers replacing for-in.
authorJay Freeman (saurik) <saurik@saurik.com>
Tue, 5 Jun 2012 06:56:42 +0000 (23:56 -0700)
committerJay Freeman (saurik) <saurik@saurik.com>
Tue, 5 Jun 2012 07:31:26 +0000 (00:31 -0700)
Parser.hpp
Replace.cpp

index 19addb8dc7b0226292e588c6b038b938adc74ee8..d711d1db1e008a4360d0bdf2e842833d0d6e1852 100644 (file)
@@ -98,6 +98,7 @@ struct CYPropertyName {
 };
 
 struct CYExpression;
+struct CYAssignment;
 
 enum CYNeeded {
     CYNever     = -1,
@@ -541,6 +542,7 @@ struct CYForInInitialiser {
     virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value) = 0;
 
     virtual CYExpression *Replace(CYContext &context) = 0;
+    virtual CYAssignment *Assignment(CYContext &context) = 0;
 };
 
 struct CYNumber;
@@ -573,6 +575,7 @@ struct CYExpression :
     virtual void ClassName(CYOutput &out, bool object) const;
 
     virtual CYExpression *Replace(CYContext &context) = 0;
+    virtual CYAssignment *Assignment(CYContext &context);
 
     virtual CYExpression *Primitive(CYContext &context) {
         return this;
index fb8363002c82b4f86a012b84a26f6d534b37c8f8..3818c0bc5348aa9837b465ca632f6b33bc1beea0 100644 (file)
@@ -270,6 +270,10 @@ CYStatement *CYExpression::ForEachIn(CYContext &context, CYExpression *value) {
     return $E($ CYAssign(this, value));
 }
 
+CYAssignment *CYExpression::Assignment(CYContext &context) {
+    return NULL;
+}
+
 CYNumber *CYFalse::Number(CYContext &context) {
     return $D(0);
 }
@@ -291,11 +295,19 @@ CYStatement *CYFor::Replace(CYContext &context) {
 }
 
 CYStatement *CYForIn::Replace(CYContext &context) {
-    // XXX: this actually might need a prefix statement
+    CYAssignment *assignment(initialiser_->Assignment(context));
+
     context.Replace(initialiser_);
     context.Replace(set_);
     context.Replace(code_);
-    return this;
+
+    if (assignment == NULL)
+        return this;
+
+    return $ CYBlock($$->*
+        $E(assignment)->*
+        this
+    );
 }
 
 CYFunctionParameter *CYForInComprehension::Parameter(CYContext &context) const {