]> git.saurik.com Git - cycript.git/blobdiff - Console.cpp
Implement (modified) ECMA6 array comprehensions.
[cycript.git] / Console.cpp
index 50692f27c42c043445c1ee3635a2d349d4c87d86..d669e67239ff008726de6258bd6c6c0bee187852 100644 (file)
@@ -1,5 +1,5 @@
 /* Cycript - Optimizing JavaScript Compiler/Runtime
- * Copyright (C) 2009-2010  Jay Freeman (saurik)
+ * Copyright (C) 2009-2012  Jay Freeman (saurik)
 */
 
 /* GNU Lesser General Public License, Version 3 {{{ */
@@ -211,11 +211,16 @@ static CYExpression *ParseExpression(CYUTF8String code) {
     Setup(driver, parser);
 
     if (parser.parse() != 0 || !driver.errors_.empty())
-        _assert(false);
+        return NULL;
+
+    CYOptions options;
+    CYContext context(options);
 
-    CYExpress *express(dynamic_cast<CYExpress *>(driver.program_->statements_));
-    _assert(express != NULL);
-    return express->expression_;
+    // XXX: this could be replaced with a CYStatement::Primitive()
+    if (CYExpress *express = dynamic_cast<CYExpress *>(driver.program_->statements_))
+        return express->expression_->Primitive(context);
+
+    return NULL;
 }
 
 static int client_;
@@ -264,7 +269,7 @@ static char **Complete(const char *word, int start, int end) {
 
         case CYDriver::AutoMessage: {
             CYDriver::Context &thing(driver.contexts_.back());
-            expression = $M($M($ CYIndirect(thing.context_), $S("isa")), $S("messages"));
+            expression = $M($C1($V("object_getClass"), thing.context_), $S("messages"));
             for (CYDriver::Context::Words::const_iterator part(thing.words_.begin()); part != thing.words_.end(); ++part)
                 prefix << (*part)->word_ << ':';
         } break;
@@ -297,6 +302,9 @@ static char **Complete(const char *word, int start, int end) {
     CYUTF8String json(Run(pool, client_, code));
 
     CYExpression *result(ParseExpression(json));
+    if (result == NULL)
+        return NULL;
+
     CYArray *array(dynamic_cast<CYArray *>(result));
 
     if (array == NULL) {
@@ -491,7 +499,7 @@ static void Console(CYOptions &options) {
                         }
 
                         std::cerr << "....";
-                        for (size_t i(0); i != begin.column - 1; ++i)
+                        for (size_t i(0); i != begin.column; ++i)
                             std::cerr << '.';
                         if (begin.line != end.line || begin.column == end.column)
                             std::cerr << '^';
@@ -573,7 +581,7 @@ int Main(int argc, char const * const argv[], char const * const envp[]) {
     bool compile(false);
     CYOptions options;
 
-    append_history$ = reinterpret_cast<int (*)(int, const char *)>(dlsym(RTLD_DEFAULT, "append_history"));
+    append_history$ = (int (*)(int, const char *)) (dlsym(RTLD_DEFAULT, "append_history"));
 
 #ifdef CY_ATTACH
     pid_t pid(_not(pid_t));