Changeset 39670 in webkit for trunk/JavaScriptCore/interpreter/Interpreter.cpp
- Timestamp:
- Jan 6, 2009, 9:11:57 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/interpreter/Interpreter.cpp
r39660 r39670 109 109 // FIXME: This operation should be called "getNumber", not "isNumber" (as it is in JSValue.h). 110 110 // FIXME: There's no need to have a "slow" version of this. All versions should be fast. 111 static ALWAYS_INLINE bool fastIsNumber(JSValue *value, double& arg)111 static ALWAYS_INLINE bool fastIsNumber(JSValuePtr value, double& arg) 112 112 { 113 113 if (JSImmediate::isNumber(value)) … … 120 120 } 121 121 122 // FIXME: Why doesn't JSValue *::toInt32 have the Heap::isNumber optimization?123 static bool fastToInt32(JSValue *value, int32_t& arg)122 // FIXME: Why doesn't JSValuePtr::toInt32 have the Heap::isNumber optimization? 123 static bool fastToInt32(JSValuePtr value, int32_t& arg) 124 124 { 125 125 if (JSImmediate::isNumber(value)) … … 132 132 } 133 133 134 static ALWAYS_INLINE bool fastToUInt32(JSValue *value, uint32_t& arg)134 static ALWAYS_INLINE bool fastToUInt32(JSValuePtr value, uint32_t& arg) 135 135 { 136 136 if (JSImmediate::isNumber(value)) { … … 147 147 } 148 148 149 static inline bool jsLess(CallFrame* callFrame, JSValue * v1, JSValue*v2)149 static inline bool jsLess(CallFrame* callFrame, JSValuePtr v1, JSValuePtr v2) 150 150 { 151 151 if (JSImmediate::areBothImmediateNumbers(v1, v2)) … … 161 161 return asString(v1)->value() < asString(v2)->value(); 162 162 163 JSValue *p1;164 JSValue *p2;163 JSValuePtr p1; 164 JSValuePtr p2; 165 165 bool wasNotString1 = v1->getPrimitiveNumber(callFrame, n1, p1); 166 166 bool wasNotString2 = v2->getPrimitiveNumber(callFrame, n2, p2); … … 172 172 } 173 173 174 static inline bool jsLessEq(CallFrame* callFrame, JSValue * v1, JSValue*v2)174 static inline bool jsLessEq(CallFrame* callFrame, JSValuePtr v1, JSValuePtr v2) 175 175 { 176 176 if (JSImmediate::areBothImmediateNumbers(v1, v2)) … … 186 186 return !(asString(v2)->value() < asString(v1)->value()); 187 187 188 JSValue *p1;189 JSValue *p2;188 JSValuePtr p1; 189 JSValuePtr p2; 190 190 bool wasNotString1 = v1->getPrimitiveNumber(callFrame, n1, p1); 191 191 bool wasNotString2 = v2->getPrimitiveNumber(callFrame, n2, p2); … … 197 197 } 198 198 199 static NEVER_INLINE JSValue * jsAddSlowCase(CallFrame* callFrame, JSValue* v1, JSValue*v2)199 static NEVER_INLINE JSValuePtr jsAddSlowCase(CallFrame* callFrame, JSValuePtr v1, JSValuePtr v2) 200 200 { 201 201 // exception for the Date exception in defaultValue() 202 JSValue *p1 = v1->toPrimitive(callFrame);203 JSValue *p2 = v2->toPrimitive(callFrame);202 JSValuePtr p1 = v1->toPrimitive(callFrame); 203 JSValuePtr p2 = v2->toPrimitive(callFrame); 204 204 205 205 if (p1->isString() || p2->isString()) { … … 222 222 // 4000 Add case: 3 5 223 223 224 static ALWAYS_INLINE JSValue * jsAdd(CallFrame* callFrame, JSValue* v1, JSValue*v2)224 static ALWAYS_INLINE JSValuePtr jsAdd(CallFrame* callFrame, JSValuePtr v1, JSValuePtr v2) 225 225 { 226 226 double left; … … 253 253 } 254 254 255 static JSValue * jsTypeStringForValue(CallFrame* callFrame, JSValue*v)255 static JSValuePtr jsTypeStringForValue(CallFrame* callFrame, JSValuePtr v) 256 256 { 257 257 if (v->isUndefined()) … … 275 275 } 276 276 277 static bool jsIsObjectType(JSValue *v)277 static bool jsIsObjectType(JSValuePtr v) 278 278 { 279 279 if (JSImmediate::isImmediate(v)) … … 293 293 } 294 294 295 static bool jsIsFunctionType(JSValue *v)295 static bool jsIsFunctionType(JSValuePtr v) 296 296 { 297 297 if (v->isObject()) { … … 303 303 } 304 304 305 NEVER_INLINE bool Interpreter::resolve(CallFrame* callFrame, Instruction* vPC, JSValue *& exceptionValue)305 NEVER_INLINE bool Interpreter::resolve(CallFrame* callFrame, Instruction* vPC, JSValuePtr& exceptionValue) 306 306 { 307 307 int dst = (vPC + 1)->u.operand; … … 319 319 PropertySlot slot(o); 320 320 if (o->getPropertySlot(callFrame, ident, slot)) { 321 JSValue *result = slot.getValue(callFrame, ident);321 JSValuePtr result = slot.getValue(callFrame, ident); 322 322 exceptionValue = callFrame->globalData().exception; 323 323 if (exceptionValue) 324 324 return false; 325 callFrame[dst] = result;325 callFrame[dst] = JSValuePtr(result); 326 326 return true; 327 327 } … … 331 331 } 332 332 333 NEVER_INLINE bool Interpreter::resolveSkip(CallFrame* callFrame, Instruction* vPC, JSValue *& exceptionValue)333 NEVER_INLINE bool Interpreter::resolveSkip(CallFrame* callFrame, Instruction* vPC, JSValuePtr& exceptionValue) 334 334 { 335 335 CodeBlock* codeBlock = callFrame->codeBlock(); … … 352 352 PropertySlot slot(o); 353 353 if (o->getPropertySlot(callFrame, ident, slot)) { 354 JSValue *result = slot.getValue(callFrame, ident);354 JSValuePtr result = slot.getValue(callFrame, ident); 355 355 exceptionValue = callFrame->globalData().exception; 356 356 if (exceptionValue) 357 357 return false; 358 callFrame[dst] = result;358 callFrame[dst] = JSValuePtr(result); 359 359 return true; 360 360 } … … 364 364 } 365 365 366 NEVER_INLINE bool Interpreter::resolveGlobal(CallFrame* callFrame, Instruction* vPC, JSValue *& exceptionValue)366 NEVER_INLINE bool Interpreter::resolveGlobal(CallFrame* callFrame, Instruction* vPC, JSValuePtr& exceptionValue) 367 367 { 368 368 int dst = (vPC + 1)->u.operand; … … 374 374 375 375 if (structure == globalObject->structure()) { 376 callFrame[dst] = globalObject->getDirectOffset(offset);376 callFrame[dst] = JSValuePtr(globalObject->getDirectOffset(offset)); 377 377 return true; 378 378 } … … 382 382 PropertySlot slot(globalObject); 383 383 if (globalObject->getPropertySlot(callFrame, ident, slot)) { 384 JSValue *result = slot.getValue(callFrame, ident);384 JSValuePtr result = slot.getValue(callFrame, ident); 385 385 if (slot.isCacheable() && !globalObject->structure()->isDictionary()) { 386 386 if (vPC[4].u.structure) … … 389 389 vPC[4] = globalObject->structure(); 390 390 vPC[5] = slot.cachedOffset(); 391 callFrame[dst] = result;391 callFrame[dst] = JSValuePtr(result); 392 392 return true; 393 393 } … … 396 396 if (exceptionValue) 397 397 return false; 398 callFrame[dst] = result;398 callFrame[dst] = JSValuePtr(result); 399 399 return true; 400 400 } … … 404 404 } 405 405 406 static ALWAYS_INLINE JSValue *inlineResolveBase(CallFrame* callFrame, Identifier& property, ScopeChainNode* scopeChain)406 static ALWAYS_INLINE JSValuePtr inlineResolveBase(CallFrame* callFrame, Identifier& property, ScopeChainNode* scopeChain) 407 407 { 408 408 ScopeChainIterator iter = scopeChain->begin(); … … 431 431 int dst = (vPC + 1)->u.operand; 432 432 int property = (vPC + 2)->u.operand; 433 callFrame[dst] = inlineResolveBase(callFrame, callFrame->codeBlock()->identifier(property), callFrame->scopeChain());434 } 435 436 NEVER_INLINE bool Interpreter::resolveBaseAndProperty(CallFrame* callFrame, Instruction* vPC, JSValue *& exceptionValue)433 callFrame[dst] = JSValuePtr(inlineResolveBase(callFrame, callFrame->codeBlock()->identifier(property), callFrame->scopeChain())); 434 } 435 436 NEVER_INLINE bool Interpreter::resolveBaseAndProperty(CallFrame* callFrame, Instruction* vPC, JSValuePtr& exceptionValue) 437 437 { 438 438 int baseDst = (vPC + 1)->u.operand; … … 455 455 PropertySlot slot(base); 456 456 if (base->getPropertySlot(callFrame, ident, slot)) { 457 JSValue *result = slot.getValue(callFrame, ident);457 JSValuePtr result = slot.getValue(callFrame, ident); 458 458 exceptionValue = callFrame->globalData().exception; 459 459 if (exceptionValue) 460 460 return false; 461 callFrame[propDst] = result;462 callFrame[baseDst] = base;461 callFrame[propDst] = JSValuePtr(result); 462 callFrame[baseDst] = JSValuePtr(base); 463 463 return true; 464 464 } … … 470 470 } 471 471 472 NEVER_INLINE bool Interpreter::resolveBaseAndFunc(CallFrame* callFrame, Instruction* vPC, JSValue *& exceptionValue)472 NEVER_INLINE bool Interpreter::resolveBaseAndFunc(CallFrame* callFrame, Instruction* vPC, JSValuePtr& exceptionValue) 473 473 { 474 474 int baseDst = (vPC + 1)->u.operand; … … 499 499 // We also handle wrapper substitution for the global object at the same time. 500 500 JSObject* thisObj = base->toThisObject(callFrame); 501 JSValue *result = slot.getValue(callFrame, ident);501 JSValuePtr result = slot.getValue(callFrame, ident); 502 502 exceptionValue = callFrame->globalData().exception; 503 503 if (exceptionValue) 504 504 return false; 505 505 506 callFrame[baseDst] = thisObj;507 callFrame[funcDst] = result;506 callFrame[baseDst] = JSValuePtr(thisObj); 507 callFrame[funcDst] = JSValuePtr(result); 508 508 return true; 509 509 } … … 552 552 } 553 553 554 static NEVER_INLINE bool isNotObject(CallFrame* callFrame, bool forInstanceOf, CodeBlock* codeBlock, const Instruction* vPC, JSValue * value, JSValue*& exceptionData)554 static NEVER_INLINE bool isNotObject(CallFrame* callFrame, bool forInstanceOf, CodeBlock* codeBlock, const Instruction* vPC, JSValuePtr value, JSValuePtr& exceptionData) 555 555 { 556 556 if (value->isObject()) … … 560 560 } 561 561 562 NEVER_INLINE JSValue * Interpreter::callEval(CallFrame* callFrame, RegisterFile* registerFile, Register* argv, int argc, int registerOffset, JSValue*& exceptionValue)562 NEVER_INLINE JSValuePtr Interpreter::callEval(CallFrame* callFrame, RegisterFile* registerFile, Register* argv, int argc, int registerOffset, JSValuePtr& exceptionValue) 563 563 { 564 564 if (argc < 2) 565 565 return jsUndefined(); 566 566 567 JSValue *program = argv[1].jsValue(callFrame);567 JSValuePtr program = argv[1].jsValue(callFrame); 568 568 569 569 if (!program->isString()) … … 576 576 RefPtr<EvalNode> evalNode = codeBlock->evalCodeCache().get(callFrame, programSource, scopeChain, exceptionValue); 577 577 578 JSValue *result = jsUndefined();578 JSValuePtr result = jsUndefined(); 579 579 if (evalNode) 580 580 result = callFrame->globalData().interpreter->execute(evalNode.get(), callFrame, callFrame->thisValue()->toThisObject(callFrame), callFrame->registers() - registerFile->start() + registerOffset, scopeChain, &exceptionValue); … … 734 734 } 735 735 736 NEVER_INLINE bool Interpreter::unwindCallFrame(CallFrame*& callFrame, JSValue *exceptionValue, unsigned& bytecodeOffset, CodeBlock*& codeBlock)736 NEVER_INLINE bool Interpreter::unwindCallFrame(CallFrame*& callFrame, JSValuePtr exceptionValue, unsigned& bytecodeOffset, CodeBlock*& codeBlock) 737 737 { 738 738 CodeBlock* oldCodeBlock = codeBlock; … … 777 777 } 778 778 779 NEVER_INLINE HandlerInfo* Interpreter::throwException(CallFrame*& callFrame, JSValue *& exceptionValue, unsigned bytecodeOffset, bool explicitThrow)779 NEVER_INLINE HandlerInfo* Interpreter::throwException(CallFrame*& callFrame, JSValuePtr& exceptionValue, unsigned bytecodeOffset, bool explicitThrow) 780 780 { 781 781 // Set up the exception object … … 862 862 } 863 863 864 JSValue * Interpreter::execute(ProgramNode* programNode, CallFrame* callFrame, ScopeChainNode* scopeChain, JSObject* thisObj, JSValue** exception)864 JSValuePtr Interpreter::execute(ProgramNode* programNode, CallFrame* callFrame, ScopeChainNode* scopeChain, JSObject* thisObj, JSValuePtr* exception) 865 865 { 866 866 ASSERT(!scopeChain->globalData->exception); … … 887 887 888 888 CallFrame* newCallFrame = CallFrame::create(oldEnd + codeBlock->m_numParameters + RegisterFile::CallFrameHeaderSize); 889 newCallFrame[codeBlock->thisRegister()] = thisObj;889 newCallFrame[codeBlock->thisRegister()] = JSValuePtr(thisObj); 890 890 newCallFrame->init(codeBlock, 0, scopeChain, CallFrame::noCaller(), 0, 0, 0); 891 891 … … 897 897 (*profiler)->willExecute(newCallFrame, programNode->sourceURL(), programNode->lineNo()); 898 898 899 JSValue *result;899 JSValuePtr result; 900 900 { 901 901 SamplingTool::CallRecord callRecord(m_sampler); … … 923 923 } 924 924 925 JSValue * Interpreter::execute(FunctionBodyNode* functionBodyNode, CallFrame* callFrame, JSFunction* function, JSObject* thisObj, const ArgList& args, ScopeChainNode* scopeChain, JSValue** exception)925 JSValuePtr Interpreter::execute(FunctionBodyNode* functionBodyNode, CallFrame* callFrame, JSFunction* function, JSObject* thisObj, const ArgList& args, ScopeChainNode* scopeChain, JSValuePtr* exception) 926 926 { 927 927 ASSERT(!scopeChain->globalData->exception); … … 944 944 CallFrame* newCallFrame = CallFrame::create(oldEnd); 945 945 size_t dst = 0; 946 newCallFrame[0] = thisObj;946 newCallFrame[0] = JSValuePtr(thisObj); 947 947 ArgList::const_iterator end = args.end(); 948 948 for (ArgList::const_iterator it = args.begin(); it != end; ++it) … … 963 963 (*profiler)->willExecute(newCallFrame, function); 964 964 965 JSValue *result;965 JSValuePtr result; 966 966 { 967 967 SamplingTool::CallRecord callRecord(m_sampler); … … 985 985 } 986 986 987 JSValue * Interpreter::execute(EvalNode* evalNode, CallFrame* callFrame, JSObject* thisObj, ScopeChainNode* scopeChain, JSValue** exception)987 JSValuePtr Interpreter::execute(EvalNode* evalNode, CallFrame* callFrame, JSObject* thisObj, ScopeChainNode* scopeChain, JSValuePtr* exception) 988 988 { 989 989 return execute(evalNode, callFrame, thisObj, m_registerFile.size() + evalNode->bytecode(scopeChain).m_numParameters + RegisterFile::CallFrameHeaderSize, scopeChain, exception); 990 990 } 991 991 992 JSValue * Interpreter::execute(EvalNode* evalNode, CallFrame* callFrame, JSObject* thisObj, int globalRegisterOffset, ScopeChainNode* scopeChain, JSValue** exception)992 JSValuePtr Interpreter::execute(EvalNode* evalNode, CallFrame* callFrame, JSObject* thisObj, int globalRegisterOffset, ScopeChainNode* scopeChain, JSValuePtr* exception) 993 993 { 994 994 ASSERT(!scopeChain->globalData->exception); … … 1045 1045 1046 1046 // a 0 codeBlock indicates a built-in caller 1047 newCallFrame[codeBlock->thisRegister()] = thisObj;1047 newCallFrame[codeBlock->thisRegister()] = JSValuePtr(thisObj); 1048 1048 newCallFrame->init(codeBlock, 0, scopeChain, callFrame->addHostCallFrameFlag(), 0, 0, 0); 1049 1049 … … 1055 1055 (*profiler)->willExecute(newCallFrame, evalNode->sourceURL(), evalNode->lineNo()); 1056 1056 1057 JSValue *result;1057 JSValuePtr result; 1058 1058 { 1059 1059 SamplingTool::CallRecord callRecord(m_sampler); … … 1156 1156 // We have to return a JSValue here, gcc seems to produce worse code if 1157 1157 // we attempt to return a bool 1158 ALWAYS_INLINE JSValue*Interpreter::checkTimeout(JSGlobalObject* globalObject)1158 ALWAYS_INLINE bool Interpreter::checkTimeout(JSGlobalObject* globalObject) 1159 1159 { 1160 1160 unsigned currentTime = getCPUTime(); … … 1163 1163 // Suspicious amount of looping in a script -- start timing it 1164 1164 m_timeAtLastCheckTimeout = currentTime; 1165 return noValue();1165 return false; 1166 1166 } 1167 1167 … … 1184 1184 if (m_timeoutTime && m_timeExecuting > m_timeoutTime) { 1185 1185 if (globalObject->shouldInterruptScript()) 1186 return jsNull(); // Appeasing GCC, all we need is a non-null js value.1186 return true; 1187 1187 1188 1188 resetTimeoutCheck(); 1189 1189 } 1190 1190 1191 return noValue();1191 return false; 1192 1192 } 1193 1193 … … 1197 1197 CodeBlock* codeBlock = callFrame->codeBlock(); 1198 1198 Identifier& property = codeBlock->identifier((++vPC)->u.operand); 1199 JSValue *value = callFrame[(++vPC)->u.operand].jsValue(callFrame);1199 JSValuePtr value = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1200 1200 JSObject* scope = new (callFrame) JSStaticScopeObject(callFrame, property, value, DontDelete); 1201 callFrame[dst] = scope;1201 callFrame[dst] = JSValuePtr(scope); 1202 1202 1203 1203 return callFrame->scopeChain()->push(scope); … … 1206 1206 static StructureChain* cachePrototypeChain(CallFrame* callFrame, Structure* structure) 1207 1207 { 1208 JSValue *prototype = structure->prototypeForLookup(callFrame);1208 JSValuePtr prototype = structure->prototypeForLookup(callFrame); 1209 1209 if (JSImmediate::isImmediate(prototype)) 1210 1210 return 0; … … 1214 1214 } 1215 1215 1216 NEVER_INLINE void Interpreter::tryCachePutByID(CallFrame* callFrame, CodeBlock* codeBlock, Instruction* vPC, JSValue *baseValue, const PutPropertySlot& slot)1216 NEVER_INLINE void Interpreter::tryCachePutByID(CallFrame* callFrame, CodeBlock* codeBlock, Instruction* vPC, JSValuePtr baseValue, const PutPropertySlot& slot) 1217 1217 { 1218 1218 // Recursive invocation may already have specialized this instruction. … … 1291 1291 } 1292 1292 1293 static size_t countPrototypeChainEntriesAndCheckForProxies(CallFrame* callFrame, JSValue *baseValue, const PropertySlot& slot)1293 static size_t countPrototypeChainEntriesAndCheckForProxies(CallFrame* callFrame, JSValuePtr baseValue, const PropertySlot& slot) 1294 1294 { 1295 1295 JSCell* cell = asCell(baseValue); … … 1297 1297 1298 1298 while (slot.slotBase() != cell) { 1299 JSValue *v = cell->structure()->prototypeForLookup(callFrame);1299 JSValuePtr v = cell->structure()->prototypeForLookup(callFrame); 1300 1300 1301 1301 // If we didn't find slotBase in baseValue's prototype chain, then baseValue … … 1322 1322 } 1323 1323 1324 NEVER_INLINE void Interpreter::tryCacheGetByID(CallFrame* callFrame, CodeBlock* codeBlock, Instruction* vPC, JSValue *baseValue, const Identifier& propertyName, const PropertySlot& slot)1324 NEVER_INLINE void Interpreter::tryCacheGetByID(CallFrame* callFrame, CodeBlock* codeBlock, Instruction* vPC, JSValuePtr baseValue, const Identifier& propertyName, const PropertySlot& slot) 1325 1325 { 1326 1326 // Recursive invocation may already have specialized this instruction. … … 1428 1428 } 1429 1429 1430 JSValue * Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFile, CallFrame* callFrame, JSValue** exception)1430 JSValuePtr Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFile, CallFrame* callFrame, JSValuePtr* exception) 1431 1431 { 1432 1432 // One-time initialization of our address tables. We have to put this code … … 1452 1452 1453 1453 JSGlobalData* globalData = &callFrame->globalData(); 1454 JSValue *exceptionValue = noValue();1454 JSValuePtr exceptionValue = noValue(); 1455 1455 HandlerInfo* handler = 0; 1456 1456 … … 1473 1473 #define CHECK_FOR_TIMEOUT() \ 1474 1474 if (!--tickCount) { \ 1475 if ((exceptionValue = checkTimeout(callFrame->dynamicGlobalObject()))) \ 1475 if (checkTimeout(callFrame->dynamicGlobalObject())) { \ 1476 exceptionValue = jsNull(); \ 1476 1477 goto vm_throw; \ 1478 } \ 1477 1479 tickCount = m_ticksUntilNextTimeoutCheck; \ 1478 1480 } … … 1513 1515 */ 1514 1516 int dst = (++vPC)->u.operand; 1515 callFrame[dst] = constructEmptyObject(callFrame);1517 callFrame[dst] = JSValuePtr(constructEmptyObject(callFrame)); 1516 1518 1517 1519 ++vPC; … … 1530 1532 int argCount = (++vPC)->u.operand; 1531 1533 ArgList args(callFrame->registers() + firstArg, argCount); 1532 callFrame[dst] = constructArray(callFrame, args);1534 callFrame[dst] = JSValuePtr(constructArray(callFrame, args)); 1533 1535 1534 1536 ++vPC; … … 1544 1546 int dst = (++vPC)->u.operand; 1545 1547 int regExp = (++vPC)->u.operand; 1546 callFrame[dst] = new (globalData) RegExpObject(callFrame->scopeChain()->globalObject()->regExpStructure(), callFrame->codeBlock()->regexp(regExp));1548 callFrame[dst] = JSValuePtr(new (globalData) RegExpObject(callFrame->scopeChain()->globalObject()->regExpStructure(), callFrame->codeBlock()->regexp(regExp))); 1547 1549 1548 1550 ++vPC; … … 1569 1571 */ 1570 1572 int dst = (++vPC)->u.operand; 1571 JSValue *src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame);1572 JSValue *src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame);1573 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1574 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1573 1575 if (JSImmediate::areBothImmediateNumbers(src1, src2)) 1574 1576 callFrame[dst] = jsBoolean(src1 == src2); 1575 1577 else { 1576 JSValue *result = jsBoolean(equalSlowCase(callFrame, src1, src2));1578 JSValuePtr result = jsBoolean(equalSlowCase(callFrame, src1, src2)); 1577 1579 CHECK_FOR_EXCEPTION(); 1578 1580 callFrame[dst] = result; … … 1589 1591 */ 1590 1592 int dst = (++vPC)->u.operand; 1591 JSValue *src = callFrame[(++vPC)->u.operand].jsValue(callFrame);1593 JSValuePtr src = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1592 1594 1593 1595 if (src->isUndefinedOrNull()) { … … 1609 1611 */ 1610 1612 int dst = (++vPC)->u.operand; 1611 JSValue *src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame);1612 JSValue *src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame);1613 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1614 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1613 1615 if (JSImmediate::areBothImmediateNumbers(src1, src2)) 1614 1616 callFrame[dst] = jsBoolean(src1 != src2); 1615 1617 else { 1616 JSValue *result = jsBoolean(!equalSlowCase(callFrame, src1, src2));1618 JSValuePtr result = jsBoolean(!equalSlowCase(callFrame, src1, src2)); 1617 1619 CHECK_FOR_EXCEPTION(); 1618 1620 callFrame[dst] = result; … … 1629 1631 */ 1630 1632 int dst = (++vPC)->u.operand; 1631 JSValue *src = callFrame[(++vPC)->u.operand].jsValue(callFrame);1633 JSValuePtr src = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1632 1634 1633 1635 if (src->isUndefinedOrNull()) { … … 1649 1651 */ 1650 1652 int dst = (++vPC)->u.operand; 1651 JSValue *src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame);1652 JSValue *src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame);1653 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1654 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1653 1655 if (JSImmediate::areBothImmediate(src1, src2)) 1654 1656 callFrame[dst] = jsBoolean(src1 == src2); … … 1669 1671 */ 1670 1672 int dst = (++vPC)->u.operand; 1671 JSValue *src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame);1672 JSValue *src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame);1673 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1674 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1673 1675 1674 1676 if (JSImmediate::areBothImmediate(src1, src2)) … … 1690 1692 */ 1691 1693 int dst = (++vPC)->u.operand; 1692 JSValue *src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame);1693 JSValue *src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame);1694 JSValue *result = jsBoolean(jsLess(callFrame, src1, src2));1694 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1695 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1696 JSValuePtr result = jsBoolean(jsLess(callFrame, src1, src2)); 1695 1697 CHECK_FOR_EXCEPTION(); 1696 1698 callFrame[dst] = result; … … 1707 1709 */ 1708 1710 int dst = (++vPC)->u.operand; 1709 JSValue *src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame);1710 JSValue *src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame);1711 JSValue *result = jsBoolean(jsLessEq(callFrame, src1, src2));1711 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1712 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1713 JSValuePtr result = jsBoolean(jsLessEq(callFrame, src1, src2)); 1712 1714 CHECK_FOR_EXCEPTION(); 1713 1715 callFrame[dst] = result; … … 1723 1725 */ 1724 1726 int srcDst = (++vPC)->u.operand; 1725 JSValue *v = callFrame[srcDst].jsValue(callFrame);1727 JSValuePtr v = callFrame[srcDst].jsValue(callFrame); 1726 1728 if (JSImmediate::canDoFastAdditiveOperations(v)) 1727 callFrame[srcDst] = JS Immediate::incImmediateNumber(v);1729 callFrame[srcDst] = JSValuePtr(JSImmediate::incImmediateNumber(v)); 1728 1730 else { 1729 JSValue *result = jsNumber(callFrame, v->toNumber(callFrame) + 1);1731 JSValuePtr result = jsNumber(callFrame, v->toNumber(callFrame) + 1); 1730 1732 CHECK_FOR_EXCEPTION(); 1731 1733 callFrame[srcDst] = result; … … 1742 1744 */ 1743 1745 int srcDst = (++vPC)->u.operand; 1744 JSValue *v = callFrame[srcDst].jsValue(callFrame);1746 JSValuePtr v = callFrame[srcDst].jsValue(callFrame); 1745 1747 if (JSImmediate::canDoFastAdditiveOperations(v)) 1746 callFrame[srcDst] = JS Immediate::decImmediateNumber(v);1748 callFrame[srcDst] = JSValuePtr(JSImmediate::decImmediateNumber(v)); 1747 1749 else { 1748 JSValue *result = jsNumber(callFrame, v->toNumber(callFrame) - 1);1750 JSValuePtr result = jsNumber(callFrame, v->toNumber(callFrame) - 1); 1749 1751 CHECK_FOR_EXCEPTION(); 1750 1752 callFrame[srcDst] = result; … … 1763 1765 int dst = (++vPC)->u.operand; 1764 1766 int srcDst = (++vPC)->u.operand; 1765 JSValue *v = callFrame[srcDst].jsValue(callFrame);1767 JSValuePtr v = callFrame[srcDst].jsValue(callFrame); 1766 1768 if (JSImmediate::canDoFastAdditiveOperations(v)) { 1767 1769 callFrame[dst] = v; 1768 callFrame[srcDst] = JS Immediate::incImmediateNumber(v);1770 callFrame[srcDst] = JSValuePtr(JSImmediate::incImmediateNumber(v)); 1769 1771 } else { 1770 JSValue *number = callFrame[srcDst].jsValue(callFrame)->toJSNumber(callFrame);1772 JSValuePtr number = callFrame[srcDst].jsValue(callFrame)->toJSNumber(callFrame); 1771 1773 CHECK_FOR_EXCEPTION(); 1772 1774 callFrame[dst] = number; 1773 callFrame[srcDst] = jsNumber(callFrame, number->uncheckedGetNumber() + 1);1775 callFrame[srcDst] = JSValuePtr(jsNumber(callFrame, number->uncheckedGetNumber() + 1)); 1774 1776 } 1775 1777 … … 1786 1788 int dst = (++vPC)->u.operand; 1787 1789 int srcDst = (++vPC)->u.operand; 1788 JSValue *v = callFrame[srcDst].jsValue(callFrame);1790 JSValuePtr v = callFrame[srcDst].jsValue(callFrame); 1789 1791 if (JSImmediate::canDoFastAdditiveOperations(v)) { 1790 1792 callFrame[dst] = v; 1791 callFrame[srcDst] = JS Immediate::decImmediateNumber(v);1793 callFrame[srcDst] = JSValuePtr(JSImmediate::decImmediateNumber(v)); 1792 1794 } else { 1793 JSValue *number = callFrame[srcDst].jsValue(callFrame)->toJSNumber(callFrame);1795 JSValuePtr number = callFrame[srcDst].jsValue(callFrame)->toJSNumber(callFrame); 1794 1796 CHECK_FOR_EXCEPTION(); 1795 1797 callFrame[dst] = number; 1796 callFrame[srcDst] = jsNumber(callFrame, number->uncheckedGetNumber() - 1);1798 callFrame[srcDst] = JSValuePtr(jsNumber(callFrame, number->uncheckedGetNumber() - 1)); 1797 1799 } 1798 1800 … … 1809 1811 int src = (++vPC)->u.operand; 1810 1812 1811 JSValue *srcVal = callFrame[src].jsValue(callFrame);1813 JSValuePtr srcVal = callFrame[src].jsValue(callFrame); 1812 1814 1813 1815 if (LIKELY(srcVal->isNumber())) 1814 1816 callFrame[dst] = callFrame[src]; 1815 1817 else { 1816 JSValue *result = srcVal->toJSNumber(callFrame);1818 JSValuePtr result = srcVal->toJSNumber(callFrame); 1817 1819 CHECK_FOR_EXCEPTION(); 1818 1820 callFrame[dst] = result; … … 1829 1831 */ 1830 1832 int dst = (++vPC)->u.operand; 1831 JSValue *src = callFrame[(++vPC)->u.operand].jsValue(callFrame);1833 JSValuePtr src = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1832 1834 ++vPC; 1833 1835 double v; 1834 1836 if (fastIsNumber(src, v)) 1835 callFrame[dst] = jsNumber(callFrame, -v);1837 callFrame[dst] = JSValuePtr(jsNumber(callFrame, -v)); 1836 1838 else { 1837 JSValue *result = jsNumber(callFrame, -src->toNumber(callFrame));1839 JSValuePtr result = jsNumber(callFrame, -src->toNumber(callFrame)); 1838 1840 CHECK_FOR_EXCEPTION(); 1839 1841 callFrame[dst] = result; … … 1850 1852 */ 1851 1853 int dst = (++vPC)->u.operand; 1852 JSValue *src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame);1853 JSValue *src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame);1854 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1855 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1854 1856 if (JSImmediate::canDoFastAdditiveOperations(src1) && JSImmediate::canDoFastAdditiveOperations(src2)) 1855 callFrame[dst] = JS Immediate::addImmediateNumbers(src1, src2);1857 callFrame[dst] = JSValuePtr(JSImmediate::addImmediateNumbers(src1, src2)); 1856 1858 else { 1857 JSValue *result = jsAdd(callFrame, src1, src2);1859 JSValuePtr result = jsAdd(callFrame, src1, src2); 1858 1860 CHECK_FOR_EXCEPTION(); 1859 1861 callFrame[dst] = result; … … 1869 1871 */ 1870 1872 int dst = (++vPC)->u.operand; 1871 JSValue *src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame);1872 JSValue *src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame);1873 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1874 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1873 1875 double left; 1874 1876 double right; … … 1877 1879 int32_t right = JSImmediate::getTruncatedInt32(src2); 1878 1880 if ((left | right) >> 15 == 0) 1879 callFrame[dst] = jsNumber(callFrame, left * right);1881 callFrame[dst] = JSValuePtr(jsNumber(callFrame, left * right)); 1880 1882 else 1881 callFrame[dst] = jsNumber(callFrame, static_cast<double>(left) * static_cast<double>(right));1883 callFrame[dst] = JSValuePtr(jsNumber(callFrame, static_cast<double>(left) * static_cast<double>(right))); 1882 1884 } else if (fastIsNumber(src1, left) && fastIsNumber(src2, right)) 1883 callFrame[dst] = jsNumber(callFrame, left * right);1885 callFrame[dst] = JSValuePtr(jsNumber(callFrame, left * right)); 1884 1886 else { 1885 JSValue *result = jsNumber(callFrame, src1->toNumber(callFrame) * src2->toNumber(callFrame));1887 JSValuePtr result = jsNumber(callFrame, src1->toNumber(callFrame) * src2->toNumber(callFrame)); 1886 1888 CHECK_FOR_EXCEPTION(); 1887 1889 callFrame[dst] = result; … … 1899 1901 */ 1900 1902 int dst = (++vPC)->u.operand; 1901 JSValue *dividend = callFrame[(++vPC)->u.operand].jsValue(callFrame);1902 JSValue *divisor = callFrame[(++vPC)->u.operand].jsValue(callFrame);1903 JSValuePtr dividend = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1904 JSValuePtr divisor = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1903 1905 double left; 1904 1906 double right; 1905 1907 if (fastIsNumber(dividend, left) && fastIsNumber(divisor, right)) 1906 callFrame[dst] = jsNumber(callFrame, left / right);1908 callFrame[dst] = JSValuePtr(jsNumber(callFrame, left / right)); 1907 1909 else { 1908 JSValue *result = jsNumber(callFrame, dividend->toNumber(callFrame) / divisor->toNumber(callFrame));1910 JSValuePtr result = jsNumber(callFrame, dividend->toNumber(callFrame) / divisor->toNumber(callFrame)); 1909 1911 CHECK_FOR_EXCEPTION(); 1910 1912 callFrame[dst] = result; … … 1924 1926 int divisor = (++vPC)->u.operand; 1925 1927 1926 JSValue *dividendValue = callFrame[dividend].jsValue(callFrame);1927 JSValue *divisorValue = callFrame[divisor].jsValue(callFrame);1928 JSValuePtr dividendValue = callFrame[dividend].jsValue(callFrame); 1929 JSValuePtr divisorValue = callFrame[divisor].jsValue(callFrame); 1928 1930 1929 1931 if (JSImmediate::areBothImmediateNumbers(dividendValue, divisorValue) && divisorValue != JSImmediate::from(0)) { 1930 callFrame[dst] = JS Immediate::from(JSImmediate::getTruncatedInt32(dividendValue) % JSImmediate::getTruncatedInt32(divisorValue));1932 callFrame[dst] = JSValuePtr(JSImmediate::from(JSImmediate::getTruncatedInt32(dividendValue) % JSImmediate::getTruncatedInt32(divisorValue))); 1931 1933 ++vPC; 1932 1934 NEXT_INSTRUCTION(); … … 1934 1936 1935 1937 double d = dividendValue->toNumber(callFrame); 1936 JSValue *result = jsNumber(callFrame, fmod(d, divisorValue->toNumber(callFrame)));1938 JSValuePtr result = jsNumber(callFrame, fmod(d, divisorValue->toNumber(callFrame))); 1937 1939 CHECK_FOR_EXCEPTION(); 1938 1940 callFrame[dst] = result; … … 1948 1950 */ 1949 1951 int dst = (++vPC)->u.operand; 1950 JSValue *src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame);1951 JSValue *src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame);1952 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1953 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1952 1954 double left; 1953 1955 double right; 1954 1956 if (JSImmediate::canDoFastAdditiveOperations(src1) && JSImmediate::canDoFastAdditiveOperations(src2)) 1955 callFrame[dst] = JS Immediate::subImmediateNumbers(src1, src2);1957 callFrame[dst] = JSValuePtr(JSImmediate::subImmediateNumbers(src1, src2)); 1956 1958 else if (fastIsNumber(src1, left) && fastIsNumber(src2, right)) 1957 callFrame[dst] = jsNumber(callFrame, left - right);1959 callFrame[dst] = JSValuePtr(jsNumber(callFrame, left - right)); 1958 1960 else { 1959 JSValue *result = jsNumber(callFrame, src1->toNumber(callFrame) - src2->toNumber(callFrame));1961 JSValuePtr result = jsNumber(callFrame, src1->toNumber(callFrame) - src2->toNumber(callFrame)); 1960 1962 CHECK_FOR_EXCEPTION(); 1961 1963 callFrame[dst] = result; … … 1972 1974 */ 1973 1975 int dst = (++vPC)->u.operand; 1974 JSValue *val = callFrame[(++vPC)->u.operand].jsValue(callFrame);1975 JSValue *shift = callFrame[(++vPC)->u.operand].jsValue(callFrame);1976 JSValuePtr val = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1977 JSValuePtr shift = callFrame[(++vPC)->u.operand].jsValue(callFrame); 1976 1978 int32_t left; 1977 1979 uint32_t right; 1978 1980 if (JSImmediate::areBothImmediateNumbers(val, shift)) 1979 callFrame[dst] = jsNumber(callFrame, JSImmediate::getTruncatedInt32(val) << (JSImmediate::getTruncatedUInt32(shift) & 0x1f));1981 callFrame[dst] = JSValuePtr(jsNumber(callFrame, JSImmediate::getTruncatedInt32(val) << (JSImmediate::getTruncatedUInt32(shift) & 0x1f))); 1980 1982 else if (fastToInt32(val, left) && fastToUInt32(shift, right)) 1981 callFrame[dst] = jsNumber(callFrame, left << (right & 0x1f));1983 callFrame[dst] = JSValuePtr(jsNumber(callFrame, left << (right & 0x1f))); 1982 1984 else { 1983 JSValue *result = jsNumber(callFrame, (val->toInt32(callFrame)) << (shift->toUInt32(callFrame) & 0x1f));1985 JSValuePtr result = jsNumber(callFrame, (val->toInt32(callFrame)) << (shift->toUInt32(callFrame) & 0x1f)); 1984 1986 CHECK_FOR_EXCEPTION(); 1985 1987 callFrame[dst] = result; … … 1997 1999 */ 1998 2000 int dst = (++vPC)->u.operand; 1999 JSValue *val = callFrame[(++vPC)->u.operand].jsValue(callFrame);2000 JSValue *shift = callFrame[(++vPC)->u.operand].jsValue(callFrame);2001 JSValuePtr val = callFrame[(++vPC)->u.operand].jsValue(callFrame); 2002 JSValuePtr shift = callFrame[(++vPC)->u.operand].jsValue(callFrame); 2001 2003 int32_t left; 2002 2004 uint32_t right; 2003 2005 if (JSImmediate::areBothImmediateNumbers(val, shift)) 2004 callFrame[dst] = JS Immediate::rightShiftImmediateNumbers(val, shift);2006 callFrame[dst] = JSValuePtr(JSImmediate::rightShiftImmediateNumbers(val, shift)); 2005 2007 else if (fastToInt32(val, left) && fastToUInt32(shift, right)) 2006 callFrame[dst] = jsNumber(callFrame, left >> (right & 0x1f));2008 callFrame[dst] = JSValuePtr(jsNumber(callFrame, left >> (right & 0x1f))); 2007 2009 else { 2008 JSValue *result = jsNumber(callFrame, (val->toInt32(callFrame)) >> (shift->toUInt32(callFrame) & 0x1f));2010 JSValuePtr result = jsNumber(callFrame, (val->toInt32(callFrame)) >> (shift->toUInt32(callFrame) & 0x1f)); 2009 2011 CHECK_FOR_EXCEPTION(); 2010 2012 callFrame[dst] = result; … … 2022 2024 */ 2023 2025 int dst = (++vPC)->u.operand; 2024 JSValue *val = callFrame[(++vPC)->u.operand].jsValue(callFrame);2025 JSValue *shift = callFrame[(++vPC)->u.operand].jsValue(callFrame);2026 JSValuePtr val = callFrame[(++vPC)->u.operand].jsValue(callFrame); 2027 JSValuePtr shift = callFrame[(++vPC)->u.operand].jsValue(callFrame); 2026 2028 if (JSImmediate::areBothImmediateNumbers(val, shift) && !JSImmediate::isNegative(val)) 2027 callFrame[dst] = JS Immediate::rightShiftImmediateNumbers(val, shift);2029 callFrame[dst] = JSValuePtr(JSImmediate::rightShiftImmediateNumbers(val, shift)); 2028 2030 else { 2029 JSValue *result = jsNumber(callFrame, (val->toUInt32(callFrame)) >> (shift->toUInt32(callFrame) & 0x1f));2031 JSValuePtr result = jsNumber(callFrame, (val->toUInt32(callFrame)) >> (shift->toUInt32(callFrame) & 0x1f)); 2030 2032 CHECK_FOR_EXCEPTION(); 2031 2033 callFrame[dst] = result; … … 2043 2045 */ 2044 2046 int dst = (++vPC)->u.operand; 2045 JSValue *src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame);2046 JSValue *src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame);2047 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 2048 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 2047 2049 int32_t left; 2048 2050 int32_t right; 2049 2051 if (JSImmediate::areBothImmediateNumbers(src1, src2)) 2050 callFrame[dst] = JS Immediate::andImmediateNumbers(src1, src2);2052 callFrame[dst] = JSValuePtr(JSImmediate::andImmediateNumbers(src1, src2)); 2051 2053 else if (fastToInt32(src1, left) && fastToInt32(src2, right)) 2052 callFrame[dst] = jsNumber(callFrame, left & right);2054 callFrame[dst] = JSValuePtr(jsNumber(callFrame, left & right)); 2053 2055 else { 2054 JSValue *result = jsNumber(callFrame, src1->toInt32(callFrame) & src2->toInt32(callFrame));2056 JSValuePtr result = jsNumber(callFrame, src1->toInt32(callFrame) & src2->toInt32(callFrame)); 2055 2057 CHECK_FOR_EXCEPTION(); 2056 2058 callFrame[dst] = result; … … 2068 2070 */ 2069 2071 int dst = (++vPC)->u.operand; 2070 JSValue *src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame);2071 JSValue *src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame);2072 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 2073 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 2072 2074 int32_t left; 2073 2075 int32_t right; 2074 2076 if (JSImmediate::areBothImmediateNumbers(src1, src2)) 2075 callFrame[dst] = JS Immediate::xorImmediateNumbers(src1, src2);2077 callFrame[dst] = JSValuePtr(JSImmediate::xorImmediateNumbers(src1, src2)); 2076 2078 else if (fastToInt32(src1, left) && fastToInt32(src2, right)) 2077 callFrame[dst] = jsNumber(callFrame, left ^ right);2079 callFrame[dst] = JSValuePtr(jsNumber(callFrame, left ^ right)); 2078 2080 else { 2079 JSValue *result = jsNumber(callFrame, src1->toInt32(callFrame) ^ src2->toInt32(callFrame));2081 JSValuePtr result = jsNumber(callFrame, src1->toInt32(callFrame) ^ src2->toInt32(callFrame)); 2080 2082 CHECK_FOR_EXCEPTION(); 2081 2083 callFrame[dst] = result; … … 2093 2095 */ 2094 2096 int dst = (++vPC)->u.operand; 2095 JSValue *src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame);2096 JSValue *src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame);2097 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 2098 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 2097 2099 int32_t left; 2098 2100 int32_t right; 2099 2101 if (JSImmediate::areBothImmediateNumbers(src1, src2)) 2100 callFrame[dst] = JS Immediate::orImmediateNumbers(src1, src2);2102 callFrame[dst] = JSValuePtr(JSImmediate::orImmediateNumbers(src1, src2)); 2101 2103 else if (fastToInt32(src1, left) && fastToInt32(src2, right)) 2102 callFrame[dst] = jsNumber(callFrame, left | right);2104 callFrame[dst] = JSValuePtr(jsNumber(callFrame, left | right)); 2103 2105 else { 2104 JSValue *result = jsNumber(callFrame, src1->toInt32(callFrame) | src2->toInt32(callFrame));2106 JSValuePtr result = jsNumber(callFrame, src1->toInt32(callFrame) | src2->toInt32(callFrame)); 2105 2107 CHECK_FOR_EXCEPTION(); 2106 2108 callFrame[dst] = result; … … 2117 2119 */ 2118 2120 int dst = (++vPC)->u.operand; 2119 JSValue *src = callFrame[(++vPC)->u.operand].jsValue(callFrame);2121 JSValuePtr src = callFrame[(++vPC)->u.operand].jsValue(callFrame); 2120 2122 int32_t value; 2121 2123 if (fastToInt32(src, value)) 2122 callFrame[dst] = jsNumber(callFrame, ~value);2124 callFrame[dst] = JSValuePtr(jsNumber(callFrame, ~value)); 2123 2125 else { 2124 JSValue *result = jsNumber(callFrame, ~src->toInt32(callFrame));2126 JSValuePtr result = jsNumber(callFrame, ~src->toInt32(callFrame)); 2125 2127 CHECK_FOR_EXCEPTION(); 2126 2128 callFrame[dst] = result; … … 2137 2139 int dst = (++vPC)->u.operand; 2138 2140 int src = (++vPC)->u.operand; 2139 JSValue *result = jsBoolean(!callFrame[src].jsValue(callFrame)->toBoolean(callFrame));2141 JSValuePtr result = jsBoolean(!callFrame[src].jsValue(callFrame)->toBoolean(callFrame)); 2140 2142 CHECK_FOR_EXCEPTION(); 2141 2143 callFrame[dst] = result; … … 2162 2164 int baseProto = vPC[4].u.operand; 2163 2165 2164 JSValue *baseVal = callFrame[base].jsValue(callFrame);2166 JSValuePtr baseVal = callFrame[base].jsValue(callFrame); 2165 2167 2166 2168 if (isNotObject(callFrame, true, callFrame->codeBlock(), vPC, baseVal, exceptionValue)) … … 2181 2183 int dst = (++vPC)->u.operand; 2182 2184 int src = (++vPC)->u.operand; 2183 callFrame[dst] = jsTypeStringForValue(callFrame, callFrame[src].jsValue(callFrame));2185 callFrame[dst] = JSValuePtr(jsTypeStringForValue(callFrame, callFrame[src].jsValue(callFrame))); 2184 2186 2185 2187 ++vPC; … … 2195 2197 int dst = (++vPC)->u.operand; 2196 2198 int src = (++vPC)->u.operand; 2197 JSValue *v = callFrame[src].jsValue(callFrame);2199 JSValuePtr v = callFrame[src].jsValue(callFrame); 2198 2200 callFrame[dst] = jsBoolean(JSImmediate::isImmediate(v) ? v->isUndefined() : v->asCell()->structure()->typeInfo().masqueradesAsUndefined()); 2199 2201 … … 2284 2286 int base = (++vPC)->u.operand; 2285 2287 2286 JSValue *baseVal = callFrame[base].jsValue(callFrame);2288 JSValuePtr baseVal = callFrame[base].jsValue(callFrame); 2287 2289 if (isNotObject(callFrame, false, callFrame->codeBlock(), vPC, baseVal, exceptionValue)) 2288 2290 goto vm_throw; … … 2290 2292 JSObject* baseObj = asObject(baseVal); 2291 2293 2292 JSValue *propName = callFrame[property].jsValue(callFrame);2294 JSValuePtr propName = callFrame[property].jsValue(callFrame); 2293 2295 2294 2296 uint32_t i; … … 2370 2372 int value = (++vPC)->u.operand; 2371 2373 2372 scope->registerAt(index) = callFrame[value].jsValue(callFrame);2374 scope->registerAt(index) = JSValuePtr(callFrame[value].jsValue(callFrame)); 2373 2375 ++vPC; 2374 2376 NEXT_INSTRUCTION(); … … 2418 2420 ASSERT((*iter)->isVariableObject()); 2419 2421 JSVariableObject* scope = static_cast<JSVariableObject*>(*iter); 2420 scope->registerAt(index) = callFrame[value].jsValue(callFrame);2422 scope->registerAt(index) = JSValuePtr(callFrame[value].jsValue(callFrame)); 2421 2423 ++vPC; 2422 2424 NEXT_INSTRUCTION(); … … 2486 2488 CodeBlock* codeBlock = callFrame->codeBlock(); 2487 2489 Identifier& ident = codeBlock->identifier(property); 2488 JSValue *baseValue = callFrame[base].jsValue(callFrame);2490 JSValuePtr baseValue = callFrame[base].jsValue(callFrame); 2489 2491 PropertySlot slot(baseValue); 2490 JSValue *result = baseValue->get(callFrame, ident, slot);2492 JSValuePtr result = baseValue->get(callFrame, ident, slot); 2491 2493 CHECK_FOR_EXCEPTION(); 2492 2494 … … 2505 2507 */ 2506 2508 int base = vPC[2].u.operand; 2507 JSValue *baseValue = callFrame[base].jsValue(callFrame);2509 JSValuePtr baseValue = callFrame[base].jsValue(callFrame); 2508 2510 2509 2511 if (LIKELY(!JSImmediate::isImmediate(baseValue))) { … … 2518 2520 2519 2521 ASSERT(baseObject->get(callFrame, callFrame->codeBlock()->identifier(vPC[3].u.operand)) == baseObject->getDirectOffset(offset)); 2520 callFrame[dst] = baseObject->getDirectOffset(offset);2522 callFrame[dst] = JSValuePtr(baseObject->getDirectOffset(offset)); 2521 2523 2522 2524 vPC += 8; … … 2536 2538 */ 2537 2539 int base = vPC[2].u.operand; 2538 JSValue *baseValue = callFrame[base].jsValue(callFrame);2540 JSValuePtr baseValue = callFrame[base].jsValue(callFrame); 2539 2541 2540 2542 if (LIKELY(!JSImmediate::isImmediate(baseValue))) { … … 2552 2554 2553 2555 ASSERT(protoObject->get(callFrame, callFrame->codeBlock()->identifier(vPC[3].u.operand)) == protoObject->getDirectOffset(offset)); 2554 callFrame[dst] = protoObject->getDirectOffset(offset);2556 callFrame[dst] = JSValuePtr(protoObject->getDirectOffset(offset)); 2555 2557 2556 2558 vPC += 8; … … 2585 2587 */ 2586 2588 int base = vPC[2].u.operand; 2587 JSValue *baseValue = callFrame[base].jsValue(callFrame);2589 JSValuePtr baseValue = callFrame[base].jsValue(callFrame); 2588 2590 2589 2591 if (LIKELY(!JSImmediate::isImmediate(baseValue))) { … … 2607 2609 2608 2610 ASSERT(baseObject->get(callFrame, callFrame->codeBlock()->identifier(vPC[3].u.operand)) == baseObject->getDirectOffset(offset)); 2609 callFrame[dst] = baseObject->getDirectOffset(offset);2611 callFrame[dst] = JSValuePtr(baseObject->getDirectOffset(offset)); 2610 2612 2611 2613 vPC += 8; … … 2630 2632 2631 2633 Identifier& ident = callFrame->codeBlock()->identifier(property); 2632 JSValue *baseValue = callFrame[base].jsValue(callFrame);2634 JSValuePtr baseValue = callFrame[base].jsValue(callFrame); 2633 2635 PropertySlot slot(baseValue); 2634 JSValue *result = baseValue->get(callFrame, ident, slot);2636 JSValuePtr result = baseValue->get(callFrame, ident, slot); 2635 2637 CHECK_FOR_EXCEPTION(); 2636 2638 … … 2648 2650 2649 2651 int base = vPC[2].u.operand; 2650 JSValue *baseValue = callFrame[base].jsValue(callFrame);2652 JSValuePtr baseValue = callFrame[base].jsValue(callFrame); 2651 2653 if (LIKELY(isJSArray(baseValue))) { 2652 2654 int dst = vPC[1].u.operand; 2653 callFrame[dst] = jsNumber(callFrame, asArray(baseValue)->length());2655 callFrame[dst] = JSValuePtr(jsNumber(callFrame, asArray(baseValue)->length())); 2654 2656 vPC += 8; 2655 2657 NEXT_INSTRUCTION(); … … 2668 2670 2669 2671 int base = vPC[2].u.operand; 2670 JSValue *baseValue = callFrame[base].jsValue(callFrame);2672 JSValuePtr baseValue = callFrame[base].jsValue(callFrame); 2671 2673 if (LIKELY(isJSString(baseValue))) { 2672 2674 int dst = vPC[1].u.operand; 2673 callFrame[dst] = jsNumber(callFrame, asString(baseValue)->value().size());2675 callFrame[dst] = JSValuePtr(jsNumber(callFrame, asString(baseValue)->value().size())); 2674 2676 vPC += 8; 2675 2677 NEXT_INSTRUCTION(); … … 2694 2696 2695 2697 CodeBlock* codeBlock = callFrame->codeBlock(); 2696 JSValue *baseValue = callFrame[base].jsValue(callFrame);2698 JSValuePtr baseValue = callFrame[base].jsValue(callFrame); 2697 2699 Identifier& ident = codeBlock->identifier(property); 2698 2700 PutPropertySlot slot; … … 2717 2719 */ 2718 2720 int base = vPC[1].u.operand; 2719 JSValue *baseValue = callFrame[base].jsValue(callFrame);2721 JSValuePtr baseValue = callFrame[base].jsValue(callFrame); 2720 2722 2721 2723 if (LIKELY(!JSImmediate::isImmediate(baseValue))) { … … 2730 2732 RefPtr<Structure>* it = vPC[6].u.structureChain->head(); 2731 2733 2732 JSValue *proto = baseObject->structure()->prototypeForLookup(callFrame);2734 JSValuePtr proto = baseObject->structure()->prototypeForLookup(callFrame); 2733 2735 while (!proto->isNull()) { 2734 2736 if (UNLIKELY(asObject(proto)->structure() != (*it).get())) { … … 2767 2769 */ 2768 2770 int base = vPC[1].u.operand; 2769 JSValue *baseValue = callFrame[base].jsValue(callFrame);2771 JSValuePtr baseValue = callFrame[base].jsValue(callFrame); 2770 2772 2771 2773 if (LIKELY(!JSImmediate::isImmediate(baseValue))) { … … 2803 2805 int value = vPC[3].u.operand; 2804 2806 2805 JSValue *baseValue = callFrame[base].jsValue(callFrame);2807 JSValuePtr baseValue = callFrame[base].jsValue(callFrame); 2806 2808 Identifier& ident = callFrame->codeBlock()->identifier(property); 2807 2809 PutPropertySlot slot; … … 2826 2828 JSObject* baseObj = callFrame[base].jsValue(callFrame)->toObject(callFrame); 2827 2829 Identifier& ident = callFrame->codeBlock()->identifier(property); 2828 JSValue *result = jsBoolean(baseObj->deleteProperty(callFrame, ident));2830 JSValuePtr result = jsBoolean(baseObj->deleteProperty(callFrame, ident)); 2829 2831 CHECK_FOR_EXCEPTION(); 2830 2832 callFrame[dst] = result; … … 2844 2846 int property = (++vPC)->u.operand; 2845 2847 2846 JSValue *baseValue = callFrame[base].jsValue(callFrame);2847 JSValue *subscript = callFrame[property].jsValue(callFrame);2848 2849 JSValue *result;2848 JSValuePtr baseValue = callFrame[base].jsValue(callFrame); 2849 JSValuePtr subscript = callFrame[property].jsValue(callFrame); 2850 2851 JSValuePtr result; 2850 2852 unsigned i; 2851 2853 … … 2889 2891 int value = (++vPC)->u.operand; 2890 2892 2891 JSValue *baseValue = callFrame[base].jsValue(callFrame);2892 JSValue *subscript = callFrame[property].jsValue(callFrame);2893 JSValuePtr baseValue = callFrame[base].jsValue(callFrame); 2894 JSValuePtr subscript = callFrame[property].jsValue(callFrame); 2893 2895 2894 2896 unsigned i; … … 2905 2907 JSByteArray* jsByteArray = asByteArray(baseValue); 2906 2908 double dValue = 0; 2907 JSValue *jsValue = callFrame[value].jsValue(callFrame);2909 JSValuePtr jsValue = callFrame[value].jsValue(callFrame); 2908 2910 if (JSImmediate::isNumber(jsValue)) 2909 2911 jsByteArray->setIndex(i, JSImmediate::getTruncatedInt32(jsValue)); … … 2940 2942 JSObject* baseObj = callFrame[base].jsValue(callFrame)->toObject(callFrame); // may throw 2941 2943 2942 JSValue *subscript = callFrame[property].jsValue(callFrame);2943 JSValue *result;2944 JSValuePtr subscript = callFrame[property].jsValue(callFrame); 2945 JSValuePtr result; 2944 2946 uint32_t i; 2945 2947 if (subscript->getUInt32(i)) … … 3069 3071 int src = (++vPC)->u.operand; 3070 3072 int target = (++vPC)->u.operand; 3071 JSValue *srcValue = callFrame[src].jsValue(callFrame);3073 JSValuePtr srcValue = callFrame[src].jsValue(callFrame); 3072 3074 3073 3075 if (srcValue->isUndefinedOrNull() || (!JSImmediate::isImmediate(srcValue) && srcValue->asCell()->structure()->typeInfo().masqueradesAsUndefined())) { … … 3087 3089 int src = (++vPC)->u.operand; 3088 3090 int target = (++vPC)->u.operand; 3089 JSValue *srcValue = callFrame[src].jsValue(callFrame);3091 JSValuePtr srcValue = callFrame[src].jsValue(callFrame); 3090 3092 3091 3093 if (!srcValue->isUndefinedOrNull() || (!JSImmediate::isImmediate(srcValue) && !srcValue->asCell()->structure()->typeInfo().masqueradesAsUndefined())) { … … 3108 3110 the JS timeout is reached. 3109 3111 */ 3110 JSValue *src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame);3111 JSValue *src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame);3112 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 3113 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 3112 3114 int target = (++vPC)->u.operand; 3113 3115 … … 3135 3137 the JS timeout is reached. 3136 3138 */ 3137 JSValue *src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame);3138 JSValue *src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame);3139 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 3140 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 3139 3141 int target = (++vPC)->u.operand; 3140 3142 … … 3159 3161 result of the comparison is false. 3160 3162 */ 3161 JSValue *src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame);3162 JSValue *src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame);3163 JSValuePtr src1 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 3164 JSValuePtr src2 = callFrame[(++vPC)->u.operand].jsValue(callFrame); 3163 3165 int target = (++vPC)->u.operand; 3164 3166 … … 3185 3187 int tableIndex = (++vPC)->u.operand; 3186 3188 int defaultOffset = (++vPC)->u.operand; 3187 JSValue *scrutinee = callFrame[(++vPC)->u.operand].jsValue(callFrame);3189 JSValuePtr scrutinee = callFrame[(++vPC)->u.operand].jsValue(callFrame); 3188 3190 if (!JSImmediate::isNumber(scrutinee)) 3189 3191 vPC += defaultOffset; … … 3205 3207 int tableIndex = (++vPC)->u.operand; 3206 3208 int defaultOffset = (++vPC)->u.operand; 3207 JSValue *scrutinee = callFrame[(++vPC)->u.operand].jsValue(callFrame);3209 JSValuePtr scrutinee = callFrame[(++vPC)->u.operand].jsValue(callFrame); 3208 3210 if (!scrutinee->isString()) 3209 3211 vPC += defaultOffset; … … 3228 3230 int tableIndex = (++vPC)->u.operand; 3229 3231 int defaultOffset = (++vPC)->u.operand; 3230 JSValue *scrutinee = callFrame[(++vPC)->u.operand].jsValue(callFrame);3232 JSValuePtr scrutinee = callFrame[(++vPC)->u.operand].jsValue(callFrame); 3231 3233 if (!scrutinee->isString()) 3232 3234 vPC += defaultOffset; … … 3284 3286 int registerOffset = vPC[4].u.operand; 3285 3287 3286 JSValue *funcVal = callFrame[func].jsValue(callFrame);3288 JSValuePtr funcVal = callFrame[func].jsValue(callFrame); 3287 3289 3288 3290 Register* newCallFrame = callFrame->registers() + registerOffset; 3289 3291 Register* argv = newCallFrame - RegisterFile::CallFrameHeaderSize - argCount; 3290 JSValue *thisValue = argv[0].jsValue(callFrame);3292 JSValuePtr thisValue = argv[0].jsValue(callFrame); 3291 3293 JSGlobalObject* globalObject = callFrame->scopeChain()->globalObject(); 3292 3294 3293 3295 if (thisValue == globalObject && funcVal == globalObject->evalFunction()) { 3294 JSValue *result = callEval(callFrame, registerFile, argv, argCount, registerOffset, exceptionValue);3296 JSValuePtr result = callEval(callFrame, registerFile, argv, argCount, registerOffset, exceptionValue); 3295 3297 if (exceptionValue) 3296 3298 goto vm_throw; … … 3321 3323 int registerOffset = vPC[4].u.operand; 3322 3324 3323 JSValue *v = callFrame[func].jsValue(callFrame);3325 JSValuePtr v = callFrame[func].jsValue(callFrame); 3324 3326 3325 3327 CallData callData; … … 3359 3361 3360 3362 // FIXME: All host methods should be calling toThisObject, but this is not presently the case. 3361 JSValue *thisValue = thisRegister->jsValue(callFrame);3363 JSValuePtr thisValue = thisRegister->jsValue(callFrame); 3362 3364 if (thisValue == jsNull()) 3363 3365 thisValue = callFrame->globalThisValue(); 3364 3366 3365 JSValue *returnValue;3367 JSValuePtr returnValue; 3366 3368 { 3367 3369 SamplingTool::HostCallRecord callRecord(m_sampler); … … 3370 3372 CHECK_FOR_EXCEPTION(); 3371 3373 3372 callFrame[dst] = returnValue;3374 callFrame[dst] = JSValuePtr(returnValue); 3373 3375 3374 3376 vPC += 5; … … 3437 3439 callFrame->scopeChain()->deref(); 3438 3440 3439 JSValue *returnValue = callFrame[result].jsValue(callFrame);3441 JSValuePtr returnValue = callFrame[result].jsValue(callFrame); 3440 3442 3441 3443 vPC = callFrame->returnPC(); … … 3446 3448 return returnValue; 3447 3449 3448 callFrame[dst] = returnValue;3450 callFrame[dst] = JSValuePtr(returnValue); 3449 3451 3450 3452 NEXT_INSTRUCTION(); … … 3516 3518 3517 3519 int thisRegister = (++vPC)->u.operand; 3518 JSValue *thisVal = callFrame[thisRegister].getJSValue();3520 JSValuePtr thisVal = callFrame[thisRegister].getJSValue(); 3519 3521 if (thisVal->needsThisConversion()) 3520 callFrame[thisRegister] = thisVal->toThisObject(callFrame);3522 callFrame[thisRegister] = JSValuePtr(thisVal->toThisObject(callFrame)); 3521 3523 3522 3524 ++vPC; … … 3563 3565 int thisRegister = vPC[6].u.operand; 3564 3566 3565 JSValue *v = callFrame[func].jsValue(callFrame);3567 JSValuePtr v = callFrame[func].jsValue(callFrame); 3566 3568 3567 3569 ConstructData constructData; … … 3574 3576 3575 3577 Structure* structure; 3576 JSValue *prototype = callFrame[proto].jsValue(callFrame);3578 JSValuePtr prototype = callFrame[proto].jsValue(callFrame); 3577 3579 if (prototype->isObject()) 3578 3580 structure = asObject(prototype)->inheritorID(); … … 3581 3583 JSObject* newObject = new (globalData) JSObject(structure); 3582 3584 3583 callFrame[thisRegister] = newObject; // "this" value3585 callFrame[thisRegister] = JSValuePtr(newObject); // "this" value 3584 3586 3585 3587 CallFrame* previousCallFrame = callFrame; … … 3609 3611 newCallFrame->init(0, vPC + 7, scopeChain, callFrame, dst, argCount, 0); 3610 3612 3611 JSValue *returnValue;3613 JSValuePtr returnValue; 3612 3614 { 3613 3615 SamplingTool::HostCallRecord callRecord(m_sampler); … … 3615 3617 } 3616 3618 CHECK_FOR_EXCEPTION(); 3617 callFrame[dst] = returnValue;3619 callFrame[dst] = JSValuePtr(returnValue); 3618 3620 3619 3621 vPC += 7; … … 3653 3655 */ 3654 3656 int scope = (++vPC)->u.operand; 3655 JSValue *v = callFrame[scope].jsValue(callFrame);3657 JSValuePtr v = callFrame[scope].jsValue(callFrame); 3656 3658 JSObject* o = v->toObject(callFrame); 3657 3659 CHECK_FOR_EXCEPTION(); 3658 3660 3659 callFrame[scope] = o;3661 callFrame[scope] = JSValuePtr(o); 3660 3662 callFrame->setScopeChain(callFrame->scopeChain()->push(o)); 3661 3663 … … 3702 3704 3703 3705 JSPropertyNameIterator* it = callFrame[iter].propertyNameIterator(); 3704 if (JSValue *temp = it->next(callFrame)) {3706 if (JSValuePtr temp = it->next(callFrame)) { 3705 3707 CHECK_FOR_TIMEOUT(); 3706 callFrame[dst] = temp;3708 callFrame[dst] = JSValuePtr(temp); 3707 3709 vPC += target; 3708 3710 NEXT_INSTRUCTION(); … … 3796 3798 int dst = (++vPC)->u.operand; 3797 3799 int src = (++vPC)->u.operand; 3798 callFrame[dst] = callFrame->codeBlock()->unexpectedConstant(src);3800 callFrame[dst] = JSValuePtr(callFrame->codeBlock()->unexpectedConstant(src)); 3799 3801 3800 3802 ++vPC; … … 3814 3816 3815 3817 CodeBlock* codeBlock = callFrame->codeBlock(); 3816 callFrame[dst] = Error::create(callFrame, (ErrorType)type, codeBlock->unexpectedConstant(message)->toString(callFrame), codeBlock->lineNumberForBytecodeOffset(vPC - codeBlock->instructions().begin()), codeBlock->ownerNode()->sourceID(), codeBlock->ownerNode()->sourceURL());3818 callFrame[dst] = JSValuePtr(Error::create(callFrame, (ErrorType)type, codeBlock->unexpectedConstant(message)->toString(callFrame), codeBlock->lineNumberForBytecodeOffset(vPC - codeBlock->instructions().begin()), codeBlock->ownerNode()->sourceID(), codeBlock->ownerNode()->sourceURL())); 3817 3819 3818 3820 ++vPC; … … 3975 3977 } 3976 3978 3977 JSValue *Interpreter::retrieveArguments(CallFrame* callFrame, JSFunction* function) const3979 JSValuePtr Interpreter::retrieveArguments(CallFrame* callFrame, JSFunction* function) const 3978 3980 { 3979 3981 CallFrame* functionCallFrame = findFunctionCallFrame(callFrame, function); … … 3999 4001 } 4000 4002 4001 JSValue *Interpreter::retrieveCaller(CallFrame* callFrame, InternalFunction* function) const4003 JSValuePtr Interpreter::retrieveCaller(CallFrame* callFrame, InternalFunction* function) const 4002 4004 { 4003 4005 CallFrame* functionCallFrame = findFunctionCallFrame(callFrame, function); … … 4009 4011 return jsNull(); 4010 4012 4011 JSValue *caller = callerFrame->callee();4013 JSValuePtr caller = callerFrame->callee(); 4012 4014 if (!caller) 4013 4015 return jsNull(); … … 4016 4018 } 4017 4019 4018 void Interpreter::retrieveLastCaller(CallFrame* callFrame, int& lineNumber, intptr_t& sourceID, UString& sourceURL, JSValue *& function) const4020 void Interpreter::retrieveLastCaller(CallFrame* callFrame, int& lineNumber, intptr_t& sourceID, UString& sourceURL, JSValuePtr& function) const 4019 4021 { 4020 4022 function = noValue(); … … 4050 4052 #if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) 4051 4053 4052 NEVER_INLINE void Interpreter::tryCTICachePutByID(CallFrame* callFrame, CodeBlock* codeBlock, void* returnAddress, JSValue *baseValue, const PutPropertySlot& slot)4054 NEVER_INLINE void Interpreter::tryCTICachePutByID(CallFrame* callFrame, CodeBlock* codeBlock, void* returnAddress, JSValuePtr baseValue, const PutPropertySlot& slot) 4053 4055 { 4054 4056 // The interpreter checks for recursion here; I do not believe this can occur in CTI. … … 4107 4109 } 4108 4110 4109 NEVER_INLINE void Interpreter::tryCTICacheGetByID(CallFrame* callFrame, CodeBlock* codeBlock, void* returnAddress, JSValue *baseValue, const Identifier& propertyName, const PropertySlot& slot)4111 NEVER_INLINE void Interpreter::tryCTICacheGetByID(CallFrame* callFrame, CodeBlock* codeBlock, void* returnAddress, JSValuePtr baseValue, const Identifier& propertyName, const PropertySlot& slot) 4110 4112 { 4111 4113 // FIXME: Write a test that proves we need to check for recursion here just … … 4302 4304 BEGIN_STUB_FUNCTION(); 4303 4305 4304 JSValue *v1 = ARG_src1;4306 JSValuePtr v1 = ARG_src1; 4305 4307 CallFrame* callFrame = ARG_callFrame; 4306 4308 … … 4319 4321 } 4320 4322 4321 JSValue * Interpreter::cti_op_add(STUB_ARGS)4322 { 4323 BEGIN_STUB_FUNCTION(); 4324 4325 JSValue *v1 = ARG_src1;4326 JSValue *v2 = ARG_src2;4323 JSValueEncodedAsPointer* Interpreter::cti_op_add(STUB_ARGS) 4324 { 4325 BEGIN_STUB_FUNCTION(); 4326 4327 JSValuePtr v1 = ARG_src1; 4328 JSValuePtr v2 = ARG_src2; 4327 4329 4328 4330 double left; … … 4331 4333 bool rightIsNumber = fastIsNumber(v2, right); 4332 4334 if (rightIsNumber && fastIsNumber(v1, left)) 4333 return jsNumber(ARG_globalData, left + right);4335 return JSValuePtr::encode(jsNumber(ARG_globalData, left + right)); 4334 4336 4335 4337 CallFrame* callFrame = ARG_callFrame; … … 4343 4345 } 4344 4346 4345 return jsString(ARG_globalData, value.release());4347 return JSValuePtr::encode(jsString(ARG_globalData, value.release())); 4346 4348 } 4347 4349 … … 4355 4357 VM_THROW_EXCEPTION(); 4356 4358 } 4357 return jsString(ARG_globalData, value.release());4359 return JSValuePtr::encode(jsString(ARG_globalData, value.release())); 4358 4360 } 4359 4361 4360 4362 // All other cases are pretty uncommon 4361 JSValue *result = jsAddSlowCase(callFrame, v1, v2);4363 JSValuePtr result = jsAddSlowCase(callFrame, v1, v2); 4362 4364 CHECK_FOR_EXCEPTION_AT_END(); 4363 return result;4364 } 4365 4366 JSValue * Interpreter::cti_op_pre_inc(STUB_ARGS)4367 { 4368 BEGIN_STUB_FUNCTION(); 4369 4370 JSValue *v = ARG_src1;4371 4372 CallFrame* callFrame = ARG_callFrame; 4373 JSValue *result = jsNumber(ARG_globalData, v->toNumber(callFrame) + 1);4365 return JSValuePtr::encode(result); 4366 } 4367 4368 JSValueEncodedAsPointer* Interpreter::cti_op_pre_inc(STUB_ARGS) 4369 { 4370 BEGIN_STUB_FUNCTION(); 4371 4372 JSValuePtr v = ARG_src1; 4373 4374 CallFrame* callFrame = ARG_callFrame; 4375 JSValuePtr result = jsNumber(ARG_globalData, v->toNumber(callFrame) + 1); 4374 4376 CHECK_FOR_EXCEPTION_AT_END(); 4375 return result;4377 return JSValuePtr::encode(result); 4376 4378 } 4377 4379 … … 4407 4409 BEGIN_STUB_FUNCTION(); 4408 4410 4409 JSValue *src1 = ARG_src1;4410 JSValue *src2 = ARG_src2;4411 JSValuePtr src1 = ARG_src1; 4412 JSValuePtr src2 = ARG_src2; 4411 4413 CallFrame* callFrame = ARG_callFrame; 4412 4414 … … 4420 4422 BEGIN_STUB_FUNCTION(); 4421 4423 4422 JSValue *src1 = ARG_src1;4423 JSValue *src2 = ARG_src2;4424 JSValuePtr src1 = ARG_src1; 4425 JSValuePtr src2 = ARG_src2; 4424 4426 CallFrame* callFrame = ARG_callFrame; 4425 4427 … … 4445 4447 } 4446 4448 4447 JSValue * Interpreter::cti_op_get_by_id_generic(STUB_ARGS)4449 JSValueEncodedAsPointer* Interpreter::cti_op_get_by_id_generic(STUB_ARGS) 4448 4450 { 4449 4451 BEGIN_STUB_FUNCTION(); … … 4452 4454 Identifier& ident = *ARG_id2; 4453 4455 4454 JSValue *baseValue = ARG_src1;4456 JSValuePtr baseValue = ARG_src1; 4455 4457 PropertySlot slot(baseValue); 4456 JSValue *result = baseValue->get(callFrame, ident, slot);4458 JSValuePtr result = baseValue->get(callFrame, ident, slot); 4457 4459 4458 4460 CHECK_FOR_EXCEPTION_AT_END(); 4459 return result;4461 return JSValuePtr::encode(result); 4460 4462 } 4461 4463 … … 4500 4502 } 4501 4503 4502 JSValue * Interpreter::cti_op_get_by_id(STUB_ARGS)4504 JSValueEncodedAsPointer* Interpreter::cti_op_get_by_id(STUB_ARGS) 4503 4505 { 4504 4506 BEGIN_STUB_FUNCTION(); … … 4507 4509 Identifier& ident = *ARG_id2; 4508 4510 4509 JSValue *baseValue = ARG_src1;4511 JSValuePtr baseValue = ARG_src1; 4510 4512 PropertySlot slot(baseValue); 4511 JSValue *result = baseValue->get(callFrame, ident, slot);4513 JSValuePtr result = baseValue->get(callFrame, ident, slot); 4512 4514 4513 4515 ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, reinterpret_cast<void*>(cti_op_get_by_id_second)); 4514 4516 4515 4517 CHECK_FOR_EXCEPTION_AT_END(); 4516 return result;4517 } 4518 4519 JSValue * Interpreter::cti_op_get_by_id_second(STUB_ARGS)4518 return JSValuePtr::encode(result); 4519 } 4520 4521 JSValueEncodedAsPointer* Interpreter::cti_op_get_by_id_second(STUB_ARGS) 4520 4522 { 4521 4523 BEGIN_STUB_FUNCTION(); … … 4524 4526 Identifier& ident = *ARG_id2; 4525 4527 4526 JSValue *baseValue = ARG_src1;4528 JSValuePtr baseValue = ARG_src1; 4527 4529 PropertySlot slot(baseValue); 4528 JSValue *result = baseValue->get(callFrame, ident, slot);4530 JSValuePtr result = baseValue->get(callFrame, ident, slot); 4529 4531 4530 4532 ARG_globalData->interpreter->tryCTICacheGetByID(callFrame, callFrame->codeBlock(), STUB_RETURN_ADDRESS, baseValue, ident, slot); 4531 4533 4532 4534 CHECK_FOR_EXCEPTION_AT_END(); 4533 return result;4534 } 4535 4536 JSValue * Interpreter::cti_op_get_by_id_self_fail(STUB_ARGS)4535 return JSValuePtr::encode(result); 4536 } 4537 4538 JSValueEncodedAsPointer* Interpreter::cti_op_get_by_id_self_fail(STUB_ARGS) 4537 4539 { 4538 4540 BEGIN_STUB_FUNCTION(); … … 4541 4543 Identifier& ident = *ARG_id2; 4542 4544 4543 JSValue *baseValue = ARG_src1;4545 JSValuePtr baseValue = ARG_src1; 4544 4546 PropertySlot slot(baseValue); 4545 JSValue *result = baseValue->get(callFrame, ident, slot);4547 JSValuePtr result = baseValue->get(callFrame, ident, slot); 4546 4548 4547 4549 CHECK_FOR_EXCEPTION(); … … 4577 4579 ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, reinterpret_cast<void*>(cti_op_get_by_id_generic)); 4578 4580 } 4579 return result;4581 return JSValuePtr::encode(result); 4580 4582 } 4581 4583 … … 4609 4611 } 4610 4612 4611 JSValue * Interpreter::cti_op_get_by_id_proto_list(STUB_ARGS)4612 { 4613 BEGIN_STUB_FUNCTION(); 4614 4615 CallFrame* callFrame = ARG_callFrame; 4616 4617 JSValue *baseValue = ARG_src1;4613 JSValueEncodedAsPointer* Interpreter::cti_op_get_by_id_proto_list(STUB_ARGS) 4614 { 4615 BEGIN_STUB_FUNCTION(); 4616 4617 CallFrame* callFrame = ARG_callFrame; 4618 4619 JSValuePtr baseValue = ARG_src1; 4618 4620 PropertySlot slot(baseValue); 4619 JSValue *result = baseValue->get(callFrame, *ARG_id2, slot);4621 JSValuePtr result = baseValue->get(callFrame, *ARG_id2, slot); 4620 4622 4621 4623 CHECK_FOR_EXCEPTION(); … … 4623 4625 if (JSImmediate::isImmediate(baseValue) || !slot.isCacheable() || asCell(baseValue)->structure()->isDictionary()) { 4624 4626 ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, reinterpret_cast<void*>(cti_op_get_by_id_proto_fail)); 4625 return result;4627 return JSValuePtr::encode(result); 4626 4628 } 4627 4629 … … 4667 4669 ctiPatchCallByReturnAddress(STUB_RETURN_ADDRESS, reinterpret_cast<void*>(cti_op_get_by_id_proto_fail)); 4668 4670 4669 return result;4670 } 4671 4672 JSValue * Interpreter::cti_op_get_by_id_proto_list_full(STUB_ARGS)4673 { 4674 BEGIN_STUB_FUNCTION(); 4675 4676 JSValue *baseValue = ARG_src1;4671 return JSValuePtr::encode(result); 4672 } 4673 4674 JSValueEncodedAsPointer* Interpreter::cti_op_get_by_id_proto_list_full(STUB_ARGS) 4675 { 4676 BEGIN_STUB_FUNCTION(); 4677 4678 JSValuePtr baseValue = ARG_src1; 4677 4679 PropertySlot slot(baseValue); 4678 JSValue *result = baseValue->get(ARG_callFrame, *ARG_id2, slot);4680 JSValuePtr result = baseValue->get(ARG_callFrame, *ARG_id2, slot); 4679 4681 4680 4682 CHECK_FOR_EXCEPTION_AT_END(); 4681 return result;4682 } 4683 4684 JSValue * Interpreter::cti_op_get_by_id_proto_fail(STUB_ARGS)4685 { 4686 BEGIN_STUB_FUNCTION(); 4687 4688 JSValue *baseValue = ARG_src1;4683 return JSValuePtr::encode(result); 4684 } 4685 4686 JSValueEncodedAsPointer* Interpreter::cti_op_get_by_id_proto_fail(STUB_ARGS) 4687 { 4688 BEGIN_STUB_FUNCTION(); 4689 4690 JSValuePtr baseValue = ARG_src1; 4689 4691 PropertySlot slot(baseValue); 4690 JSValue *result = baseValue->get(ARG_callFrame, *ARG_id2, slot);4692 JSValuePtr result = baseValue->get(ARG_callFrame, *ARG_id2, slot); 4691 4693 4692 4694 CHECK_FOR_EXCEPTION_AT_END(); 4693 return result;4694 } 4695 4696 JSValue * Interpreter::cti_op_get_by_id_array_fail(STUB_ARGS)4697 { 4698 BEGIN_STUB_FUNCTION(); 4699 4700 JSValue *baseValue = ARG_src1;4695 return JSValuePtr::encode(result); 4696 } 4697 4698 JSValueEncodedAsPointer* Interpreter::cti_op_get_by_id_array_fail(STUB_ARGS) 4699 { 4700 BEGIN_STUB_FUNCTION(); 4701 4702 JSValuePtr baseValue = ARG_src1; 4701 4703 PropertySlot slot(baseValue); 4702 JSValue *result = baseValue->get(ARG_callFrame, *ARG_id2, slot);4704 JSValuePtr result = baseValue->get(ARG_callFrame, *ARG_id2, slot); 4703 4705 4704 4706 CHECK_FOR_EXCEPTION_AT_END(); 4705 return result;4706 } 4707 4708 JSValue * Interpreter::cti_op_get_by_id_string_fail(STUB_ARGS)4709 { 4710 BEGIN_STUB_FUNCTION(); 4711 4712 JSValue *baseValue = ARG_src1;4707 return JSValuePtr::encode(result); 4708 } 4709 4710 JSValueEncodedAsPointer* Interpreter::cti_op_get_by_id_string_fail(STUB_ARGS) 4711 { 4712 BEGIN_STUB_FUNCTION(); 4713 4714 JSValuePtr baseValue = ARG_src1; 4713 4715 PropertySlot slot(baseValue); 4714 JSValue *result = baseValue->get(ARG_callFrame, *ARG_id2, slot);4716 JSValuePtr result = baseValue->get(ARG_callFrame, *ARG_id2, slot); 4715 4717 4716 4718 CHECK_FOR_EXCEPTION_AT_END(); 4717 return result;4719 return JSValuePtr::encode(result); 4718 4720 } 4719 4721 4720 4722 #endif 4721 4723 4722 JSValue * Interpreter::cti_op_instanceof(STUB_ARGS)4723 { 4724 BEGIN_STUB_FUNCTION(); 4725 4726 CallFrame* callFrame = ARG_callFrame; 4727 JSValue *value = ARG_src1;4728 JSValue *baseVal = ARG_src2;4729 JSValue *proto = ARG_src3;4724 JSValueEncodedAsPointer* Interpreter::cti_op_instanceof(STUB_ARGS) 4725 { 4726 BEGIN_STUB_FUNCTION(); 4727 4728 CallFrame* callFrame = ARG_callFrame; 4729 JSValuePtr value = ARG_src1; 4730 JSValuePtr baseVal = ARG_src2; 4731 JSValuePtr proto = ARG_src3; 4730 4732 4731 4733 // at least one of these checks must have failed to get to the slow case … … 4743 4745 4744 4746 if (!asObject(baseVal)->structure()->typeInfo().implementsHasInstance()) 4745 return jsBoolean(false);4747 return JSValuePtr::encode(jsBoolean(false)); 4746 4748 4747 4749 if (!proto->isObject()) { … … 4751 4753 4752 4754 if (!value->isObject()) 4753 return jsBoolean(false);4754 4755 JSValue *result = jsBoolean(asObject(baseVal)->hasInstance(callFrame, value, proto));4755 return JSValuePtr::encode(jsBoolean(false)); 4756 4757 JSValuePtr result = jsBoolean(asObject(baseVal)->hasInstance(callFrame, value, proto)); 4756 4758 CHECK_FOR_EXCEPTION_AT_END(); 4757 4759 4758 return result;4759 } 4760 4761 JSValue * Interpreter::cti_op_del_by_id(STUB_ARGS)4760 return JSValuePtr::encode(result); 4761 } 4762 4763 JSValueEncodedAsPointer* Interpreter::cti_op_del_by_id(STUB_ARGS) 4762 4764 { 4763 4765 BEGIN_STUB_FUNCTION(); … … 4767 4769 JSObject* baseObj = ARG_src1->toObject(callFrame); 4768 4770 4769 JSValue *result = jsBoolean(baseObj->deleteProperty(callFrame, *ARG_id2));4771 JSValuePtr result = jsBoolean(baseObj->deleteProperty(callFrame, *ARG_id2)); 4770 4772 CHECK_FOR_EXCEPTION_AT_END(); 4771 return result;4772 } 4773 4774 JSValue * Interpreter::cti_op_mul(STUB_ARGS)4775 { 4776 BEGIN_STUB_FUNCTION(); 4777 4778 JSValue *src1 = ARG_src1;4779 JSValue *src2 = ARG_src2;4773 return JSValuePtr::encode(result); 4774 } 4775 4776 JSValueEncodedAsPointer* Interpreter::cti_op_mul(STUB_ARGS) 4777 { 4778 BEGIN_STUB_FUNCTION(); 4779 4780 JSValuePtr src1 = ARG_src1; 4781 JSValuePtr src2 = ARG_src2; 4780 4782 4781 4783 double left; 4782 4784 double right; 4783 4785 if (fastIsNumber(src1, left) && fastIsNumber(src2, right)) 4784 return jsNumber(ARG_globalData, left * right);4785 4786 CallFrame* callFrame = ARG_callFrame; 4787 JSValue *result = jsNumber(ARG_globalData, src1->toNumber(callFrame) * src2->toNumber(callFrame));4786 return JSValuePtr::encode(jsNumber(ARG_globalData, left * right)); 4787 4788 CallFrame* callFrame = ARG_callFrame; 4789 JSValuePtr result = jsNumber(ARG_globalData, src1->toNumber(callFrame) * src2->toNumber(callFrame)); 4788 4790 CHECK_FOR_EXCEPTION_AT_END(); 4789 return result;4791 return JSValuePtr::encode(result); 4790 4792 } 4791 4793 … … 4898 4900 } 4899 4901 4900 JSValue * Interpreter::cti_op_call_NotJSFunction(STUB_ARGS)4901 { 4902 BEGIN_STUB_FUNCTION(); 4903 4904 JSValue *funcVal = ARG_src1;4902 JSValueEncodedAsPointer* Interpreter::cti_op_call_NotJSFunction(STUB_ARGS) 4903 { 4904 BEGIN_STUB_FUNCTION(); 4905 4906 JSValuePtr funcVal = ARG_src1; 4905 4907 4906 4908 CallData callData; … … 4921 4923 ArgList argList(argv + 1, argCount - 1); 4922 4924 4923 JSValue *returnValue;4925 JSValuePtr returnValue; 4924 4926 { 4925 4927 SamplingTool::HostCallRecord callRecord(CTI_SAMPLER); 4926 4928 4927 4929 // FIXME: All host methods should be calling toThisObject, but this is not presently the case. 4928 JSValue *thisValue = argv[0].jsValue(callFrame);4930 JSValuePtr thisValue = argv[0].jsValue(callFrame); 4929 4931 if (thisValue == jsNull()) 4930 4932 thisValue = callFrame->globalThisValue(); … … 4935 4937 CHECK_FOR_EXCEPTION(); 4936 4938 4937 return returnValue;4939 return JSValuePtr::encode(returnValue); 4938 4940 } 4939 4941 … … 5012 5014 } 5013 5015 5014 JSValue * Interpreter::cti_op_resolve(STUB_ARGS)5016 JSValueEncodedAsPointer* Interpreter::cti_op_resolve(STUB_ARGS) 5015 5017 { 5016 5018 BEGIN_STUB_FUNCTION(); … … 5028 5030 PropertySlot slot(o); 5029 5031 if (o->getPropertySlot(callFrame, ident, slot)) { 5030 JSValue *result = slot.getValue(callFrame, ident);5032 JSValuePtr result = slot.getValue(callFrame, ident); 5031 5033 CHECK_FOR_EXCEPTION_AT_END(); 5032 return result;5034 return JSValuePtr::encode(result); 5033 5035 } 5034 5036 } while (++iter != end); … … 5057 5059 } 5058 5060 5059 JSValue * Interpreter::cti_op_construct_NotJSConstruct(STUB_ARGS)5060 { 5061 BEGIN_STUB_FUNCTION(); 5062 5063 CallFrame* callFrame = ARG_callFrame; 5064 5065 JSValue *constrVal = ARG_src1;5061 JSValueEncodedAsPointer* Interpreter::cti_op_construct_NotJSConstruct(STUB_ARGS) 5062 { 5063 BEGIN_STUB_FUNCTION(); 5064 5065 CallFrame* callFrame = ARG_callFrame; 5066 5067 JSValuePtr constrVal = ARG_src1; 5066 5068 int argCount = ARG_int3; 5067 5069 int thisRegister = ARG_int5; … … 5073 5075 ArgList argList(callFrame->registers() + thisRegister + 1, argCount - 1); 5074 5076 5075 JSValue *returnValue;5077 JSValuePtr returnValue; 5076 5078 { 5077 5079 SamplingTool::HostCallRecord callRecord(CTI_SAMPLER); … … 5080 5082 CHECK_FOR_EXCEPTION(); 5081 5083 5082 return returnValue;5084 return JSValuePtr::encode(returnValue); 5083 5085 } 5084 5086 … … 5091 5093 } 5092 5094 5093 JSValue * Interpreter::cti_op_get_by_val(STUB_ARGS)5095 JSValueEncodedAsPointer* Interpreter::cti_op_get_by_val(STUB_ARGS) 5094 5096 { 5095 5097 BEGIN_STUB_FUNCTION(); … … 5098 5100 Interpreter* interpreter = ARG_globalData->interpreter; 5099 5101 5100 JSValue *baseValue = ARG_src1;5101 JSValue *subscript = ARG_src2;5102 5103 JSValue *result;5102 JSValuePtr baseValue = ARG_src1; 5103 JSValuePtr subscript = ARG_src2; 5104 5105 JSValuePtr result; 5104 5106 unsigned i; 5105 5107 … … 5113 5115 result = jsArray->JSArray::get(callFrame, i); 5114 5116 } else if (interpreter->isJSString(baseValue) && asString(baseValue)->canGetIndex(i)) 5115 return asString(baseValue)->getIndex(ARG_globalData, i);5117 return JSValuePtr::encode(asString(baseValue)->getIndex(ARG_globalData, i)); 5116 5118 else if (interpreter->isJSByteArray(baseValue) && asByteArray(baseValue)->canAccessIndex(i)) 5117 return asByteArray(baseValue)->getIndex(i);5119 return JSValuePtr::encode(asByteArray(baseValue)->getIndex(i)); 5118 5120 else 5119 5121 result = baseValue->get(callFrame, i); … … 5124 5126 5125 5127 CHECK_FOR_EXCEPTION_AT_END(); 5126 return result;5128 return JSValuePtr::encode(result); 5127 5129 } 5128 5130 … … 5155 5157 // We also handle wrapper substitution for the global object at the same time. 5156 5158 JSObject* thisObj = base->toThisObject(callFrame); 5157 JSValue *result = slot.getValue(callFrame, ident);5159 JSValuePtr result = slot.getValue(callFrame, ident); 5158 5160 CHECK_FOR_EXCEPTION_AT_END(); 5159 5161 5160 RETURN_PAIR(thisObj, asPointer(result));5162 RETURN_PAIR(thisObj, JSValuePtr::encode(result)); 5161 5163 } 5162 5164 ++iter; … … 5169 5171 } 5170 5172 5171 JSValue * Interpreter::cti_op_sub(STUB_ARGS)5172 { 5173 BEGIN_STUB_FUNCTION(); 5174 5175 JSValue *src1 = ARG_src1;5176 JSValue *src2 = ARG_src2;5173 JSValueEncodedAsPointer* Interpreter::cti_op_sub(STUB_ARGS) 5174 { 5175 BEGIN_STUB_FUNCTION(); 5176 5177 JSValuePtr src1 = ARG_src1; 5178 JSValuePtr src2 = ARG_src2; 5177 5179 5178 5180 double left; 5179 5181 double right; 5180 5182 if (fastIsNumber(src1, left) && fastIsNumber(src2, right)) 5181 return jsNumber(ARG_globalData, left - right);5182 5183 CallFrame* callFrame = ARG_callFrame; 5184 JSValue *result = jsNumber(ARG_globalData, src1->toNumber(callFrame) - src2->toNumber(callFrame));5183 return JSValuePtr::encode(jsNumber(ARG_globalData, left - right)); 5184 5185 CallFrame* callFrame = ARG_callFrame; 5186 JSValuePtr result = jsNumber(ARG_globalData, src1->toNumber(callFrame) - src2->toNumber(callFrame)); 5185 5187 CHECK_FOR_EXCEPTION_AT_END(); 5186 return result;5188 return JSValuePtr::encode(result); 5187 5189 } 5188 5190 … … 5194 5196 Interpreter* interpreter = ARG_globalData->interpreter; 5195 5197 5196 JSValue *baseValue = ARG_src1;5197 JSValue *subscript = ARG_src2;5198 JSValue *value = ARG_src3;5198 JSValuePtr baseValue = ARG_src1; 5199 JSValuePtr subscript = ARG_src2; 5200 JSValuePtr value = ARG_src3; 5199 5201 5200 5202 unsigned i; … … 5238 5240 CallFrame* callFrame = ARG_callFrame; 5239 5241 5240 JSValue *baseValue = ARG_src1;5242 JSValuePtr baseValue = ARG_src1; 5241 5243 int i = ARG_int2; 5242 JSValue *value = ARG_src3;5244 JSValuePtr value = ARG_src3; 5243 5245 5244 5246 ASSERT(ARG_globalData->interpreter->isJSArray(baseValue)); … … 5258 5260 } 5259 5261 5260 JSValue * Interpreter::cti_op_lesseq(STUB_ARGS)5261 { 5262 BEGIN_STUB_FUNCTION(); 5263 5264 CallFrame* callFrame = ARG_callFrame; 5265 JSValue *result = jsBoolean(jsLessEq(callFrame, ARG_src1, ARG_src2));5262 JSValueEncodedAsPointer* Interpreter::cti_op_lesseq(STUB_ARGS) 5263 { 5264 BEGIN_STUB_FUNCTION(); 5265 5266 CallFrame* callFrame = ARG_callFrame; 5267 JSValuePtr result = jsBoolean(jsLessEq(callFrame, ARG_src1, ARG_src2)); 5266 5268 CHECK_FOR_EXCEPTION_AT_END(); 5267 return result;5269 return JSValuePtr::encode(result); 5268 5270 } 5269 5271 … … 5272 5274 BEGIN_STUB_FUNCTION(); 5273 5275 5274 JSValue *src1 = ARG_src1;5276 JSValuePtr src1 = ARG_src1; 5275 5277 5276 5278 CallFrame* callFrame = ARG_callFrame; … … 5281 5283 } 5282 5284 5283 JSValue * Interpreter::cti_op_negate(STUB_ARGS)5284 { 5285 BEGIN_STUB_FUNCTION(); 5286 5287 JSValue *src = ARG_src1;5285 JSValueEncodedAsPointer* Interpreter::cti_op_negate(STUB_ARGS) 5286 { 5287 BEGIN_STUB_FUNCTION(); 5288 5289 JSValuePtr src = ARG_src1; 5288 5290 5289 5291 double v; 5290 5292 if (fastIsNumber(src, v)) 5291 return jsNumber(ARG_globalData, -v);5292 5293 CallFrame* callFrame = ARG_callFrame; 5294 JSValue *result = jsNumber(ARG_globalData, -src->toNumber(callFrame));5293 return JSValuePtr::encode(jsNumber(ARG_globalData, -v)); 5294 5295 CallFrame* callFrame = ARG_callFrame; 5296 JSValuePtr result = jsNumber(ARG_globalData, -src->toNumber(callFrame)); 5295 5297 CHECK_FOR_EXCEPTION_AT_END(); 5296 return result;5297 } 5298 5299 JSValue * Interpreter::cti_op_resolve_base(STUB_ARGS)5300 { 5301 BEGIN_STUB_FUNCTION(); 5302 5303 return inlineResolveBase(ARG_callFrame, *ARG_id1, ARG_callFrame->scopeChain());5304 } 5305 5306 JSValue * Interpreter::cti_op_resolve_skip(STUB_ARGS)5298 return JSValuePtr::encode(result); 5299 } 5300 5301 JSValueEncodedAsPointer* Interpreter::cti_op_resolve_base(STUB_ARGS) 5302 { 5303 BEGIN_STUB_FUNCTION(); 5304 5305 return JSValuePtr::encode(inlineResolveBase(ARG_callFrame, *ARG_id1, ARG_callFrame->scopeChain())); 5306 } 5307 5308 JSValueEncodedAsPointer* Interpreter::cti_op_resolve_skip(STUB_ARGS) 5307 5309 { 5308 5310 BEGIN_STUB_FUNCTION(); … … 5325 5327 PropertySlot slot(o); 5326 5328 if (o->getPropertySlot(callFrame, ident, slot)) { 5327 JSValue *result = slot.getValue(callFrame, ident);5329 JSValuePtr result = slot.getValue(callFrame, ident); 5328 5330 CHECK_FOR_EXCEPTION_AT_END(); 5329 return result;5331 return JSValuePtr::encode(result); 5330 5332 } 5331 5333 } while (++iter != end); … … 5337 5339 } 5338 5340 5339 JSValue * Interpreter::cti_op_resolve_global(STUB_ARGS)5341 JSValueEncodedAsPointer* Interpreter::cti_op_resolve_global(STUB_ARGS) 5340 5342 { 5341 5343 BEGIN_STUB_FUNCTION(); … … 5349 5351 PropertySlot slot(globalObject); 5350 5352 if (globalObject->getPropertySlot(callFrame, ident, slot)) { 5351 JSValue *result = slot.getValue(callFrame, ident);5353 JSValuePtr result = slot.getValue(callFrame, ident); 5352 5354 if (slot.isCacheable() && !globalObject->structure()->isDictionary()) { 5353 5355 GlobalResolveInfo& globalResolveInfo = callFrame->codeBlock()->globalResolveInfo(globalResolveInfoIndex); … … 5357 5359 globalResolveInfo.structure = globalObject->structure(); 5358 5360 globalResolveInfo.offset = slot.cachedOffset(); 5359 return result;5361 return JSValuePtr::encode(result); 5360 5362 } 5361 5363 5362 5364 CHECK_FOR_EXCEPTION_AT_END(); 5363 return result;5365 return JSValuePtr::encode(result); 5364 5366 } 5365 5367 … … 5369 5371 } 5370 5372 5371 JSValue * Interpreter::cti_op_div(STUB_ARGS)5372 { 5373 BEGIN_STUB_FUNCTION(); 5374 5375 JSValue *src1 = ARG_src1;5376 JSValue *src2 = ARG_src2;5373 JSValueEncodedAsPointer* Interpreter::cti_op_div(STUB_ARGS) 5374 { 5375 BEGIN_STUB_FUNCTION(); 5376 5377 JSValuePtr src1 = ARG_src1; 5378 JSValuePtr src2 = ARG_src2; 5377 5379 5378 5380 double left; 5379 5381 double right; 5380 5382 if (fastIsNumber(src1, left) && fastIsNumber(src2, right)) 5381 return jsNumber(ARG_globalData, left / right);5382 5383 CallFrame* callFrame = ARG_callFrame; 5384 JSValue *result = jsNumber(ARG_globalData, src1->toNumber(callFrame) / src2->toNumber(callFrame));5383 return JSValuePtr::encode(jsNumber(ARG_globalData, left / right)); 5384 5385 CallFrame* callFrame = ARG_callFrame; 5386 JSValuePtr result = jsNumber(ARG_globalData, src1->toNumber(callFrame) / src2->toNumber(callFrame)); 5385 5387 CHECK_FOR_EXCEPTION_AT_END(); 5386 return result;5387 } 5388 5389 JSValue * Interpreter::cti_op_pre_dec(STUB_ARGS)5390 { 5391 BEGIN_STUB_FUNCTION(); 5392 5393 JSValue *v = ARG_src1;5394 5395 CallFrame* callFrame = ARG_callFrame; 5396 JSValue *result = jsNumber(ARG_globalData, v->toNumber(callFrame) - 1);5388 return JSValuePtr::encode(result); 5389 } 5390 5391 JSValueEncodedAsPointer* Interpreter::cti_op_pre_dec(STUB_ARGS) 5392 { 5393 BEGIN_STUB_FUNCTION(); 5394 5395 JSValuePtr v = ARG_src1; 5396 5397 CallFrame* callFrame = ARG_callFrame; 5398 JSValuePtr result = jsNumber(ARG_globalData, v->toNumber(callFrame) - 1); 5397 5399 CHECK_FOR_EXCEPTION_AT_END(); 5398 return result;5400 return JSValuePtr::encode(result); 5399 5401 } 5400 5402 … … 5403 5405 BEGIN_STUB_FUNCTION(); 5404 5406 5405 JSValue *src1 = ARG_src1;5406 JSValue *src2 = ARG_src2;5407 JSValuePtr src1 = ARG_src1; 5408 JSValuePtr src2 = ARG_src2; 5407 5409 CallFrame* callFrame = ARG_callFrame; 5408 5410 … … 5412 5414 } 5413 5415 5414 JSValue * Interpreter::cti_op_not(STUB_ARGS)5415 { 5416 BEGIN_STUB_FUNCTION(); 5417 5418 JSValue *src = ARG_src1;5419 5420 CallFrame* callFrame = ARG_callFrame; 5421 5422 JSValue *result = jsBoolean(!src->toBoolean(callFrame));5416 JSValueEncodedAsPointer* Interpreter::cti_op_not(STUB_ARGS) 5417 { 5418 BEGIN_STUB_FUNCTION(); 5419 5420 JSValuePtr src = ARG_src1; 5421 5422 CallFrame* callFrame = ARG_callFrame; 5423 5424 JSValuePtr result = jsBoolean(!src->toBoolean(callFrame)); 5423 5425 CHECK_FOR_EXCEPTION_AT_END(); 5424 return result;5426 return JSValuePtr::encode(result); 5425 5427 } 5426 5428 … … 5429 5431 BEGIN_STUB_FUNCTION(); 5430 5432 5431 JSValue *src1 = ARG_src1;5433 JSValuePtr src1 = ARG_src1; 5432 5434 5433 5435 CallFrame* callFrame = ARG_callFrame; … … 5442 5444 BEGIN_STUB_FUNCTION(); 5443 5445 5444 JSValue *v = ARG_src1;5445 5446 CallFrame* callFrame = ARG_callFrame; 5447 5448 JSValue *number = v->toJSNumber(callFrame);5446 JSValuePtr v = ARG_src1; 5447 5448 CallFrame* callFrame = ARG_callFrame; 5449 5450 JSValuePtr number = v->toJSNumber(callFrame); 5449 5451 CHECK_FOR_EXCEPTION_AT_END(); 5450 5452 5451 RETURN_PAIR( asPointer(number), asPointer(jsNumber(ARG_globalData, number->uncheckedGetNumber() + 1)));5452 } 5453 5454 JSValue * Interpreter::cti_op_eq(STUB_ARGS)5455 { 5456 BEGIN_STUB_FUNCTION(); 5457 5458 JSValue *src1 = ARG_src1;5459 JSValue *src2 = ARG_src2;5453 RETURN_PAIR(JSValuePtr::encode(number), JSValuePtr::encode(jsNumber(ARG_globalData, number->uncheckedGetNumber() + 1))); 5454 } 5455 5456 JSValueEncodedAsPointer* Interpreter::cti_op_eq(STUB_ARGS) 5457 { 5458 BEGIN_STUB_FUNCTION(); 5459 5460 JSValuePtr src1 = ARG_src1; 5461 JSValuePtr src2 = ARG_src2; 5460 5462 5461 5463 CallFrame* callFrame = ARG_callFrame; 5462 5464 5463 5465 ASSERT(!JSImmediate::areBothImmediateNumbers(src1, src2)); 5464 JSValue *result = jsBoolean(equalSlowCaseInline(callFrame, src1, src2));5466 JSValuePtr result = jsBoolean(equalSlowCaseInline(callFrame, src1, src2)); 5465 5467 CHECK_FOR_EXCEPTION_AT_END(); 5466 return result;5467 } 5468 5469 JSValue * Interpreter::cti_op_lshift(STUB_ARGS)5470 { 5471 BEGIN_STUB_FUNCTION(); 5472 5473 JSValue *val = ARG_src1;5474 JSValue *shift = ARG_src2;5468 return JSValuePtr::encode(result); 5469 } 5470 5471 JSValueEncodedAsPointer* Interpreter::cti_op_lshift(STUB_ARGS) 5472 { 5473 BEGIN_STUB_FUNCTION(); 5474 5475 JSValuePtr val = ARG_src1; 5476 JSValuePtr shift = ARG_src2; 5475 5477 5476 5478 int32_t left; 5477 5479 uint32_t right; 5478 5480 if (JSImmediate::areBothImmediateNumbers(val, shift)) 5479 return jsNumber(ARG_globalData, JSImmediate::getTruncatedInt32(val) << (JSImmediate::getTruncatedUInt32(shift) & 0x1f));5481 return JSValuePtr::encode(jsNumber(ARG_globalData, JSImmediate::getTruncatedInt32(val) << (JSImmediate::getTruncatedUInt32(shift) & 0x1f))); 5480 5482 if (fastToInt32(val, left) && fastToUInt32(shift, right)) 5481 return jsNumber(ARG_globalData, left << (right & 0x1f));5482 5483 CallFrame* callFrame = ARG_callFrame; 5484 JSValue *result = jsNumber(ARG_globalData, (val->toInt32(callFrame)) << (shift->toUInt32(callFrame) & 0x1f));5483 return JSValuePtr::encode(jsNumber(ARG_globalData, left << (right & 0x1f))); 5484 5485 CallFrame* callFrame = ARG_callFrame; 5486 JSValuePtr result = jsNumber(ARG_globalData, (val->toInt32(callFrame)) << (shift->toUInt32(callFrame) & 0x1f)); 5485 5487 CHECK_FOR_EXCEPTION_AT_END(); 5486 return result;5487 } 5488 5489 JSValue * Interpreter::cti_op_bitand(STUB_ARGS)5490 { 5491 BEGIN_STUB_FUNCTION(); 5492 5493 JSValue *src1 = ARG_src1;5494 JSValue *src2 = ARG_src2;5488 return JSValuePtr::encode(result); 5489 } 5490 5491 JSValueEncodedAsPointer* Interpreter::cti_op_bitand(STUB_ARGS) 5492 { 5493 BEGIN_STUB_FUNCTION(); 5494 5495 JSValuePtr src1 = ARG_src1; 5496 JSValuePtr src2 = ARG_src2; 5495 5497 5496 5498 int32_t left; 5497 5499 int32_t right; 5498 5500 if (fastToInt32(src1, left) && fastToInt32(src2, right)) 5499 return jsNumber(ARG_globalData, left & right);5500 5501 CallFrame* callFrame = ARG_callFrame; 5502 JSValue *result = jsNumber(ARG_globalData, src1->toInt32(callFrame) & src2->toInt32(callFrame));5501 return JSValuePtr::encode(jsNumber(ARG_globalData, left & right)); 5502 5503 CallFrame* callFrame = ARG_callFrame; 5504 JSValuePtr result = jsNumber(ARG_globalData, src1->toInt32(callFrame) & src2->toInt32(callFrame)); 5503 5505 CHECK_FOR_EXCEPTION_AT_END(); 5504 return result;5505 } 5506 5507 JSValue * Interpreter::cti_op_rshift(STUB_ARGS)5508 { 5509 BEGIN_STUB_FUNCTION(); 5510 5511 JSValue *val = ARG_src1;5512 JSValue *shift = ARG_src2;5506 return JSValuePtr::encode(result); 5507 } 5508 5509 JSValueEncodedAsPointer* Interpreter::cti_op_rshift(STUB_ARGS) 5510 { 5511 BEGIN_STUB_FUNCTION(); 5512 5513 JSValuePtr val = ARG_src1; 5514 JSValuePtr shift = ARG_src2; 5513 5515 5514 5516 int32_t left; 5515 5517 uint32_t right; 5516 5518 if (JSImmediate::areBothImmediateNumbers(val, shift)) 5517 return JS Immediate::rightShiftImmediateNumbers(val, shift);5519 return JSValuePtr::encode(JSImmediate::rightShiftImmediateNumbers(val, shift)); 5518 5520 if (fastToInt32(val, left) && fastToUInt32(shift, right)) 5519 return jsNumber(ARG_globalData, left >> (right & 0x1f));5520 5521 CallFrame* callFrame = ARG_callFrame; 5522 JSValue *result = jsNumber(ARG_globalData, (val->toInt32(callFrame)) >> (shift->toUInt32(callFrame) & 0x1f));5521 return JSValuePtr::encode(jsNumber(ARG_globalData, left >> (right & 0x1f))); 5522 5523 CallFrame* callFrame = ARG_callFrame; 5524 JSValuePtr result = jsNumber(ARG_globalData, (val->toInt32(callFrame)) >> (shift->toUInt32(callFrame) & 0x1f)); 5523 5525 CHECK_FOR_EXCEPTION_AT_END(); 5524 return result;5525 } 5526 5527 JSValue * Interpreter::cti_op_bitnot(STUB_ARGS)5528 { 5529 BEGIN_STUB_FUNCTION(); 5530 5531 JSValue *src = ARG_src1;5526 return JSValuePtr::encode(result); 5527 } 5528 5529 JSValueEncodedAsPointer* Interpreter::cti_op_bitnot(STUB_ARGS) 5530 { 5531 BEGIN_STUB_FUNCTION(); 5532 5533 JSValuePtr src = ARG_src1; 5532 5534 5533 5535 int value; 5534 5536 if (fastToInt32(src, value)) 5535 return jsNumber(ARG_globalData, ~value);5536 5537 CallFrame* callFrame = ARG_callFrame; 5538 JSValue *result = jsNumber(ARG_globalData, ~src->toInt32(callFrame));5537 return JSValuePtr::encode(jsNumber(ARG_globalData, ~value)); 5538 5539 CallFrame* callFrame = ARG_callFrame; 5540 JSValuePtr result = jsNumber(ARG_globalData, ~src->toInt32(callFrame)); 5539 5541 CHECK_FOR_EXCEPTION_AT_END(); 5540 return result;5542 return JSValuePtr::encode(result); 5541 5543 } 5542 5544 … … 5561 5563 PropertySlot slot(base); 5562 5564 if (base->getPropertySlot(callFrame, ident, slot)) { 5563 JSValue *result = slot.getValue(callFrame, ident);5565 JSValuePtr result = slot.getValue(callFrame, ident); 5564 5566 CHECK_FOR_EXCEPTION_AT_END(); 5565 5567 5566 RETURN_PAIR(base, asPointer(result));5568 RETURN_PAIR(base, JSValuePtr::encode(result)); 5567 5569 } 5568 5570 ++iter; … … 5582 5584 } 5583 5585 5584 JSValue * Interpreter::cti_op_mod(STUB_ARGS)5585 { 5586 BEGIN_STUB_FUNCTION(); 5587 5588 JSValue *dividendValue = ARG_src1;5589 JSValue *divisorValue = ARG_src2;5586 JSValueEncodedAsPointer* Interpreter::cti_op_mod(STUB_ARGS) 5587 { 5588 BEGIN_STUB_FUNCTION(); 5589 5590 JSValuePtr dividendValue = ARG_src1; 5591 JSValuePtr divisorValue = ARG_src2; 5590 5592 5591 5593 CallFrame* callFrame = ARG_callFrame; 5592 5594 double d = dividendValue->toNumber(callFrame); 5593 JSValue *result = jsNumber(ARG_globalData, fmod(d, divisorValue->toNumber(callFrame)));5595 JSValuePtr result = jsNumber(ARG_globalData, fmod(d, divisorValue->toNumber(callFrame))); 5594 5596 CHECK_FOR_EXCEPTION_AT_END(); 5595 return result;5596 } 5597 5598 JSValue * Interpreter::cti_op_less(STUB_ARGS)5599 { 5600 BEGIN_STUB_FUNCTION(); 5601 5602 CallFrame* callFrame = ARG_callFrame; 5603 JSValue *result = jsBoolean(jsLess(callFrame, ARG_src1, ARG_src2));5597 return JSValuePtr::encode(result); 5598 } 5599 5600 JSValueEncodedAsPointer* Interpreter::cti_op_less(STUB_ARGS) 5601 { 5602 BEGIN_STUB_FUNCTION(); 5603 5604 CallFrame* callFrame = ARG_callFrame; 5605 JSValuePtr result = jsBoolean(jsLess(callFrame, ARG_src1, ARG_src2)); 5604 5606 CHECK_FOR_EXCEPTION_AT_END(); 5605 return result;5606 } 5607 5608 JSValue * Interpreter::cti_op_neq(STUB_ARGS)5609 { 5610 BEGIN_STUB_FUNCTION(); 5611 5612 JSValue *src1 = ARG_src1;5613 JSValue *src2 = ARG_src2;5607 return JSValuePtr::encode(result); 5608 } 5609 5610 JSValueEncodedAsPointer* Interpreter::cti_op_neq(STUB_ARGS) 5611 { 5612 BEGIN_STUB_FUNCTION(); 5613 5614 JSValuePtr src1 = ARG_src1; 5615 JSValuePtr src2 = ARG_src2; 5614 5616 5615 5617 ASSERT(!JSImmediate::areBothImmediateNumbers(src1, src2)); 5616 5618 5617 5619 CallFrame* callFrame = ARG_callFrame; 5618 JSValue *result = jsBoolean(!equalSlowCaseInline(callFrame, src1, src2));5620 JSValuePtr result = jsBoolean(!equalSlowCaseInline(callFrame, src1, src2)); 5619 5621 CHECK_FOR_EXCEPTION_AT_END(); 5620 return result;5622 return JSValuePtr::encode(result); 5621 5623 } 5622 5624 … … 5625 5627 BEGIN_STUB_FUNCTION(); 5626 5628 5627 JSValue *v = ARG_src1;5628 5629 CallFrame* callFrame = ARG_callFrame; 5630 5631 JSValue *number = v->toJSNumber(callFrame);5629 JSValuePtr v = ARG_src1; 5630 5631 CallFrame* callFrame = ARG_callFrame; 5632 5633 JSValuePtr number = v->toJSNumber(callFrame); 5632 5634 CHECK_FOR_EXCEPTION_AT_END(); 5633 5635 5634 RETURN_PAIR( asPointer(number), asPointer(jsNumber(ARG_globalData, number->uncheckedGetNumber() - 1)));5635 } 5636 5637 JSValue * Interpreter::cti_op_urshift(STUB_ARGS)5638 { 5639 BEGIN_STUB_FUNCTION(); 5640 5641 JSValue *val = ARG_src1;5642 JSValue *shift = ARG_src2;5636 RETURN_PAIR(JSValuePtr::encode(number), JSValuePtr::encode(jsNumber(ARG_globalData, number->uncheckedGetNumber() - 1))); 5637 } 5638 5639 JSValueEncodedAsPointer* Interpreter::cti_op_urshift(STUB_ARGS) 5640 { 5641 BEGIN_STUB_FUNCTION(); 5642 5643 JSValuePtr val = ARG_src1; 5644 JSValuePtr shift = ARG_src2; 5643 5645 5644 5646 CallFrame* callFrame = ARG_callFrame; 5645 5647 5646 5648 if (JSImmediate::areBothImmediateNumbers(val, shift) && !JSImmediate::isNegative(val)) 5647 return JS Immediate::rightShiftImmediateNumbers(val, shift);5649 return JSValuePtr::encode(JSImmediate::rightShiftImmediateNumbers(val, shift)); 5648 5650 else { 5649 JSValue *result = jsNumber(ARG_globalData, (val->toUInt32(callFrame)) >> (shift->toUInt32(callFrame) & 0x1f));5651 JSValuePtr result = jsNumber(ARG_globalData, (val->toUInt32(callFrame)) >> (shift->toUInt32(callFrame) & 0x1f)); 5650 5652 CHECK_FOR_EXCEPTION_AT_END(); 5651 return result;5652 } 5653 } 5654 5655 JSValue * Interpreter::cti_op_bitxor(STUB_ARGS)5656 { 5657 BEGIN_STUB_FUNCTION(); 5658 5659 JSValue *src1 = ARG_src1;5660 JSValue *src2 = ARG_src2;5661 5662 CallFrame* callFrame = ARG_callFrame; 5663 5664 JSValue *result = jsNumber(ARG_globalData, src1->toInt32(callFrame) ^ src2->toInt32(callFrame));5653 return JSValuePtr::encode(result); 5654 } 5655 } 5656 5657 JSValueEncodedAsPointer* Interpreter::cti_op_bitxor(STUB_ARGS) 5658 { 5659 BEGIN_STUB_FUNCTION(); 5660 5661 JSValuePtr src1 = ARG_src1; 5662 JSValuePtr src2 = ARG_src2; 5663 5664 CallFrame* callFrame = ARG_callFrame; 5665 5666 JSValuePtr result = jsNumber(ARG_globalData, src1->toInt32(callFrame) ^ src2->toInt32(callFrame)); 5665 5667 CHECK_FOR_EXCEPTION_AT_END(); 5666 return result;5668 return JSValuePtr::encode(result); 5667 5669 } 5668 5670 … … 5674 5676 } 5675 5677 5676 JSValue * Interpreter::cti_op_bitor(STUB_ARGS)5677 { 5678 BEGIN_STUB_FUNCTION(); 5679 5680 JSValue *src1 = ARG_src1;5681 JSValue *src2 = ARG_src2;5682 5683 CallFrame* callFrame = ARG_callFrame; 5684 5685 JSValue *result = jsNumber(ARG_globalData, src1->toInt32(callFrame) | src2->toInt32(callFrame));5678 JSValueEncodedAsPointer* Interpreter::cti_op_bitor(STUB_ARGS) 5679 { 5680 BEGIN_STUB_FUNCTION(); 5681 5682 JSValuePtr src1 = ARG_src1; 5683 JSValuePtr src2 = ARG_src2; 5684 5685 CallFrame* callFrame = ARG_callFrame; 5686 5687 JSValuePtr result = jsNumber(ARG_globalData, src1->toInt32(callFrame) | src2->toInt32(callFrame)); 5686 5688 CHECK_FOR_EXCEPTION_AT_END(); 5687 return result;5688 } 5689 5690 JSValue * Interpreter::cti_op_call_eval(STUB_ARGS)5689 return JSValuePtr::encode(result); 5690 } 5691 5692 JSValueEncodedAsPointer* Interpreter::cti_op_call_eval(STUB_ARGS) 5691 5693 { 5692 5694 BEGIN_STUB_FUNCTION(); … … 5697 5699 Interpreter* interpreter = ARG_globalData->interpreter; 5698 5700 5699 JSValue *funcVal = ARG_src1;5701 JSValuePtr funcVal = ARG_src1; 5700 5702 int registerOffset = ARG_int2; 5701 5703 int argCount = ARG_int3; … … 5703 5705 Register* newCallFrame = callFrame->registers() + registerOffset; 5704 5706 Register* argv = newCallFrame - RegisterFile::CallFrameHeaderSize - argCount; 5705 JSValue *thisValue = argv[0].jsValue(callFrame);5707 JSValuePtr thisValue = argv[0].jsValue(callFrame); 5706 5708 JSGlobalObject* globalObject = callFrame->scopeChain()->globalObject(); 5707 5709 5708 5710 if (thisValue == globalObject && funcVal == globalObject->evalFunction()) { 5709 JSValue *exceptionValue = noValue();5710 JSValue *result = interpreter->callEval(callFrame, registerFile, argv, argCount, registerOffset, exceptionValue);5711 JSValuePtr exceptionValue = noValue(); 5712 JSValuePtr result = interpreter->callEval(callFrame, registerFile, argv, argCount, registerOffset, exceptionValue); 5711 5713 if (UNLIKELY(exceptionValue != noValue())) { 5712 5714 ARG_globalData->exception = exceptionValue; 5713 5715 VM_THROW_EXCEPTION_AT_END(); 5714 5716 } 5715 return result;5716 } 5717 5718 return JS Immediate::impossibleValue();5719 } 5720 5721 JSValue * Interpreter::cti_op_throw(STUB_ARGS)5717 return JSValuePtr::encode(result); 5718 } 5719 5720 return JSValuePtr::encode(JSImmediate::impossibleValue()); 5721 } 5722 5723 JSValueEncodedAsPointer* Interpreter::cti_op_throw(STUB_ARGS) 5722 5724 { 5723 5725 BEGIN_STUB_FUNCTION(); … … 5728 5730 unsigned vPCIndex = codeBlock->getBytecodeIndex(STUB_RETURN_ADDRESS); 5729 5731 5730 JSValue *exceptionValue = ARG_src1;5732 JSValuePtr exceptionValue = ARG_src1; 5731 5733 ASSERT(exceptionValue); 5732 5734 … … 5735 5737 if (!handler) { 5736 5738 *ARG_exception = exceptionValue; 5737 return JS Immediate::nullImmediate();5739 return JSValuePtr::encode(JSImmediate::nullImmediate()); 5738 5740 } 5739 5741 … … 5742 5744 ASSERT(catchRoutine); 5743 5745 STUB_SET_RETURN_ADDRESS(catchRoutine); 5744 return exceptionValue;5746 return JSValuePtr::encode(exceptionValue); 5745 5747 } 5746 5748 … … 5752 5754 } 5753 5755 5754 JSValue * Interpreter::cti_op_next_pname(STUB_ARGS)5756 JSValueEncodedAsPointer* Interpreter::cti_op_next_pname(STUB_ARGS) 5755 5757 { 5756 5758 BEGIN_STUB_FUNCTION(); 5757 5759 5758 5760 JSPropertyNameIterator* it = ARG_pni1; 5759 JSValue *temp = it->next(ARG_callFrame);5761 JSValuePtr temp = it->next(ARG_callFrame); 5760 5762 if (!temp) 5761 5763 it->invalidate(); 5762 return temp;5764 return JSValuePtr::encode(temp); 5763 5765 } 5764 5766 … … 5780 5782 } 5781 5783 5782 JSValue * Interpreter::cti_op_typeof(STUB_ARGS)5783 { 5784 BEGIN_STUB_FUNCTION(); 5785 5786 return jsTypeStringForValue(ARG_callFrame, ARG_src1);5787 } 5788 5789 JSValue * Interpreter::cti_op_is_undefined(STUB_ARGS)5790 { 5791 BEGIN_STUB_FUNCTION(); 5792 5793 JSValue *v = ARG_src1;5794 return jsBoolean(JSImmediate::isImmediate(v) ? v->isUndefined() : v->asCell()->structure()->typeInfo().masqueradesAsUndefined());5795 } 5796 5797 JSValue * Interpreter::cti_op_is_boolean(STUB_ARGS)5798 { 5799 BEGIN_STUB_FUNCTION(); 5800 5801 return jsBoolean(ARG_src1->isBoolean());5802 } 5803 5804 JSValue * Interpreter::cti_op_is_number(STUB_ARGS)5805 { 5806 BEGIN_STUB_FUNCTION(); 5807 5808 return jsBoolean(ARG_src1->isNumber());5809 } 5810 5811 JSValue * Interpreter::cti_op_is_string(STUB_ARGS)5812 { 5813 BEGIN_STUB_FUNCTION(); 5814 5815 return jsBoolean(ARG_globalData->interpreter->isJSString(ARG_src1));5816 } 5817 5818 JSValue * Interpreter::cti_op_is_object(STUB_ARGS)5819 { 5820 BEGIN_STUB_FUNCTION(); 5821 5822 return jsBoolean(jsIsObjectType(ARG_src1));5823 } 5824 5825 JSValue * Interpreter::cti_op_is_function(STUB_ARGS)5826 { 5827 BEGIN_STUB_FUNCTION(); 5828 5829 return jsBoolean(jsIsFunctionType(ARG_src1));5830 } 5831 5832 JSValue * Interpreter::cti_op_stricteq(STUB_ARGS)5833 { 5834 BEGIN_STUB_FUNCTION(); 5835 5836 JSValue *src1 = ARG_src1;5837 JSValue *src2 = ARG_src2;5784 JSValueEncodedAsPointer* Interpreter::cti_op_typeof(STUB_ARGS) 5785 { 5786 BEGIN_STUB_FUNCTION(); 5787 5788 return JSValuePtr::encode(jsTypeStringForValue(ARG_callFrame, ARG_src1)); 5789 } 5790 5791 JSValueEncodedAsPointer* Interpreter::cti_op_is_undefined(STUB_ARGS) 5792 { 5793 BEGIN_STUB_FUNCTION(); 5794 5795 JSValuePtr v = ARG_src1; 5796 return JSValuePtr::encode(jsBoolean(JSImmediate::isImmediate(v) ? v->isUndefined() : v->asCell()->structure()->typeInfo().masqueradesAsUndefined())); 5797 } 5798 5799 JSValueEncodedAsPointer* Interpreter::cti_op_is_boolean(STUB_ARGS) 5800 { 5801 BEGIN_STUB_FUNCTION(); 5802 5803 return JSValuePtr::encode(jsBoolean(ARG_src1->isBoolean())); 5804 } 5805 5806 JSValueEncodedAsPointer* Interpreter::cti_op_is_number(STUB_ARGS) 5807 { 5808 BEGIN_STUB_FUNCTION(); 5809 5810 return JSValuePtr::encode(jsBoolean(ARG_src1->isNumber())); 5811 } 5812 5813 JSValueEncodedAsPointer* Interpreter::cti_op_is_string(STUB_ARGS) 5814 { 5815 BEGIN_STUB_FUNCTION(); 5816 5817 return JSValuePtr::encode(jsBoolean(ARG_globalData->interpreter->isJSString(ARG_src1))); 5818 } 5819 5820 JSValueEncodedAsPointer* Interpreter::cti_op_is_object(STUB_ARGS) 5821 { 5822 BEGIN_STUB_FUNCTION(); 5823 5824 return JSValuePtr::encode(jsBoolean(jsIsObjectType(ARG_src1))); 5825 } 5826 5827 JSValueEncodedAsPointer* Interpreter::cti_op_is_function(STUB_ARGS) 5828 { 5829 BEGIN_STUB_FUNCTION(); 5830 5831 return JSValuePtr::encode(jsBoolean(jsIsFunctionType(ARG_src1))); 5832 } 5833 5834 JSValueEncodedAsPointer* Interpreter::cti_op_stricteq(STUB_ARGS) 5835 { 5836 BEGIN_STUB_FUNCTION(); 5837 5838 JSValuePtr src1 = ARG_src1; 5839 JSValuePtr src2 = ARG_src2; 5838 5840 5839 5841 // handled inline as fast cases … … 5841 5843 ASSERT(!(JSImmediate::isEitherImmediate(src1, src2) & (src1 != JSImmediate::zeroImmediate()) & (src2 != JSImmediate::zeroImmediate()))); 5842 5844 5843 return jsBoolean(strictEqualSlowCaseInline(src1, src2));5844 } 5845 5846 JSValue * Interpreter::cti_op_nstricteq(STUB_ARGS)5847 { 5848 BEGIN_STUB_FUNCTION(); 5849 5850 JSValue *src1 = ARG_src1;5851 JSValue *src2 = ARG_src2;5845 return JSValuePtr::encode(jsBoolean(strictEqualSlowCaseInline(src1, src2))); 5846 } 5847 5848 JSValueEncodedAsPointer* Interpreter::cti_op_nstricteq(STUB_ARGS) 5849 { 5850 BEGIN_STUB_FUNCTION(); 5851 5852 JSValuePtr src1 = ARG_src1; 5853 JSValuePtr src2 = ARG_src2; 5852 5854 5853 5855 // handled inline as fast cases … … 5855 5857 ASSERT(!(JSImmediate::isEitherImmediate(src1, src2) & (src1 != JSImmediate::zeroImmediate()) & (src2 != JSImmediate::zeroImmediate()))); 5856 5858 5857 return jsBoolean(!strictEqualSlowCaseInline(src1, src2));5858 } 5859 5860 JSValue * Interpreter::cti_op_to_jsnumber(STUB_ARGS)5861 { 5862 BEGIN_STUB_FUNCTION(); 5863 5864 JSValue *src = ARG_src1;5865 CallFrame* callFrame = ARG_callFrame; 5866 5867 JSValue *result = src->toJSNumber(callFrame);5859 return JSValuePtr::encode(jsBoolean(!strictEqualSlowCaseInline(src1, src2))); 5860 } 5861 5862 JSValueEncodedAsPointer* Interpreter::cti_op_to_jsnumber(STUB_ARGS) 5863 { 5864 BEGIN_STUB_FUNCTION(); 5865 5866 JSValuePtr src = ARG_src1; 5867 CallFrame* callFrame = ARG_callFrame; 5868 5869 JSValuePtr result = src->toJSNumber(callFrame); 5868 5870 CHECK_FOR_EXCEPTION_AT_END(); 5869 return result;5870 } 5871 5872 JSValue * Interpreter::cti_op_in(STUB_ARGS)5873 { 5874 BEGIN_STUB_FUNCTION(); 5875 5876 CallFrame* callFrame = ARG_callFrame; 5877 JSValue *baseVal = ARG_src2;5871 return JSValuePtr::encode(result); 5872 } 5873 5874 JSValueEncodedAsPointer* Interpreter::cti_op_in(STUB_ARGS) 5875 { 5876 BEGIN_STUB_FUNCTION(); 5877 5878 CallFrame* callFrame = ARG_callFrame; 5879 JSValuePtr baseVal = ARG_src2; 5878 5880 5879 5881 if (!baseVal->isObject()) { … … 5885 5887 } 5886 5888 5887 JSValue *propName = ARG_src1;5889 JSValuePtr propName = ARG_src1; 5888 5890 JSObject* baseObj = asObject(baseVal); 5889 5891 5890 5892 uint32_t i; 5891 5893 if (propName->getUInt32(i)) 5892 return jsBoolean(baseObj->hasProperty(callFrame, i));5894 return JSValuePtr::encode(jsBoolean(baseObj->hasProperty(callFrame, i))); 5893 5895 5894 5896 Identifier property(callFrame, propName->toString(callFrame)); 5895 5897 CHECK_FOR_EXCEPTION(); 5896 return jsBoolean(baseObj->hasProperty(callFrame, property));5898 return JSValuePtr::encode(jsBoolean(baseObj->hasProperty(callFrame, property))); 5897 5899 } 5898 5900 … … 5935 5937 BEGIN_STUB_FUNCTION(); 5936 5938 5937 JSValue *scrutinee = ARG_src1;5939 JSValuePtr scrutinee = ARG_src1; 5938 5940 unsigned tableIndex = ARG_int2; 5939 5941 CallFrame* callFrame = ARG_callFrame; … … 5952 5954 BEGIN_STUB_FUNCTION(); 5953 5955 5954 JSValue *scrutinee = ARG_src1;5956 JSValuePtr scrutinee = ARG_src1; 5955 5957 unsigned tableIndex = ARG_int2; 5956 5958 CallFrame* callFrame = ARG_callFrame; … … 5972 5974 BEGIN_STUB_FUNCTION(); 5973 5975 5974 JSValue *scrutinee = ARG_src1;5976 JSValuePtr scrutinee = ARG_src1; 5975 5977 unsigned tableIndex = ARG_int2; 5976 5978 CallFrame* callFrame = ARG_callFrame; … … 5987 5989 } 5988 5990 5989 JSValue * Interpreter::cti_op_del_by_val(STUB_ARGS)5990 { 5991 BEGIN_STUB_FUNCTION(); 5992 5993 CallFrame* callFrame = ARG_callFrame; 5994 5995 JSValue *baseValue = ARG_src1;5991 JSValueEncodedAsPointer* Interpreter::cti_op_del_by_val(STUB_ARGS) 5992 { 5993 BEGIN_STUB_FUNCTION(); 5994 5995 CallFrame* callFrame = ARG_callFrame; 5996 5997 JSValuePtr baseValue = ARG_src1; 5996 5998 JSObject* baseObj = baseValue->toObject(callFrame); // may throw 5997 5999 5998 JSValue *subscript = ARG_src2;5999 JSValue *result;6000 JSValuePtr subscript = ARG_src2; 6001 JSValuePtr result; 6000 6002 uint32_t i; 6001 6003 if (subscript->getUInt32(i)) … … 6009 6011 6010 6012 CHECK_FOR_EXCEPTION_AT_END(); 6011 return result;6013 return JSValuePtr::encode(result); 6012 6014 } 6013 6015 … … 6043 6045 CodeBlock* codeBlock = callFrame->codeBlock(); 6044 6046 unsigned type = ARG_int1; 6045 JSValue *message = ARG_src2;6047 JSValuePtr message = ARG_src2; 6046 6048 unsigned lineNumber = ARG_int3; 6047 6049 … … 6062 6064 } 6063 6065 6064 JSValue * Interpreter::cti_vm_throw(STUB_ARGS)6066 JSValueEncodedAsPointer* Interpreter::cti_vm_throw(STUB_ARGS) 6065 6067 { 6066 6068 BEGIN_STUB_FUNCTION(); … … 6072 6074 unsigned vPCIndex = codeBlock->getBytecodeIndex(globalData->exceptionLocation); 6073 6075 6074 JSValue *exceptionValue = globalData->exception;6076 JSValuePtr exceptionValue = globalData->exception; 6075 6077 ASSERT(exceptionValue); 6076 6078 globalData->exception = noValue(); … … 6080 6082 if (!handler) { 6081 6083 *ARG_exception = exceptionValue; 6082 return JS Immediate::nullImmediate();6084 return JSValuePtr::encode(JSImmediate::nullImmediate()); 6083 6085 } 6084 6086 … … 6087 6089 ASSERT(catchRoutine); 6088 6090 STUB_SET_RETURN_ADDRESS(catchRoutine); 6089 return exceptionValue;6091 return JSValuePtr::encode(exceptionValue); 6090 6092 } 6091 6093
Note:
See TracChangeset
for help on using the changeset viewer.