X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/e661185c1c35ad0eb684582c3f78cd032e84ae7b..22e0b32a8b98fcc5620e1299248855de762df7e8:/Output.cpp?ds=sidebyside diff --git a/Output.cpp b/Output.cpp index e399d48..42d1854 100644 --- a/Output.cpp +++ b/Output.cpp @@ -1,20 +1,20 @@ /* Cycript - Optimizing JavaScript Compiler/Runtime - * Copyright (C) 2009-2010 Jay Freeman (saurik) + * Copyright (C) 2009-2013 Jay Freeman (saurik) */ -/* GNU Lesser General Public License, Version 3 {{{ */ +/* GNU 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 free software: you can redistribute it and/or modify + * it under the terms of the GNU 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. + * 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 General Public License for more details. * - * You should have received a copy of the GNU Lesser General Public License + * You should have received a copy of the GNU General Public License * along with Cycript. If not, see . **/ /* }}} */ @@ -24,34 +24,6 @@ #include -_finline CYFlags operator ~(CYFlags rhs) { - return static_cast(~static_cast(rhs)); -} - -_finline CYFlags operator &(CYFlags lhs, CYFlags rhs) { - return static_cast(static_cast(lhs) & static_cast(rhs)); -} - -_finline CYFlags operator |(CYFlags lhs, CYFlags rhs) { - return static_cast(static_cast(lhs) | static_cast(rhs)); -} - -_finline CYFlags &operator |=(CYFlags &lhs, CYFlags rhs) { - return lhs = lhs | rhs; -} - -_finline CYFlags CYLeft(CYFlags flags) { - return flags & ~(CYNoDangle | CYNoInteger); -} - -_finline CYFlags CYRight(CYFlags flags) { - return flags & ~CYNoBF; -} - -_finline CYFlags CYCenter(CYFlags flags) { - return CYLeft(CYRight(flags)); -} - void CYOutput::Terminate() { out_ << ';'; mode_ = NoMode; @@ -264,8 +236,8 @@ void CYClause::Output(CYOutput &out) const { out << next_; } -const char *CYDeclaration::ForEachIn() const { - return identifier_->Word(); +void CYDebugger::Output(CYOutput &out, CYFlags flags) const { + out << "debugger" << ';'; } void CYDeclaration::ForIn(CYOutput &out, CYFlags flags) const { @@ -282,9 +254,9 @@ void CYDeclaration::Output(CYOutput &out, CYFlags flags) const { } } -void CYDeclarations::For(CYOutput &out) const { +void CYForDeclarations::Output(CYOutput &out, CYFlags flags) const { out << "var"; - Output(out, CYNoIn); + Output(out, CYRight(flags)); } void CYDeclarations::Output(CYOutput &out) const { @@ -294,16 +266,19 @@ void CYDeclarations::Output(CYOutput &out) const { void CYDeclarations::Output(CYOutput &out, CYFlags flags) const { const CYDeclarations *declaration(this); bool first(true); - output: - CYDeclarations *next(declaration->next_); - CYFlags jacks(first ? CYLeft(flags) : next == NULL ? CYRight(flags) : CYCenter(flags)); - first = false; - declaration->declaration_->Output(out, jacks); - if (next != NULL) { + for (;;) { + CYDeclarations *next(declaration->next_); + + CYFlags jacks(first ? CYLeft(flags) : next == NULL ? CYRight(flags) : CYCenter(flags)); + first = false; + declaration->declaration_->Output(out, jacks); + + if (next == NULL) + break; + out << ',' << ' '; declaration = next; - goto output; } } @@ -346,14 +321,6 @@ void CYExpression::ClassName(CYOutput &out, bool object) const { Output(out, CYAssign::Precedence_, CYNoFlags); } -const char *CYExpression::ForEachIn() const { - return NULL; -} - -void CYExpression::For(CYOutput &out) const { - Output(out, CYNoIn); -} - void CYExpression::ForIn(CYOutput &out, CYFlags flags) const { Output(out, flags | CYNoRightHand); } @@ -362,13 +329,17 @@ 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 CYFatArrow::Output(CYOutput &out, CYFlags flags) const { + out << '(' << parameters_ << ')' << ' ' << "=>" << ' ' << code_; +} + void CYFinally::Output(CYOutput &out) const { out << ' ' << "finally" << ' ' << code_; } @@ -376,7 +347,7 @@ void CYFinally::Output(CYOutput &out) const { void CYFor::Output(CYOutput &out, CYFlags flags) const { out << "for" << ' ' << '('; if (initialiser_ != NULL) - initialiser_->For(out); + initialiser_->Output(out, CYNoIn); out.Terminate(); if (test_ != NULL) out << ' '; @@ -389,14 +360,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_; } @@ -435,7 +406,7 @@ void CYFunctionStatement::Output(CYOutput &out, CYFlags flags) const { } void CYFunctionParameter::Output(CYOutput &out) const { - out << *name_; + initialiser_->Output(out, CYNoFlags); if (next_ != NULL) out << ',' << ' ' << *next_; } @@ -503,8 +474,84 @@ void CYLabel::Output(CYOutput &out, CYFlags flags) const { statement_->Single(out, CYRight(flags)); } -void CYLet::Output(CYOutput &out, CYFlags flags) const { - out << "let" << ' ' << '(' << *declarations_ << ')' << ' ' << code_; +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)); } namespace cy { @@ -551,13 +598,6 @@ void CYObject::Output(CYOutput &out, CYFlags flags) const { out << ')'; } -void CYOptionalFunctionParameter::Output(CYOutput &out) const { - out << *name_ << '='; - initializer_->Output(out, CYAssign::Precedence_, CYNoFlags); - if (next_ != NULL) - out << ',' << ' ' << *next_; -} - void CYPostfix::Output(CYOutput &out, CYFlags flags) const { lhs_->Output(out, Precedence(), CYLeft(flags)); out << Operator(); @@ -622,6 +662,9 @@ void CYStatement::Multiple(CYOutput &out, CYFlags flags) const { } void CYStatement::Single(CYOutput &out, CYFlags flags) const { + if (this == NULL) + return out.Terminate(); + _assert(next_ == NULL); out << '\n'; ++out.indent_; @@ -705,6 +748,30 @@ void Try::Output(CYOutput &out, CYFlags flags) const { } } +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);