]> git.saurik.com Git - cycript.git/blobdiff - Console.cpp
Document a potential change to FunctionInstance.
[cycript.git] / Console.cpp
index df7d57b34165b994a3c889ebd69ead5dc2985ae7..80c9dbd7e34a37e7bffe0ac3e9399a33144f6ce7 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 {{{ */
@@ -161,7 +161,10 @@ static void Output(CYUTF8String json, FILE *fout, bool expand = false) {
     if (data == NULL || fout == NULL)
         return;
 
-    if (!expand || data[0] != '"' && data[0] != '\'')
+    if (!expand ||
+        data[0] != '@' && data[0] != '"' && data[0] != '\'' ||
+        data[0] == '@' && data[1] != '"' && data[1] != '\''
+    )
         fputs(data, fout);
     else for (size_t i(0); i != size; ++i)
         if (data[i] != '\\')
@@ -211,11 +214,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 +272,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;
@@ -278,11 +286,12 @@ static char **Complete(const char *word, int start, int end) {
     driver.program_ = $ CYProgram($ CYExpress($C3(ParseExpression(
     "   function(object, prefix, word) {\n"
     "       var names = [];\n"
-    "       var pattern = '^' + prefix + word;\n"
-    "       var length = prefix.length;\n"
+    "       var before = prefix.length;\n"
+    "       prefix += word;\n"
+    "       var entire = prefix.length;\n"
     "       for (name in object)\n"
-    "           if (name.match(pattern) != null)\n"
-    "               names.push(name.substr(length));\n"
+    "           if (name.substring(0, entire) == prefix)\n"
+    "               names.push(name.substr(before));\n"
     "       return names;\n"
     "   }\n"
     ), expression, $S(begin.c_str()), $S(word))));
@@ -297,6 +306,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) {