]> git.saurik.com Git - cycript.git/blobdiff - Output.cpp
Upgrading to clang++-3.7 found infinite recursion.
[cycript.git] / Output.cpp
index 752d8a9ed6f250897c0b3070e254fefc8397ac51..12c72df46b4210e075240c9372619cebd03abd90 100644 (file)
@@ -1,21 +1,21 @@
 /* Cycript - Optimizing JavaScript Compiler/Runtime
- * Copyright (C) 2009-2010  Jay Freeman (saurik)
+ * Copyright (C) 2009-2015  Jay Freeman (saurik)
 */
 
-/* GNU Lesser General Public License, Version 3 {{{ */
+/* GNU Affero General Public License, Version 3 {{{ */
 /*
- * Cycript is free software: you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Cycript is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
- * License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with Cycript.  If not, see <http://www.gnu.org/licenses/>.
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 **/
 /* }}} */
 
@@ -118,8 +118,7 @@ void CYArgument::Output(CYOutput &out) const {
     if (value_ != NULL)
         value_->Output(out, CYAssign::Precedence_, CYNoFlags);
     if (next_ != NULL) {
-        if (next_->name_ == NULL)
-            out << ',';
+        out << ',';
         out << ' ' << *next_;
     }
 }
@@ -194,19 +193,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 {
@@ -256,7 +249,7 @@ void CYDeclaration::Output(CYOutput &out, CYFlags flags) const {
 
 void CYForDeclarations::Output(CYOutput &out, CYFlags flags) const {
     out << "var";
-    Output(out, CYRight(flags));
+    declarations_->Output(out, CYRight(flags));
 }
 
 void CYDeclarations::Output(CYOutput &out) const {
@@ -329,13 +322,21 @@ void CYExpression::Output(CYOutput &out) const {
     Output(out, CYNoFlags);
 }
 
-void CYExpression::Output(CYOutput &out, unsigned precedence, CYFlags flags) const {
+void CYExpression::Output(CYOutput &out, int precedence, CYFlags flags) const {
     if (precedence < Precedence() || (flags & CYNoRightHand) != 0 && RightHand())
         out << '(' << *this << ')';
     else
         Output(out, flags);
 }
 
+void CYExternal::Output(CYOutput &out, CYFlags flags) const {
+    out << "extern" << abi_ << typed_ << ';';
+}
+
+void CYFatArrow::Output(CYOutput &out, CYFlags flags) const {
+    out << '(' << parameters_ << ')' << ' ' << "=>" << ' ' << code_;
+}
+
 void CYFinally::Output(CYOutput &out) const {
     out << ' ' << "finally" << ' ' << code_;
 }
@@ -356,14 +357,14 @@ void CYFor::Output(CYOutput &out, CYFlags flags) const {
     code_->Single(out, CYRight(flags));
 }
 
-void CYForEachIn::Output(CYOutput &out, CYFlags flags) const {
+void CYForOf::Output(CYOutput &out, CYFlags flags) const {
     out << "for" << ' ' << "each" << ' ' << '(';
     initialiser_->ForIn(out, CYNoIn);
     out << "in" << *set_ << ')';
     code_->Single(out, CYRight(flags));
 }
 
-void CYForEachInComprehension::Output(CYOutput &out) const {
+void CYForOfComprehension::Output(CYOutput &out) const {
     out << "for" << ' ' << "each" << ' ' << '(' << *name_ << ' ' << "in" << ' ' << *set_ << ')' << next_;
 }
 
@@ -443,6 +444,10 @@ void CYIfComprehension::Output(CYOutput &out) const {
     out << "if" << ' ' << '(' << *test_ << ')' << next_;
 }
 
+void CYImport::Output(CYOutput &out, CYFlags flags) const {
+    out << "@import";
+}
+
 void CYIndirectMember::Output(CYOutput &out, CYFlags flags) const {
     object_->Output(out, Precedence(), CYLeft(flags));
     if (const char *word = property_->Word())
@@ -470,11 +475,92 @@ void CYLabel::Output(CYOutput &out, CYFlags flags) const {
     statement_->Single(out, CYRight(flags));
 }
 
+void CYTypeArrayOf::Output(CYOutput &out, CYIdentifier *identifier) const {
+    next_->Output(out, Precedence(), identifier);
+    out << '[';
+    out << size_;
+    out << ']';
+}
+
+void CYTypeBlockWith::Output(CYOutput &out, CYIdentifier *identifier) const {
+    out << '(' << '^';
+    next_->Output(out, Precedence(), identifier);
+    out << ')' << '(' << parameters_ << ')';
+}
+
+void CYTypeConstant::Output(CYOutput &out, CYIdentifier *identifier) const {
+    out << "const";
+    next_->Output(out, Precedence(), identifier);
+}
+
+void CYTypeFunctionWith::Output(CYOutput &out, CYIdentifier *identifier) const {
+    next_->Output(out, Precedence(), identifier);
+    out << '(' << parameters_ << ')';
+}
+
+void CYTypePointerTo::Output(CYOutput &out, CYIdentifier *identifier) const {
+    out << '*';
+    next_->Output(out, Precedence(), identifier);
+}
+
+void CYTypeVolatile::Output(CYOutput &out, CYIdentifier *identifier) const {
+    out << "volatile";
+    next_->Output(out, Precedence(), identifier);
+}
+
+void CYTypeModifier::Output(CYOutput &out, int precedence, CYIdentifier *identifier) const {
+    if (this == NULL) {
+        out << identifier;
+        return;
+    }
+
+    bool protect(precedence > Precedence());
+
+    if (protect)
+        out << '(';
+    Output(out, identifier);
+    if (protect)
+        out << ')';
+}
+
+void CYTypedIdentifier::Output(CYOutput &out) const {
+    specifier_->Output(out);
+    modifier_->Output(out, 0, identifier_);
+}
+
+void CYEncodedType::Output(CYOutput &out, CYFlags flags) const {
+    out << "@encode(" << typed_ << ")";
+}
+
+void CYTypedParameter::Output(CYOutput &out) const {
+    out << typed_;
+    if (next_ != NULL)
+        out << ',' << ' ' << next_;
+}
+
+void CYLambda::Output(CYOutput &out, CYFlags flags) const {
+    // XXX: this is seriously wrong
+    out << "[](";
+    out << ")->";
+    out << "{";
+    out << "}";
+}
+
+void CYTypeDefinition::Output(CYOutput &out, CYFlags flags) const {
+    out << "typedef" << *typed_;
+}
+
 void CYLetStatement::Output(CYOutput &out, CYFlags flags) const {
     out << "let" << ' ' << '(' << *declarations_ << ')';
     code_->Single(out, CYRight(flags));
 }
 
+void CYModule::Output(CYOutput &out) const {
+    out << part_;
+    if (next_ != NULL)
+        out << '.' << next_;
+}
+
 namespace cy {
 namespace Syntax {
 
@@ -669,6 +755,34 @@ void Try::Output(CYOutput &out, CYFlags flags) const {
 
 } }
 
+void CYTypeError::Output(CYOutput &out) const {
+    out << "@error";
+}
+
+void CYTypeLong::Output(CYOutput &out) const {
+    out << "long" << specifier_;
+}
+
+void CYTypeShort::Output(CYOutput &out) const {
+    out << "short" << specifier_;
+}
+
+void CYTypeSigned::Output(CYOutput &out) const {
+    out << "signed" << specifier_;
+}
+
+void CYTypeUnsigned::Output(CYOutput &out) const {
+    out << "unsigned" << specifier_;
+}
+
+void CYTypeVariable::Output(CYOutput &out) const {
+    out << *name_;
+}
+
+void CYTypeVoid::Output(CYOutput &out) const {
+    out << "void";
+}
+
 void CYVar::Output(CYOutput &out, CYFlags flags) const {
     out << "var";
     declarations_->Output(out, flags);