]> git.saurik.com Git - cycript.git/blobdiff - Output.cpp
Factored out the execution engine from the compiler.
[cycript.git] / Output.cpp
index d36afe64168b4d333e3aefe0659b4d7416d06fae..04f893c9299d74671fb812a04a1975ed40ee2980 100644 (file)
@@ -1,4 +1,4 @@
-/* Cycript - Remove Execution Server and Disassembler
+/* Cycript - Inlining/Optimizing JavaScript Compiler
  * Copyright (C) 2009  Jay Freeman (saurik)
 */
 
@@ -59,7 +59,7 @@ _finline CYFlags &operator |=(CYFlags &lhs, CYFlags rhs) {
 }
 
 _finline CYFlags CYLeft(CYFlags flags) {
-    return flags & ~CYNoDangle;
+    return flags & ~(CYNoDangle | CYNoInteger);
 }
 
 _finline CYFlags CYRight(CYFlags flags) {
@@ -85,14 +85,24 @@ CYOutput &CYOutput::operator <<(char rhs) {
             for (unsigned i(0); i != indent_; ++i)
                 out_ << "    ";
         else goto done;
-    else goto work;
+    else if (rhs == '\r') {
+        if (right_) {
+            out_ << '\n';
+            right_ = false;
+            goto mode;
+        }
+    } else goto work;
 
+    right_ = true;
+  mode:
     mode_ = NoMode;
     goto done;
 
   work:
-    if (mode_ == Terminated && rhs != '}')
+    if (mode_ == Terminated && rhs != '}') {
+        right_ = true;
         out_ << ';';
+    }
 
     if (rhs == ';') {
         if (pretty_)
@@ -116,6 +126,7 @@ CYOutput &CYOutput::operator <<(char rhs) {
     } else none:
         mode_ = NoMode;
 
+    right_ = true;
     out_ << rhs;
   done:
     return *this;
@@ -141,6 +152,7 @@ CYOutput &CYOutput::operator <<(const char *rhs) {
     else
         mode_ = NoMode;
 
+    right_ = true;
     out_ << rhs;
     return *this;
 }
@@ -222,6 +234,12 @@ void Catch::Output(CYOutput &out) const {
 
 } }
 
+void CYComment::Output(CYOutput &out, CYFlags flags) const {
+    out << '\r';
+    out << value_;
+    out << '\r';
+}
+
 void CYCompound::Output(CYOutput &out, CYFlags flags) const {
     if (CYExpression *expression = expressions_)
         if (CYExpression *next = expression->next_) {
@@ -513,7 +531,11 @@ void CYNull::Output(CYOutput &out, CYFlags flags) const {
 void CYNumber::Output(CYOutput &out, CYFlags flags) const {
     std::ostringstream str;
     CYNumerify(str, Value());
-    out << str.str().c_str();
+    std::string value(str.str());
+    out << value.c_str();
+    // XXX: this should probably also handle hex conversions and exponents
+    if ((flags & CYNoInteger) != 0 && value.find('.') == std::string::npos)
+        out << '.';
 }
 
 void CYNumber::PropertyName(CYOutput &out) const {