]> git.saurik.com Git - cycript.git/commitdiff
Preserve var semantics while desugaring for-each.
authorJay Freeman (saurik) <saurik@saurik.com>
Mon, 4 Jun 2012 23:56:04 +0000 (16:56 -0700)
committerJay Freeman (saurik) <saurik@saurik.com>
Mon, 4 Jun 2012 23:56:04 +0000 (16:56 -0700)
Parser.hpp
Replace.cpp

index 24b356418841b41cded8075e1a5d183b6549fc56..b133af294fdf6453353a37beaebcf9198e334102 100644 (file)
@@ -539,7 +539,7 @@ struct CYForInInitialiser {
 
     virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
     virtual const char *ForEachIn() const = 0;
-    virtual CYExpression *ForEachIn(CYContext &out) = 0;
+    virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value) = 0;
     virtual CYExpression *Replace(CYContext &context) = 0;
 };
 
@@ -563,7 +563,7 @@ struct CYExpression :
     virtual void ForIn(CYOutput &out, CYFlags flags) const;
 
     virtual const char *ForEachIn() const;
-    virtual CYExpression *ForEachIn(CYContext &out);
+    virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
 
     virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
 
@@ -1169,7 +1169,7 @@ struct CYDeclaration :
     virtual void ForIn(CYOutput &out, CYFlags flags) const;
 
     virtual const char *ForEachIn() const;
-    virtual CYExpression *ForEachIn(CYContext &out);
+    virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
 
     virtual CYExpression *Replace(CYContext &context);
     virtual CYAssignment *Assignment(CYContext &context);
index e6b761f6bdd17b34e8d3744f13bc9953f7c6ec0f..00f6419621d4abad1a2e16bb99cde8b77d692a49 100644 (file)
@@ -198,8 +198,8 @@ CYAssignment *CYDeclaration::Assignment(CYContext &context) {
     return initialiser_ == NULL ? NULL : $ CYAssign(variable, initialiser_);
 }
 
-CYExpression *CYDeclaration::ForEachIn(CYContext &context) {
-    return $V(identifier_);
+CYStatement *CYDeclaration::ForEachIn(CYContext &context, CYExpression *value) {
+    return $ CYVar($L1($L(identifier_, value)));
 }
 
 CYExpression *CYDeclaration::Replace(CYContext &context) {
@@ -271,8 +271,8 @@ CYExpression *CYExpression::ClassName(CYContext &context, bool object) {
     return this;
 }
 
-CYExpression *CYExpression::ForEachIn(CYContext &context) {
-    return this;
+CYStatement *CYExpression::ForEachIn(CYContext &context, CYExpression *value) {
+    return $E($ CYAssign(this, value));
 }
 
 CYNumber *CYFalse::Number(CYContext &context) {
@@ -316,7 +316,7 @@ CYStatement *CYForEachIn::Replace(CYContext &context) {
 
     return $ CYLet($L2($L(cys, set_), $L(cyt)), $$->*
         $ CYForIn($V(cyt), $V(cys), $ CYBlock($$->*
-            $E($ CYAssign(initialiser_->ForEachIn(context), $M($V(cys), $V(cyt))))->*
+            initialiser_->ForEachIn(context, $M($V(cys), $V(cyt)))->*
             code_
         ))
     );