driver.strict_ = true;
}
-void Setup(CYOutput &out, CYDriver &driver, CYOptions &options) {
+void Setup(CYOutput &out, CYDriver &driver, CYOptions &options, bool lower) {
out.pretty_ = pretty_;
CYContext context(options);
- driver.program_->Replace(context);
+ if (lower)
+ driver.program_->Replace(context);
}
static CYUTF8String Run(CYPool &pool, int client, CYUTF8String code) {
if (client == -1) {
mode_ = Running;
#ifdef CY_EXECUTE
- json = CYExecute(pool, code);
+ json = CYExecute(CYGetJSContext(), pool, code);
#else
json = NULL;
#endif
CYOptions options;
CYContext context(options);
- // XXX: this could be replaced with a CYStatement::Primitive()
- if (CYExpress *express = dynamic_cast<CYExpress *>(driver.program_->statements_))
- return express->expression_->Primitive(context);
+ CYStatement *statement(driver.program_->statements_);
+ _assert(statement != NULL);
+ _assert(statement->next_ == NULL);
+
+ CYExpress *express(dynamic_cast<CYExpress *>(driver.program_->statements_));
+ _assert(express != NULL);
- return NULL;
+ return express->expression_;
}
static int client_;
" var before = prefix.length;\n"
" prefix += word;\n"
" var entire = prefix.length;\n"
- " for (name in object)\n"
+ " for (var name in object)\n"
" if (name.substring(0, entire) == prefix)\n"
" names.push(name.substr(before));\n"
" return names;\n"
if (result == NULL)
return NULL;
- CYArray *array(dynamic_cast<CYArray *>(result));
-
+ CYArray *array(dynamic_cast<CYArray *>(result->Primitive(context)));
if (array == NULL) {
*out_ << '\n';
Output(false, json, out_);
bool bypass(false);
bool debug(false);
bool expand(false);
+ bool lower(true);
bool syntax(true);
out_ = &std::cout;
read:
#if RL_READLINE_VERSION >= 0x0600
- if (syntax) {
- rl_prep_term_function = CYDisplayStart;
+ if (syntax)
rl_redisplay_function = CYDisplayUpdate;
- rl_deprep_term_function = CYDisplayFinish;
- } else {
- rl_prep_term_function = rl_prep_terminal;
+ else
rl_redisplay_function = rl_redisplay;
- rl_deprep_term_function = rl_deprep_terminal;
- }
#endif
mode_ = Parsing;
} else if (data == "debug") {
debug = !debug;
*out_ << "debug == " << (debug ? "true" : "false") << std::endl;
+ } else if (data == "destroy") {
+ CYDestroyContext();
+ } else if (data == "gc") {
+ *out_ << "collecting... " << std::flush;
+ CYGarbageCollect(CYGetJSContext());
+ *out_ << "done." << std::endl;
+ } else if (data == "exit") {
+ return;
} else if (data == "expand") {
expand = !expand;
*out_ << "expand == " << (expand ? "true" : "false") << std::endl;
+ } else if (data == "lower") {
+ lower = !lower;
+ *out_ << "lower == " << (lower ? "true" : "false") << std::endl;
} else if (data == "syntax") {
syntax = !syntax;
*out_ << "syntax == " << (syntax ? "true" : "false") << std::endl;
std::ostringstream str;
CYOutput out(str, options);
- Setup(out, driver, options);
+ Setup(out, driver, options, lower);
out << *driver.program_;
code = str.str();
}
history += command_;
if (debug) {
+ std::cout << "cy= ";
Write(syntax, code.c_str(), code.size(), std::cout);
std::cout << std::endl;
}
break;
else {
size += read;
- if (size == sizeof(value)) {
- pid = _not(pid_t);
+ if (size == sizeof(value))
goto fail;
- }
}
}
}
if (pid == _not(pid_t)) {
- fprintf(stderr, "invalid pid for -p\n");
+ fprintf(stderr, "unable to find process `%s' using ps\n", arg);
return 1;
}
}
} else if (driver.program_ != NULL) {
std::ostringstream str;
CYOutput out(str, options);
- Setup(out, driver, options);
+ Setup(out, driver, options, true);
out << *driver.program_;
std::string code(str.str());
if (compile)