static EjsVar *coerceVoidOperands(Ejs *ejs, EjsVoid *lhs, int opcode, EjsVoid *rhs) { switch (opcode) { case EJS_OP_ADD: if (!ejsIsNumber(rhs)) { return ejsInvokeOperator(ejs, (EjsVar*) ejsToString(ejs, lhs), opcode, rhs); } /* Fall through */ 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*) ejs->nanValue, opcode, rhs); /* * Comparision */ case EJS_OP_COMPARE_LE: case EJS_OP_COMPARE_LT: case EJS_OP_COMPARE_GE: case EJS_OP_COMPARE_GT: return (EjsVar*) ejs->falseValue; case EJS_OP_COMPARE_NE: case EJS_OP_COMPARE_STRICTLY_NE: if (ejsIsNull(rhs)) { return (EjsVar*) ejs->falseValue; } return (EjsVar*) ejs->trueValue; case EJS_OP_COMPARE_EQ: case EJS_OP_COMPARE_STRICTLY_EQ: if (ejsIsNull(rhs)) { return (EjsVar*) ejs->trueValue; } 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_UNDEFINED: case EJS_OP_COMPARE_NOT_ZERO: case EJS_OP_COMPARE_NULL: return (EjsVar*) ejs->trueValue; case EJS_OP_COMPARE_FALSE: case EJS_OP_COMPARE_TRUE: case EJS_OP_COMPARE_ZERO: return (EjsVar*) ejs->falseValue; default: ejsThrowTypeError(ejs, "Opcode %d not valid for type %s", opcode, lhs->type->qname.name); return ejs->undefinedValue; } return 0; }
/* * Joins the elements in the array into a single string. * @param sep Element separator. * @return Returns a string. * * function join(sep: String = undefined): String */ static EjsVar *joinArray(Ejs *ejs, EjsArray *ap, int argc, EjsVar **argv) { EjsString *result, *sep; EjsVar *vp; int i; if (argc == 1) { sep = (EjsString*) argv[0]; } else { sep = 0; } result = ejsCreateString(ejs, ""); for (i = 0; i < ap->length; i++) { vp = ap->data[i]; if (vp == 0 || ejsIsUndefined(vp) || ejsIsNull(vp)) { continue; } if (i > 0 && sep) { ejsStrcat(ejs, result, (EjsVar*) sep); } ejsStrcat(ejs, result, vp); } return (EjsVar*) result; }
/* * 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; } }
/* * Report reference errors */ static void reportError(Ejs *ejs, EjsVar *vp) { if (ejsIsNull(vp)) { ejsThrowReferenceError(ejs, "Object reference is null"); } else if (ejsIsUndefined(vp)) { ejsThrowReferenceError(ejs, "Reference is undefined"); } else { ejsThrowReferenceError(ejs, "Undefined setProperty helper"); } }