]> git.saurik.com Git - cycript.git/commitdiff
Re-added final output to script execution, implemented unary affirmation operator...
authorJay Freeman (saurik) <saurik@saurik.com>
Wed, 21 Oct 2009 08:10:36 +0000 (08:10 +0000)
committerJay Freeman (saurik) <saurik@saurik.com>
Wed, 21 Oct 2009 08:10:36 +0000 (08:10 +0000)
Console.cpp
Cycript.y
Output.cpp
Parser.hpp

index 2b616562651d0e177445a4c59251ffcaf2b42f29..3a911cd2e0d5b013488eee85493029947aa93969 100644 (file)
@@ -470,7 +470,7 @@ int main(int argc, char *argv[]) {
                 if (compile)
                     std::cout << code;
                 else
-                    Run(socket, code);
+                    Run(socket, code, stdout);
             }
     }
 
index 14acf8dd00212d94363904447fb0210467c05d33..151f950725ea7047d0cea8f3f27a2a2dc50a51a2 100644 (file)
--- a/Cycript.y
+++ b/Cycript.y
@@ -757,7 +757,7 @@ UnaryExpression_
     | "\n++" UnaryExpression { $$ = new(driver.pool_) CYPreIncrement($2); }
     | "--" UnaryExpression { $$ = new(driver.pool_) CYPreDecrement($2); }
     | "\n--" UnaryExpression { $$ = new(driver.pool_) CYPreDecrement($2); }
-    | "+" UnaryExpression { $$ = $2; }
+    | "+" UnaryExpression { $$ = new(driver.pool_) CYAffirm($2); }
     | "-" UnaryExpression { $$ = new(driver.pool_) CYNegate($2); }
     | "~" UnaryExpression { $$ = new(driver.pool_) CYBitwiseNot($2); }
     | "!" UnaryExpression { $$ = new(driver.pool_) CYLogicalNot($2); }
index f8885247ca89d867ef62e9bfb5e6ee81ba87add3..7f77d65c15aca0912dba84bef99d8ac5a2304d72 100644 (file)
@@ -67,6 +67,10 @@ CYOutput &CYOutput::operator <<(char rhs) {
             mode_ = Terminated;
             goto done;
         }
+    } else if (rhs == '+') {
+        if (mode_ == NoPlus)
+            out_ << ' ';
+        mode_ = NoPlus;
     } else if (rhs == '-') {
         if (mode_ == NoHyphen)
             out_ << ' ';
@@ -92,6 +96,7 @@ CYOutput &CYOutput::operator <<(const char *rhs) {
     if (mode_ == Terminated)
         out_ << ';';
     else if (
+        mode_ == NoPlus && *rhs == '+' ||
         mode_ == NoHyphen && *rhs == '-' ||
         mode_ == NoLetter && WordEndRange_[*rhs]
     )
@@ -612,9 +617,11 @@ void CYObject::Output(CYOutput &out, CYFlags flags) const {
     bool protect((flags & CYNoBrace) != 0);
     if (protect)
         out << '(';
-    out << '{';
+    out << '{' << '\n';
+    ++out.indent_;
     out << property_;
-    out << '}';
+    --out.indent_;
+    out << '\t' << '}';
     if (protect)
         out << ')';
 }
@@ -633,11 +640,14 @@ void CYPrefix::Output(CYOutput &out, CYFlags flags) const {
 }
 
 void CYProperty::Output(CYOutput &out) const {
+    out << '\t';
     name_->PropertyName(out);
     out << ':' << ' ';
     value_->Output(out, CYPA, CYNoFlags);
     if (next_ != NULL)
-        out << ',' << ' ' << *next_;
+        out << ',' << '\n' << *next_;
+    else
+        out << '\n';
 }
 
 void CYRegEx::Output(CYOutput &out, CYFlags flags) const {
@@ -645,7 +655,10 @@ void CYRegEx::Output(CYOutput &out, CYFlags flags) const {
 }
 
 void CYReturn::Output(CYOutput &out, CYFlags flags) const {
-    out << "return" << value_ << ';';
+    out << "return";
+    if (value_ != NULL)
+        out << ' ' << *value_;
+    out << ';';
 }
 
 void CYSelector::Output(CYOutput &out, CYFlags flags) const {
@@ -768,6 +781,30 @@ void CYString::PropertyName(CYOutput &out) const {
         out << *this;
 }
 
+static const char *Reserved_[] = {
+    "false", "null", "true",
+
+    "break", "case", "catch", "continue", "default",
+    "delete", "do", "else", "finally", "for", "function",
+    "if", "in", "instanceof", "new", "return", "switch",
+    "this", "throw", "try", "typeof", "var", "void",
+    "while", "with",
+
+    "debugger", "const",
+
+    "class", "enum", "export", "extends", "import", "super",
+
+    "abstract", "boolean", "byte", "char", "double", "final",
+    "float", "goto", "int", "long", "native", "short",
+    "synchronized", "throws", "transient", "volatile",
+
+    "let", "yield",
+
+    "each",
+
+    NULL
+};
+
 const char *CYString::Word() const {
     if (size_ == 0 || !WordStartRange_[value_[0]])
         return NULL;
@@ -775,9 +812,7 @@ const char *CYString::Word() const {
         if (!WordEndRange_[value_[i]])
             return NULL;
     const char *value(Value());
-    // XXX: we should probably include the full ECMAScript3+5 list.
-    static const char *reserveds[] = {"class", "const", "enum", "export", "extends", "import", "super", NULL};
-    for (const char **reserved(reserveds); *reserved != NULL; ++reserved)
+    for (const char **reserved(Reserved_); *reserved != NULL; ++reserved)
         if (strcmp(*reserved, value) == 0)
             return NULL;
     return value;
@@ -794,7 +829,10 @@ void CYThis::Output(CYOutput &out, CYFlags flags) const {
 }
 
 void CYThrow::Output(CYOutput &out, CYFlags flags) const {
-    out << "throw" << value_ << ';';
+    out << "throw";
+    if (value_ != NULL)
+        out << ' ' << *value_;
+    out << ';';
 }
 
 void CYTry::Output(CYOutput &out, CYFlags flags) const {
index 33de680e2b7df771b7f6f0098d6650baab643f41..a9a881296312c5dc9b520601c428861ed10ac2ab 100644 (file)
@@ -78,6 +78,7 @@ struct CYOutput {
     enum {
         NoMode,
         NoLetter,
+        NoPlus,
         NoHyphen,
         Terminated
     } mode_;
@@ -1510,6 +1511,7 @@ CYPrefix_(true, "void", Void)
 CYPrefix_(true, "typeof", TypeOf)
 CYPrefix_(false, "++", PreIncrement)
 CYPrefix_(false, "--", PreDecrement)
+CYPrefix_(false, "+", Affirm)
 CYPrefix_(false, "-", Negate)
 CYPrefix_(false, "~", BitwiseNot)
 CYPrefix_(false, "!", LogicalNot)