]> git.saurik.com Git - cycript.git/commitdiff
De-CYNext CYExpression, fix CYCompound/Primitive.
authorJay Freeman (saurik) <saurik@saurik.com>
Thu, 23 Jan 2014 21:55:47 +0000 (13:55 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Thu, 23 Jan 2014 22:09:22 +0000 (14:09 -0800)
Console.cpp
Cycript.yy.in
Output.cpp
Parser.hpp
Replace.cpp

index 7205529ca4ec4ac8cd0f899e7df916ba1cafc22f..9d3d65a91b5b25f08ef331d60102daa80a180ee8 100644 (file)
@@ -227,11 +227,14 @@ static CYExpression *ParseExpression(CYUTF8String code) {
     CYOptions options;
     CYContext context(options);
 
-    // XXX: this could be replaced with a CYStatement::Primitive()
-    if (CYExpress *express = dynamic_cast<CYExpress *>(driver.program_->statements_))
-        return express->expression_->Primitive(context);
+    CYStatement *statement(driver.program_->statements_);
+    _assert(statement != NULL);
+    _assert(statement->next_ == NULL);
 
-    return NULL;
+    CYExpress *express(dynamic_cast<CYExpress *>(driver.program_->statements_));
+    _assert(express != NULL);
+
+    return express->expression_;
 }
 
 static int client_;
@@ -316,8 +319,7 @@ static char **Complete(const char *word, int start, int end) {
     if (result == NULL)
         return NULL;
 
-    CYArray *array(dynamic_cast<CYArray *>(result));
-
+    CYArray *array(dynamic_cast<CYArray *>(result->Primitive(context)));
     if (array == NULL) {
         *out_ << '\n';
         Output(false, json, out_);
index 2227201e0cd184bf619e48ad062d0690b53a7d6a..3a31f1ebbe797f220e5cf17bb7123ecc846eb4fb 100644 (file)
@@ -1054,11 +1054,11 @@ AssignmentExpression
 /* 11.14 Comma Operator {{{ */
 Expression_
     : "," Expression { $$ = $2; }
-    | { $$ = CYNew CYCompound(); }
+    | { $$ = NULL; }
     ;
 
 Expression
-    : AssignmentExpression Expression_ { $2->AddPrev($1); $$ = $2; }
+    : AssignmentExpression Expression_ { $$ = CYNew CYCompound($1, $2); }
     ;
 
 ExpressionOpt
index 9b9bc72b222e7f0d5b2257382fd829980af9b7c5..602251460b6f80e7e5b63ed0a4c5237818a86145 100644 (file)
@@ -194,19 +194,13 @@ void CYComment::Output(CYOutput &out, CYFlags flags) const {
 }
 
 void CYCompound::Output(CYOutput &out, CYFlags flags) const {
-    if (CYExpression *expression = expressions_)
-        if (CYExpression *next = expression->next_) {
-            expression->Output(out, CYLeft(flags));
-            CYFlags center(CYCenter(flags));
-            while (next != NULL) {
-                expression = next;
-                out << ',' << ' ';
-                next = expression->next_;
-                CYFlags right(next != NULL ? center : CYRight(flags));
-                expression->Output(out, right);
-            }
-        } else
-            expression->Output(out, flags);
+    if (next_ == NULL)
+        expression_->Output(out, flags);
+    else {
+        expression_->Output(out, CYLeft(flags));
+        out << ',' << ' ';
+        next_->Output(out, CYRight(flags));
+    }
 }
 
 void CYCondition::Output(CYOutput &out, CYFlags flags) const {
index fa0bc095a738186eaee23b112a7cc969f30729cc..e804e4aafd820836437a653cc75f2ce8683607c0 100644 (file)
@@ -506,7 +506,6 @@ struct CYNumber;
 struct CYString;
 
 struct CYExpression :
-    CYNext<CYExpression>,
     CYForInitialiser,
     CYForInInitialiser,
     CYClassName,
@@ -534,7 +533,7 @@ struct CYExpression :
     virtual CYAssignment *Assignment(CYContext &context);
 
     virtual CYExpression *Primitive(CYContext &context) {
-        return this;
+        return NULL;
     }
 
     virtual CYNumber *Number(CYContext &context) {
@@ -569,16 +568,16 @@ struct CYExpression :
 struct CYCompound :
     CYExpression
 {
-    CYExpression *expressions_;
+    CYExpression *expression_;
+    CYExpression *next_;
 
-    CYCompound(CYExpression *expressions = NULL) :
-        expressions_(expressions)
+    CYCompound(CYExpression *expression, CYExpression *next = NULL) :
+        expression_(expression),
+        next_(next)
     {
-    }
-
-    void AddPrev(CYExpression *expression) {
-        CYSetLast(expression) = expressions_;
-        expressions_ = expression;
+        if (expression_ == NULL)
+            throw;
+        _assert(expression_ != NULL);
     }
 
     CYPrecedence(17)
@@ -716,6 +715,10 @@ struct CYLiteral :
 {
     CYPrecedence(0)
     CYRightHand(false)
+
+    virtual CYExpression *Primitive(CYContext &context) {
+        return this;
+    }
 };
 
 struct CYTrivial :
@@ -1535,7 +1538,7 @@ struct CYExpress :
     CYExpress(CYExpression *expression) :
         expression_(expression)
     {
-        if (expression == NULL)
+        if (expression_ == NULL)
             throw;
     }
 
index f914af98b82aed992fd4363c8849b8c94a917de7..b658cf733e994a20b909eb5c75a48cf83483dede 100644 (file)
@@ -32,19 +32,16 @@ CYFunctionExpression *CYNonLocalize(CYContext &context, CYFunctionExpression *fu
 CYExpression *CYAdd::Replace(CYContext &context) {
     CYInfix::Replace(context);
 
-    CYExpression *lhp(lhs_->Primitive(context));
-    CYExpression *rhp(rhs_->Primitive(context));
-
-    CYString *lhs(dynamic_cast<CYString *>(lhp));
-    CYString *rhs(dynamic_cast<CYString *>(rhp));
+    CYString *lhs(dynamic_cast<CYString *>(lhs_));
+    CYString *rhs(dynamic_cast<CYString *>(rhs_));
 
     if (lhs != NULL || rhs != NULL) {
         if (lhs == NULL) {
-            lhs = lhp->String(context);
+            lhs = lhs_->String(context);
             if (lhs == NULL)
                 return this;
         } else if (rhs == NULL) {
-            rhs = rhp->String(context);
+            rhs = rhs_->String(context);
             if (rhs == NULL)
                 return this;
         }
@@ -52,8 +49,8 @@ CYExpression *CYAdd::Replace(CYContext &context) {
         return lhs->Concat(context, rhs);
     }
 
-    if (CYNumber *lhn = lhp->Number(context))
-        if (CYNumber *rhn = rhp->Number(context))
+    if (CYNumber *lhn = lhs_->Number(context))
+        if (CYNumber *rhn = rhs_->Number(context))
             return $D(lhn->Value() + rhn->Value());
 
     return this;
@@ -149,18 +146,26 @@ CYStatement *CYComment::Replace(CYContext &context) {
 }
 
 CYExpression *CYCompound::Replace(CYContext &context) {
-    context.ReplaceAll(expressions_);
-    if (expressions_ == NULL)
-        return NULL;
+    if (next_ == NULL)
+        return expression_;
+
+    context.Replace(expression_);
+    context.Replace(next_);
+
+    if (CYCompound *compound = dynamic_cast<CYCompound *>(expression_)) {
+        expression_ = compound->expression_;
+        compound->expression_ = compound->next_;
+        compound->next_ = next_;
+        next_ = compound;
+    }
+
     return this;
 }
 
 CYExpression *CYCompound::Primitive(CYContext &context) {
-    CYExpression *expression(expressions_);
-    if (expression == NULL)
+    CYExpression *expression(expression_);
+    if (expression == NULL || next_ != NULL)
         return NULL;
-    while (expression->next_ != NULL)
-        expression = expression->next_;
     return expression->Primitive(context);
 }
 
@@ -262,9 +267,9 @@ CYArgument *CYDeclarations::Argument(CYContext &context) { $T(NULL)
 }
 
 CYCompound *CYDeclarations::Compound(CYContext &context) { $T(NULL)
-    CYCompound *compound(next_->Compound(context) ?: $ CYCompound());
+    CYCompound *compound(next_->Compound(context));
     if (CYAssignment *assignment = declaration_->Assignment(context))
-        compound->AddPrev(assignment);
+        compound = $ CYCompound(assignment, compound);
     return compound;
 }
 
@@ -295,11 +300,7 @@ CYExpression *CYEncodedType::Replace(CYContext &context) {
 
 CYStatement *CYExpress::Replace(CYContext &context) {
     while (CYExpress *express = dynamic_cast<CYExpress *>(next_)) {
-        CYCompound *compound(dynamic_cast<CYCompound *>(express->expression_));
-        if (compound == NULL)
-            compound = $ CYCompound(express->expression_);
-        compound->AddPrev(expression_);
-        expression_ = compound;
+        expression_ = $ CYCompound(expression_, express->expression_);
         SetNext(express->next_);
     }
 
@@ -536,11 +537,8 @@ CYStatement *CYLetStatement::Replace(CYContext &context) {
 CYExpression *CYMultiply::Replace(CYContext &context) {
     CYInfix::Replace(context);
 
-    CYExpression *lhp(lhs_->Primitive(context));
-    CYExpression *rhp(rhs_->Primitive(context));
-
-    if (CYNumber *lhn = lhp->Number(context))
-        if (CYNumber *rhn = rhp->Number(context))
+    if (CYNumber *lhn = lhs_->Number(context))
+        if (CYNumber *rhn = rhs_->Number(context))
             return $D(lhn->Value() * rhn->Value());
 
     return this;
@@ -961,7 +959,9 @@ CYExpression *CYTypedParameter::TypeSignature(CYContext &context, CYExpression *
 
 CYStatement *CYVar::Replace(CYContext &context) {
     declarations_->Replace(context);
-    return $E(declarations_->Compound(context));
+    if (CYCompound *compound = declarations_->Compound(context))
+        return $E(compound);
+    return $ CYEmpty();
 }
 
 CYExpression *CYVariable::Replace(CYContext &context) {