]> git.saurik.com Git - cycript.git/commitdiff
Rewrote for-each-in in terms of let, and replaced let with with.
authorJay Freeman (saurik) <saurik@saurik.com>
Tue, 27 Oct 2009 22:33:05 +0000 (22:33 +0000)
committerJay Freeman (saurik) <saurik@saurik.com>
Tue, 27 Oct 2009 22:33:05 +0000 (22:33 +0000)
Parser.hpp
Replace.cpp
Replace.hpp

index 2dc89ce848f0d9c37eac79ec220841360f8d8524..c094018e8471c62a26b8012146965787bad16ec5 100644 (file)
@@ -929,13 +929,31 @@ struct CYArray :
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
+struct CYProperty :
+    CYNext<CYProperty>,
+    CYThing
+{
+    CYPropertyName *name_;
+    CYExpression *value_;
+
+    CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
+        CYNext<CYProperty>(next),
+        name_(name),
+        value_(value)
+    {
+    }
+
+    void Replace(CYContext &context);
+    virtual void Output(CYOutput &out) const;
+};
+
 struct CYDeclaration :
     CYForInInitialiser
 {
     CYIdentifier *identifier_;
     CYExpression *initialiser_;
 
-    CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser) :
+    CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
         identifier_(identifier),
         initialiser_(initialiser)
     {
@@ -967,6 +985,7 @@ struct CYDeclarations :
     virtual void For(CYOutput &out) const;
 
     void Replace(CYContext &context);
+    CYProperty *Property(CYContext &context);
 
     virtual void Output(CYOutput &out) const;
     virtual void Output(CYOutput &out, CYFlags flags) const;
@@ -1058,24 +1077,6 @@ struct CYForEachIn :
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
-struct CYProperty :
-    CYNext<CYProperty>,
-    CYThing
-{
-    CYPropertyName *name_;
-    CYExpression *value_;
-
-    CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
-        CYNext<CYProperty>(next),
-        name_(name),
-        value_(value)
-    {
-    }
-
-    void Replace(CYContext &context);
-    virtual void Output(CYOutput &out) const;
-};
-
 struct CYObject :
     CYLiteral
 {
index 5a2ed376d8da5a54a2ec217c51e6a69e8f0e3875..fe935572086d0ae45f0dd0de494492696a044b9c 100644 (file)
@@ -171,6 +171,10 @@ void CYDeclaration::Replace(CYContext &context) {
     context.Replace(initialiser_);
 }
 
+CYProperty *CYDeclarations::Property(CYContext &context) { $T(NULL)
+    return $ CYProperty(declaration_->identifier_, declaration_->initialiser_ ?: $U, next_->Property(context));
+}
+
 void CYDeclarations::Replace(CYContext &context) { $T()
     declaration_->Replace(context);
     next_->Replace(context);
@@ -259,13 +263,12 @@ CYStatement *CYForInComprehension::Replace(CYContext &context, CYStatement *stat
 CYStatement *CYForEachIn::Replace(CYContext &context) {
     CYVariable *cys($V("$cys")), *cyt($V("$cyt"));
 
-    return $ CYWith($ CYObject($ CYProperty($S("$cys"), $D(0), $ CYProperty($S("$cyt"), $D(0)))), $ CYBlock($$->*
-        $E($ CYAssign(cys, set_))->*
+    return $ CYLet($L2($L($I("$cys"), set_), $L($I("$cyt"))), $$->*
         $ CYForIn(cyt, cys, $ CYBlock($$->*
             $E($ CYAssign(initialiser_->ForEachIn(context), $M(cys, cyt)))->*
             code_
         ))
-    ));
+    );
 }
 
 CYFunctionParameter *CYForEachInComprehension::Parameter(CYContext &context) const {
@@ -334,6 +337,10 @@ CYStatement *CYLabel::Replace(CYContext &context) {
     return NULL;
 }
 
+CYStatement *CYLet::Replace(CYContext &context) {
+    return $ CYWith($ CYObject(declarations_->Property(context)), &code_);
+}
+
 void CYMember::Replace_(CYContext &context) {
     context.Replace(object_);
     context.Replace(property_);
index 493ea30a2cf8df41e17d55d956be91b8770f90c1..5bffa07152d30db3ae4673e01d7319301eb295f3 100644 (file)
@@ -59,6 +59,8 @@
     ($ CYFunctionParameter(args))
 #define $S(args...) \
     ($ CYString(args))
+#define $U \
+    $V("undefined")
 #define $V(name) \
     ($ CYVariable($I(name)))
 
 #define $N5(func, args...) \
     $N(func, $C5_(args))
 
+#define $L(args...) \
+    $ CYDeclaration(args)
+#define $L1(arg0) \
+    $ CYDeclarations(arg0)
+#define $L2(arg0, args...) \
+    $ CYDeclarations(arg0, $L1(args))
+#define $L3(arg0, args...) \
+    $ CYDeclarations(arg0, $L2(args))
+#define $L4(arg0, args...) \
+    $ CYDeclarations(arg0, $L3(args))
+#define $L5(arg0, args...) \
+    $ CYDeclarations(arg0, $L4(args))
+
 #endif/*REPLACE_HPP*/