]> git.saurik.com Git - cycript.git/blobdiff - Replace.cpp
Verify lexer tokens are always default reductions.
[cycript.git] / Replace.cpp
index 6cd356126c61f45383a1225df9a451563880135e..2cb447499c7df2fc9428e3ef19d3678aee822f5c 100644 (file)
@@ -107,12 +107,12 @@ CYTarget *CYArray::Replace(CYContext &context) {
 }
 
 CYTarget *CYArrayComprehension::Replace(CYContext &context) {
-    CYVariable *cyv($V("$cyv"));
+    CYIdentifier *cyv(context.Unique());
 
-    return $C0($F(NULL, $P1($L($I("$cyv")), comprehensions_->Parameters(context)), $$
-        ->* $E($ CYAssign(cyv, $ CYArray()))
-        ->* comprehensions_->Replace(context, $E($C1($M(cyv, $S("push")), expression_)))
-        ->* $ CYReturn(cyv)
+    return $C0($F(NULL, $P1($L(cyv), comprehensions_->Parameters(context)), $$
+        ->* $E($ CYAssign($V(cyv), $ CYArray()))
+        ->* comprehensions_->Replace(context, $E($C1($M($V(cyv), $S("push")), expression_)))
+        ->* $ CYReturn($V(cyv))
     ));
 }
 
@@ -449,6 +449,13 @@ CYStatement *CYForIn::Replace(CYContext &context) {
     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_);
 }
@@ -474,14 +481,13 @@ CYFunctionParameter *CYForOfComprehension::Parameter(CYContext &context) const {
 }
 
 CYStatement *CYForOfComprehension::Replace(CYContext &context, CYStatement *statement) const {
-    CYIdentifier *cys($I("$cys"));
+    CYIdentifier *cys(context.Unique());
 
-    return $E($C0($F(NULL, $P1($L($I("$cys"))), $$
-        ->* $E($ CYAssign($V(cys), set_))
+    return $ CYBlock($$
+        ->* $ CYLet(false, $L1($L(cys, set_)))
         ->* $ CYForIn(declaration_->Target(context), $V(cys), $ CYBlock($$
             ->* $E($ CYAssign(declaration_->Target(context), $M($V(cys), declaration_->Target(context))))
             ->* CYComprehension::Replace(context, statement)
-        ))
     )));
 }
 
@@ -527,6 +533,8 @@ void CYFunction::Replace(CYContext &context) {
 
     CYScope scope(!localize, context);
 
+    $I("arguments")->Replace(context, CYIdentifierMagic);
+
     parameters_->Replace(context, code_);
 
     context.ReplaceAll(code_);
@@ -739,7 +747,7 @@ CYExpression *CYPrefix::Replace(CYContext &context) {
 }
 
 CYProperty *CYProperty::ReplaceAll(CYContext &context, CYBuilder &builder, CYExpression *self, bool update) {
-    update |= name_->Computed();
+    update |= Update();
     if (update)
         Replace(context, builder, self, false);
     if (next_ != NULL)
@@ -759,6 +767,10 @@ void CYProperty::Replace(CYContext &context, CYBuilder &builder, CYExpression *s
     Replace(context, builder, self, name, protect);
 }
 
+bool CYProperty::Update() const {
+    return name_->Computed();
+}
+
 void CYPropertyGetter::Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect) {
     CYIdentifier *unique(context.Unique());
     builder.declarations_
@@ -780,6 +792,10 @@ void CYPropertyMethod::Replace(CYContext &context, CYBuilder &builder, CYExpress
             CYDefineProperty(self, name, true, !protect, $ CYPropertyValue($S("value"), $V(unique), $ CYPropertyValue($S("writable"), $ CYTrue()))));
 }
 
+bool CYPropertyMethod::Update() const {
+    return true;
+}
+
 void CYPropertySetter::Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect) {
     CYIdentifier *unique(context.Unique());
     builder.declarations_
@@ -908,19 +924,9 @@ CYIdentifierFlags *CYScope::Declare(CYContext &context, CYIdentifier *identifier
     if (existing == NULL)
         return internal_;
 
-    switch (kind) {
-        case CYIdentifierArgument:
-        case CYIdentifierCatch:
-        case CYIdentifierMagic:
-            _assert(false);
-        default:
-            break;
-    }
-
-    if (existing->kind_ == CYIdentifierGlobal)
+    if (kind == CYIdentifierGlobal);
+    else if (existing->kind_ == CYIdentifierGlobal || existing->kind_ == CYIdentifierMagic)
         existing->kind_ = kind;
-    else if (kind == CYIdentifierGlobal)
-        ;
     else if (existing->kind_ == CYIdentifierLexical || kind == CYIdentifierLexical)
         _assert(false); // XXX: throw new SyntaxError()
 
@@ -1243,7 +1249,10 @@ CYStatement *CYWhile::Replace(CYContext &context) {
 
 CYStatement *CYWith::Replace(CYContext &context) {
     context.Replace(scope_);
+    CYScope scope(true, context);
+    scope.Damage();
     context.ReplaceAll(code_);
+    scope.Close(context);
     return this;
 }