Support ECMAScript 1-5 for-in initializers syntax.
authorJay Freeman (saurik) <saurik@saurik.com>
Sat, 12 Dec 2015 14:47:18 +0000 (06:47 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Sat, 12 Dec 2015 14:47:18 +0000 (06:47 -0800)
Output.cpp
Parser.ypp.in
Replace.cpp
Syntax.hpp

index 4506db614accb9be3ce02887db811e9ddf8dd4c8..22e2149dd85a47702d2b6348bb70fb42132b67db 100644 (file)
@@ -408,6 +408,13 @@ void CYForIn::Output(CYOutput &out, CYFlags flags) const {
     code_->Single(out, CYRight(flags), CYCompactShort);
 }
 
     code_->Single(out, CYRight(flags), CYCompactShort);
 }
 
+void CYForInitialized::Output(CYOutput &out, CYFlags flags) const {
+    out << "for" << ' ' << '(' << "var" << ' ';
+    declaration_->Output(out, CYNoIn | CYNoRightHand);
+    out << ' ' << "in" << ' ' << *set_ << ')';
+    code_->Single(out, CYRight(flags), CYCompactShort);
+}
+
 void CYForInComprehension::Output(CYOutput &out) const {
     out << "for" << ' ' << '(';
     declaration_->Output(out, CYNoIn | CYNoRightHand);
 void CYForInComprehension::Output(CYOutput &out) const {
     out << "for" << ' ' << '(';
     declaration_->Output(out, CYNoIn | CYNoRightHand);
index 97974929e8b0c1145e9624cbe5cd0dd29ea928be..e453814faffeb86e41ddbcefa28a77f203af68a7 100644 (file)
@@ -1402,6 +1402,7 @@ IterationStatement
     : "do" Statement "while" "(" Expression ")" TerminatorOpt { $$ = CYNew CYDoWhile($5, $2); }
     | "while" "(" Expression ")" Statement { $$ = CYNew CYWhile($3, $5); }
     | "for" "(" LexPushInOn ForStatementInitializer LexPopIn ExpressionOpt ";" ExpressionOpt ")" Statement { $$ = CYNew CYFor($4, $6, $8, $10); }
     : "do" Statement "while" "(" Expression ")" TerminatorOpt { $$ = CYNew CYDoWhile($5, $2); }
     | "while" "(" Expression ")" Statement { $$ = CYNew CYWhile($3, $5); }
     | "for" "(" LexPushInOn ForStatementInitializer LexPopIn ExpressionOpt ";" ExpressionOpt ")" Statement { $$ = CYNew CYFor($4, $6, $8, $10); }
+    | "for" "(" LexPushInOn LexSetRegExp Var_ BindingIdentifier Initializer "!in" LexPopIn Expression ")" Statement { $$ = CYNew CYForInitialized(CYNew CYDeclaration($6, $7), $10, $12); }
     | "for" "(" LexPushInOn ForInStatementInitializer "!in" LexPopIn Expression ")" Statement { $$ = CYNew CYForIn($4, $7, $9); }
     | "for" "(" LexPushInOn ForInStatementInitializer "of" LexPopIn AssignmentExpression ")" Statement { $$ = CYNew CYForOf($4, $7, $9); }
     ;
     | "for" "(" LexPushInOn ForInStatementInitializer "!in" LexPopIn Expression ")" Statement { $$ = CYNew CYForIn($4, $7, $9); }
     | "for" "(" LexPushInOn ForInStatementInitializer "of" LexPopIn AssignmentExpression ")" Statement { $$ = CYNew CYForOf($4, $7, $9); }
     ;
index 6cd356126c61f45383a1225df9a451563880135e..337e00ed8ceeb2d069b50081f5e78d3d2cad66a5 100644 (file)
@@ -449,6 +449,13 @@ CYStatement *CYForIn::Replace(CYContext &context) {
     return this;
 }
 
     return this;
 }
 
+CYStatement *CYForInitialized::Replace(CYContext &context) {
+    CYAssignment *assignment(declaration_->Replace(context, CYIdentifierVariable));
+    return $ CYBlock($$
+        ->* (assignment == NULL ? NULL : $ CYExpress(assignment))
+        ->* $ CYForIn(declaration_->Target(context), set_, code_));
+}
+
 CYFunctionParameter *CYForInComprehension::Parameter(CYContext &context) const {
     return $ CYFunctionParameter(declaration_);
 }
 CYFunctionParameter *CYForInComprehension::Parameter(CYContext &context) const {
     return $ CYFunctionParameter(declaration_);
 }
index db2b81662b5bf9fdd81cb2c0d58dc003de490a69..ec94441cce74905a40cefb31567253aceb063e00 100644 (file)
@@ -1328,6 +1328,26 @@ struct CYForIn :
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
+struct CYForInitialized :
+    CYStatement
+{
+    CYDeclaration *declaration_;
+    CYExpression *set_;
+    CYStatement *code_;
+
+    CYForInitialized(CYDeclaration *declaration, CYExpression *set, CYStatement *code) :
+        declaration_(declaration),
+        set_(set),
+        code_(code)
+    {
+    }
+
+    CYCompact(Long)
+
+    virtual CYStatement *Replace(CYContext &context);
+    virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
 struct CYForOf :
     CYStatement
 {
 struct CYForOf :
     CYStatement
 {