/* * Interpret from the console or from a literal command */ static int interpretCommands(EcCompiler *cp, cchar *cmd) { Ejs *ejs; EjsString *result; char *tmpArgv[1]; int err; ejs = cp->ejs; if (ecOpenConsoleStream(cp->lexer, (cmd) ? commandGets: consoleGets) < 0) { mprError(cp, "Can't open input"); return EJS_ERR; } if (cmd) { cp->lexer->input->stream->buf = mprStrdup(cp, cmd); } else { cp->interactive = 1; } cp->input = cp->lexer->input; cp->token = cp->lexer->input->token; ecResetInput(cp); tmpArgv[0] = EC_INPUT_STREAM; while (!cp->lexer->input->stream->eof) { err = 0; cp->uid = 0; if (ecCompile(cp, 1, tmpArgv, 0) < 0) { ejs->result = ejs->undefinedValue; err++; } if (cp->run && !err && cp->errorCount == 0) { if (ejsRun(ejs) < 0) { ejsReportError(ejs, "Error in script"); } } if (!ejs->exception && ejs->result != ejs->undefinedValue) { if (ejs->result->primitive || ejsIsDate(ejs->result)) { if ((result = (EjsString*) ejsToString(ejs, ejs->result)) != 0) { mprPrintf(cp, "%s\n", result->value); } } else { if ((result = (EjsString*) ejsToJson(ejs, ejs->result)) != 0) { mprPrintf(cp, "%s\n", result->value); } } } ecResetInput(cp); cp->errorCount = 0; err = 0; } ecCloseStream(cp->lexer); return 0; }
/* * Coerce operands for invokeOperator */ static EjsVar *coerceBooleanOperands(Ejs *ejs, EjsVar *lhs, int opcode, EjsVar *rhs) { switch (opcode) { case EJS_OP_ADD: if (ejsIsUndefined(rhs)) { return (EjsVar*) ejs->nanValue; } else if (ejsIsNull(rhs) || ejsIsNumber(rhs) || ejsIsDate(rhs)) { return ejsInvokeOperator(ejs, (EjsVar*) ejsToNumber(ejs, lhs), opcode, rhs); } else { return ejsInvokeOperator(ejs, (EjsVar*) ejsToString(ejs, lhs), opcode, rhs); } break; case EJS_OP_AND: case EJS_OP_DIV: case EJS_OP_MUL: case EJS_OP_OR: case EJS_OP_REM: case EJS_OP_SHL: case EJS_OP_SHR: case EJS_OP_SUB: case EJS_OP_USHR: case EJS_OP_XOR: return ejsInvokeOperator(ejs, (EjsVar*) ejsToNumber(ejs, lhs), opcode, rhs); case EJS_OP_COMPARE_LE: case EJS_OP_COMPARE_LT: case EJS_OP_COMPARE_GE: case EJS_OP_COMPARE_GT: case EJS_OP_COMPARE_EQ: case EJS_OP_COMPARE_NE: if (ejsIsString(rhs)) { return ejsInvokeOperator(ejs, (EjsVar*) ejsToString(ejs, lhs), opcode, rhs); } return ejsInvokeOperator(ejs, (EjsVar*) ejsToNumber(ejs, lhs), opcode, rhs); case EJS_OP_COMPARE_STRICTLY_NE: return (EjsVar*) ejs->trueValue; case EJS_OP_COMPARE_STRICTLY_EQ: return (EjsVar*) ejs->falseValue; /* * Unary operators */ case EJS_OP_LOGICAL_NOT: case EJS_OP_NOT: case EJS_OP_NEG: return 0; case EJS_OP_COMPARE_NOT_ZERO: case EJS_OP_COMPARE_TRUE: return (EjsVar*) (((EjsBoolean*) lhs)->value ? ejs->trueValue: ejs->falseValue); case EJS_OP_COMPARE_ZERO: case EJS_OP_COMPARE_FALSE: return (EjsVar*) (((EjsBoolean*) lhs)->value ? ejs->falseValue : ejs->trueValue); case EJS_OP_COMPARE_UNDEFINED: case EJS_OP_COMPARE_NULL: return (EjsVar*) ejs->falseValue; default: ejsThrowTypeError(ejs, "Opcode %d not valid for type %s", opcode, lhs->type->qname.name); return ejs->undefinedValue; } }