EncodedJSValue JIT_OPERATION operationValueAddNotNumber(ExecState* exec, EncodedJSValue encodedOp1, EncodedJSValue encodedOp2) { VM* vm = &exec->vm(); NativeCallFrameTracer tracer(vm, exec); JSValue op1 = JSValue::decode(encodedOp1); JSValue op2 = JSValue::decode(encodedOp2); ASSERT(!op1.isNumber() || !op2.isNumber()); if (op1.isString() && !op2.isObject()) return JSValue::encode(jsString(exec, asString(op1), op2.toString(exec))); return JSValue::encode(jsAddSlowCase(exec, op1, op2)); }
EncodedJSValue DFG_OPERATION operationValueAddNotNumber(ExecState* exec, EncodedJSValue encodedOp1, EncodedJSValue encodedOp2) { JSValue op1 = JSValue::decode(encodedOp1); JSValue op2 = JSValue::decode(encodedOp2); ASSERT(!op1.isNumber() || !op2.isNumber()); if (op1.isString()) { if (op2.isString()) return JSValue::encode(jsString(exec, asString(op1), asString(op2))); return JSValue::encode(jsString(exec, asString(op1), op2.toPrimitiveString(exec))); } return JSValue::encode(jsAddSlowCase(exec, op1, op2)); }
EncodedTiValue operationValueAdd(TiExcState* exec, EncodedTiValue encodedOp1, EncodedTiValue encodedOp2) { TiValue op1 = TiValue::decode(encodedOp1); TiValue op2 = TiValue::decode(encodedOp2); if (op1.isInt32() && op2.isInt32()) { int64_t result64 = static_cast<int64_t>(op1.asInt32()) + static_cast<int64_t>(op2.asInt32()); int32_t result32 = static_cast<int32_t>(result64); if (LIKELY(result32 == result64)) return TiValue::encode(jsNumber(result32)); return TiValue::encode(jsNumber((double)result64)); } double number1; double number2; if (op1.getNumber(number1) && op2.getNumber(number2)) return TiValue::encode(jsNumber(number1 + number2)); return TiValue::encode(jsAddSlowCase(exec, op1, op2)); }