Changeset 35203 in webkit


Ignore:
Timestamp:
Jul 16, 2008 3:47:32 PM (16 years ago)
Author:
ggaren@apple.com
Message:

JavaScriptCore:

2008-07-16 Geoffrey Garen <ggaren@apple.com>

Reviewed by Oliver Hunt.


First step toward putting doubles in registers: Turned Register into a
proper abstraction layer. It is no longer possible to cast a Register
to a JSValue*, or a Register& to a JSValue*&, or to access the union
inside a Register directly.


SunSpider reports no change.


In support of this change, I had to make the following mechanical changes
in a lot of places:


  1. Clients now use explicit accessors to read data out of Registers, and implicit copy constructors to write data into registers.


So, assignment that used to look like


x.u.jsValue = y;


now looks like


x = y;


And access that used to look like


x = y.u.jsValue;


now looks like


x = y.jsValue();

  1. I made generic flow control specific in opcodes that made their flow control generic by treating a Register& as a JSValue*&. This had the added benefit of removing some exception checking branches from immediate number code.
  1. I beefed up PropertySlot to support storing a Register* in a property slot. For now, only JSVariableObject's symbolTableGet and symbolTablePut use this functionality, but I expect more clients to use it in the future.


  1. I changed ArgList to be a buffer of Registers, not JSValue*'s, and I changed ArgList iterator clients to iterate Registers, not JSValue*'s.

WebCore:

2008-07-16 Geoffrey Garen <ggaren@apple.com>

Reviewed by Oliver Hunt.

Support for JavaScriptCore's first step toward putting doubles in
registers: Treat ArgList iterators as Register*'s, not JSValue*'s.

  • bindings/js/ScheduledAction.cpp: (WebCore::ScheduledAction::ScheduledAction):
Location:
trunk
Files:
22 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r35202 r35203  
     12008-07-16  Geoffrey Garen  <ggaren@apple.com>
     2
     3        Reviewed by Oliver Hunt.
     4       
     5        First step toward putting doubles in registers: Turned Register into a
     6        proper abstraction layer. It is no longer possible to cast a Register
     7        to a JSValue*, or a Register& to a JSValue*&, or to access the union
     8        inside a Register directly.
     9       
     10        SunSpider reports no change.
     11       
     12        In support of this change, I had to make the following mechanical changes
     13        in a lot of places:
     14       
     15        1. Clients now use explicit accessors to read data out of Registers, and
     16        implicit copy constructors to write data into registers.
     17       
     18        So, assignment that used to look like
     19       
     20            x.u.jsValue = y;
     21       
     22        now looks like
     23       
     24            x = y;
     25           
     26        And access that used to look like
     27       
     28            x = y.u.jsValue;
     29       
     30        now looks like
     31       
     32            x = y.jsValue();
     33
     34        2. I made generic flow control specific in opcodes that made their flow
     35        control generic by treating a Register& as a JSValue*&. This had the
     36        added benefit of removing some exception checking branches from immediate
     37        number code.
     38
     39        3. I beefed up PropertySlot to support storing a Register* in a property
     40        slot. For now, only JSVariableObject's symbolTableGet and symbolTablePut
     41        use this functionality, but I expect more clients to use it in the future.
     42       
     43        4. I changed ArgList to be a buffer of Registers, not JSValue*'s, and I
     44        changed ArgList iterator clients to iterate Registers, not JSValue*'s.
     45
    1462008-07-16  Ada Chan  <adachan@apple.com>
    247
  • trunk/JavaScriptCore/VM/Machine.cpp

    r35053 r35203  
    215215            if (exceptionValue)
    216216                return false;
    217             r[dst].u.jsValue = result;
     217            r[dst] = result;
    218218            return true;
    219219        }
     
    245245            if (exceptionValue)
    246246                return false;
    247             r[dst].u.jsValue = result;
     247            r[dst] = result;
    248248            return true;
    249249        }
     
    270270        base = *iter;
    271271        if (next == end || base->getPropertySlot(exec, ident, slot)) {
    272             r[dst].u.jsValue = base;
     272            r[dst] = base;
    273273            return;
    274274        }
     
    301301            if (exceptionValue)
    302302                return false;
    303             r[propDst].u.jsValue = result;
    304             r[baseDst].u.jsValue = base;
     303            r[propDst] = result;
     304            r[baseDst] = base;
    305305            return true;
    306306        }
     
    344344                return false;
    345345
    346             r[baseDst].u.jsValue = thisObj;
    347             r[funcDst].u.jsValue = result;
     346            r[baseDst] = thisObj;
     347            r[funcDst] = result;
    348348            return true;
    349349        }
     
    355355}
    356356
    357 ALWAYS_INLINE void initializeCallFrame(Register* callFrame, CodeBlock* codeBlock, Instruction* vPC, ScopeChainNode* scopeChain, Register* r, int returnValueRegister, int argv, int argc, int calledAsConstructor, JSValue* function)
    358 {
    359     callFrame[RegisterFile::CallerCodeBlock].u.codeBlock = codeBlock;
    360     callFrame[RegisterFile::ReturnVPC].u.vPC = vPC + 1;
    361     callFrame[RegisterFile::CallerScopeChain].u.scopeChain = scopeChain;
    362     callFrame[RegisterFile::CallerRegisters].u.r = r;
    363     callFrame[RegisterFile::ReturnValueRegister].u.i = returnValueRegister;
    364     callFrame[RegisterFile::ArgumentStartRegister].u.i = argv; // original argument vector (for the sake of the "arguments" object)
    365     callFrame[RegisterFile::ArgumentCount].u.i = argc; // original argument count (for the sake of the "arguments" object)
    366     callFrame[RegisterFile::CalledAsConstructor].u.i = calledAsConstructor;
    367     callFrame[RegisterFile::Callee].u.jsValue = function;
    368     callFrame[RegisterFile::OptionalCalleeActivation].u.jsValue = 0;
     357ALWAYS_INLINE void Machine::initializeCallFrame(Register* callFrame, CodeBlock* codeBlock, Instruction* vPC, ScopeChainNode* scopeChain, Register* r, int returnValueRegister, int argv, int argc, int calledAsConstructor, JSValue* function)
     358{
     359    callFrame[RegisterFile::CallerCodeBlock] = codeBlock;
     360    callFrame[RegisterFile::ReturnVPC] = vPC + 1;
     361    callFrame[RegisterFile::CallerScopeChain] = scopeChain;
     362    callFrame[RegisterFile::CallerRegisters] = r;
     363    callFrame[RegisterFile::ReturnValueRegister] = returnValueRegister;
     364    callFrame[RegisterFile::ArgumentStartRegister] = argv; // original argument vector (for the sake of the "arguments" object)
     365    callFrame[RegisterFile::ArgumentCount] = argc; // original argument count (for the sake of the "arguments" object)
     366    callFrame[RegisterFile::CalledAsConstructor] = calledAsConstructor;
     367    callFrame[RegisterFile::Callee] = function;
     368    callFrame[RegisterFile::OptionalCalleeActivation] = 0;
    369369}
    370370
     
    390390        Register* endOfParams = r - newCodeBlock->numVars;
    391391        for (Register* it = endOfParams - omittedArgCount; it != endOfParams; ++it)
    392             (*it).u.jsValue = jsUndefined();
     392            (*it) = jsUndefined();
    393393    } else { // too many arguments -- copy return info and expected arguments, leaving the extra arguments behind
    394394        int shift = argc + RegisterFile::CallFrameHeaderSize;
     
    410410    // initialize local variable slots
    411411    for (Register* it = r - newCodeBlock->numVars; it != r; ++it)
    412         (*it).u.jsValue = jsUndefined();
     412        (*it) = jsUndefined();
    413413
    414414    return r;
     
    419419    if (newCodeBlock->needsFullScopeChain) {
    420420        JSActivation* activation = new (exec) JSActivation(functionBodyNode, r);
    421         r[RegisterFile::OptionalCalleeActivation - RegisterFile::CallFrameHeaderSize - newCodeBlock->numLocals].u.jsValue = activation;
     421        r[RegisterFile::OptionalCalleeActivation - RegisterFile::CallFrameHeaderSize - newCodeBlock->numLocals] = activation;
    422422
    423423        return callDataScopeChain->copy()->push(activation);
     
    435435}
    436436
    437 NEVER_INLINE JSValue* callEval(ExecState* exec, JSObject* thisObj, ScopeChainNode* scopeChain, RegisterFile* registerFile, Register* r, int argv, int argc, JSValue*& exceptionValue)
     437NEVER_INLINE JSValue* Machine::callEval(ExecState* exec, JSObject* thisObj, ScopeChainNode* scopeChain, RegisterFile* registerFile, Register* r, int argv, int argc, JSValue*& exceptionValue)
    438438{
    439439    if (argc < 2)
    440440        return jsUndefined();
    441441
    442     JSValue* program = r[argv + 1].u.jsValue;
     442    JSValue* program = r[argv + 1].jsValue();
    443443
    444444    if (!program->isString())
     
    515515        end = it + registerFile->numGlobals();
    516516        while (it != end) {
    517             printf("[global var]               | %10p | %10p \n", it, (*it).u.jsValue);
     517            printf("[global var]               | %10p | %10p \n", it, (*it).jsValue());
    518518            ++it;
    519519        }
     
    522522   
    523523    it = r - codeBlock->numLocals - RegisterFile::CallFrameHeaderSize;
    524     printf("[CallerCodeBlock]          | %10p | %10p \n", it, (*it).u.jsValue); ++it;
    525     printf("[ReturnVPC]                | %10p | %10p \n", it, (*it).u.jsValue); ++it;
    526     printf("[CallerScopeChain]         | %10p | %10p \n", it, (*it).u.jsValue); ++it;
    527     printf("[CallerRegisterOffset]     | %10p | %10p \n", it, (*it).u.jsValue); ++it;
    528     printf("[ReturnValueRegister]      | %10p | %10p \n", it, (*it).u.jsValue); ++it;
    529     printf("[ArgumentStartRegister]    | %10p | %10p \n", it, (*it).u.jsValue); ++it;
    530     printf("[ArgumentCount]            | %10p | %10p \n", it, (*it).u.jsValue); ++it;
    531     printf("[CalledAsConstructor]      | %10p | %10p \n", it, (*it).u.jsValue); ++it;
    532     printf("[Callee]                   | %10p | %10p \n", it, (*it).u.jsValue); ++it;
    533     printf("[OptionalCalleeActivation] | %10p | %10p \n", it, (*it).u.jsValue); ++it;
     524    printf("[CallerCodeBlock]          | %10p | %10p \n", it, (*it).jsValue()); ++it;
     525    printf("[ReturnVPC]                | %10p | %10p \n", it, (*it).jsValue()); ++it;
     526    printf("[CallerScopeChain]         | %10p | %10p \n", it, (*it).jsValue()); ++it;
     527    printf("[CallerRegisterOffset]     | %10p | %10p \n", it, (*it).jsValue()); ++it;
     528    printf("[ReturnValueRegister]      | %10p | %10p \n", it, (*it).jsValue()); ++it;
     529    printf("[ArgumentStartRegister]    | %10p | %10p \n", it, (*it).jsValue()); ++it;
     530    printf("[ArgumentCount]            | %10p | %10p \n", it, (*it).jsValue()); ++it;
     531    printf("[CalledAsConstructor]      | %10p | %10p \n", it, (*it).jsValue()); ++it;
     532    printf("[Callee]                   | %10p | %10p \n", it, (*it).jsValue()); ++it;
     533    printf("[OptionalCalleeActivation] | %10p | %10p \n", it, (*it).jsValue()); ++it;
    534534    printf("----------------------------------------------------\n");
    535535
    536     printf("[this]                     | %10p | %10p \n", it, (*it).u.jsValue); ++it;
     536    printf("[this]                     | %10p | %10p \n", it, (*it).jsValue()); ++it;
    537537    end = it + max(codeBlock->numParameters - 1, 0); // - 1 to skip "this"
    538538    if (it != end) {
    539539        do {
    540             printf("[param]                    | %10p | %10p \n", it, (*it).u.jsValue);
     540            printf("[param]                    | %10p | %10p \n", it, (*it).jsValue());
    541541            ++it;
    542542        } while (it != end);
     
    548548        if (it != end) {
    549549            do {
    550                 printf("[var]                      | %10p | %10p \n", it, (*it).u.jsValue);
     550                printf("[var]                      | %10p | %10p \n", it, (*it).jsValue());
    551551                ++it;
    552552            } while (it != end);
     
    558558    if (it != end) {
    559559        do {
    560             printf("[temp]                     | %10p | %10p \n", it, (*it).u.jsValue);
     560            printf("[temp]                     | %10p | %10p \n", it, (*it).jsValue());
    561561            ++it;
    562562        } while (it != end);
     
    582582    if (Debugger* debugger = exec->dynamicGlobalObject()->debugger()) {
    583583        DebuggerCallFrame debuggerCallFrame(exec->dynamicGlobalObject(), codeBlock, scopeChain, r, exceptionValue);
    584         if (callFrame[RegisterFile::Callee].u.jsObject)
     584        if (callFrame[RegisterFile::Callee].jsValue())
    585585            debugger->returnEvent(debuggerCallFrame, codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->lastLine());
    586586        else
     
    589589
    590590    if (Profiler* profiler = *Profiler::enabledProfilerReference()) {
    591         if (callFrame[RegisterFile::Callee].u.jsObject)
    592             profiler->didExecute(exec, callFrame[RegisterFile::Callee].u.jsObject);
     591        if (callFrame[RegisterFile::Callee].jsValue())
     592            profiler->didExecute(exec, static_cast<JSObject*>(callFrame[RegisterFile::Callee].jsValue()));
    593593        else
    594594            profiler->didExecute(exec, codeBlock->ownerNode->sourceURL(), codeBlock->ownerNode->lineNo());
     
    599599
    600600    // If this call frame created an activation, tear it off.
    601     if (JSActivation* activation = static_cast<JSActivation*>(callFrame[RegisterFile::OptionalCalleeActivation].u.jsValue)) {
     601    if (JSActivation* activation = static_cast<JSActivation*>(callFrame[RegisterFile::OptionalCalleeActivation].jsValue())) {
    602602        ASSERT(activation->isActivationObject());
    603603        activation->copyRegisters();
    604604    }
    605605   
    606     codeBlock = callFrame[RegisterFile::CallerCodeBlock].u.codeBlock;
     606    codeBlock = callFrame[RegisterFile::CallerCodeBlock].codeBlock();
    607607    if (!codeBlock)
    608608        return false;
    609609
    610610    k = codeBlock->jsValues.data();
    611     scopeChain = callFrame[RegisterFile::CallerScopeChain].u.scopeChain;
    612     r = callFrame[RegisterFile::CallerRegisters].u.r;
     611    scopeChain = callFrame[RegisterFile::CallerScopeChain].scopeChain();
     612    r = callFrame[RegisterFile::CallerRegisters].r();
    613613    exec->m_callFrame = r - oldCodeBlock->numLocals - RegisterFile::CallFrameHeaderSize;
    614     vPC = callFrame[RegisterFile::ReturnVPC].u.vPC;
     614    vPC = callFrame[RegisterFile::ReturnVPC].vPC();
    615615
    616616    return true;
     
    689689
    690690    Register* r = callFrame + RegisterFile::CallFrameHeaderSize + codeBlock->numVars;
    691     r[codeBlock->thisRegister].u.jsValue = thisObj;
     691    r[codeBlock->thisRegister] = thisObj;
    692692
    693693    if (codeBlock->needsFullScopeChain)
     
    737737    // put args in place, including "this"
    738738    Register* dst = callFrame + RegisterFile::CallFrameHeaderSize;
    739     (*dst).u.jsValue = thisObj;
     739    (*dst) = thisObj;
    740740
    741741    ArgList::const_iterator end = args.end();
    742742    for (ArgList::const_iterator it = args.begin(); it != end; ++it)
    743         (*++dst).u.jsValue = *it;
     743        (*++dst) = *it;
    744744
    745745    // a 0 codeBlock indicates a built-in caller
     
    816816
    817817    Register* r = callFrame + RegisterFile::CallFrameHeaderSize + codeBlock->numVars;
    818     r[codeBlock->thisRegister].u.jsValue = thisObj;
     818    r[codeBlock->thisRegister] = thisObj;
    819819
    820820    if (codeBlock->needsFullScopeChain)
     
    10271027        int dst = (++vPC)->u.operand;
    10281028        int src = (++vPC)->u.operand;
    1029         r[dst].u.jsValue = k[src];
     1029        r[dst] = k[src];
    10301030
    10311031        ++vPC;
     
    10391039        */
    10401040        int dst = (++vPC)->u.operand;
    1041         r[dst].u.jsValue = constructEmptyObject(exec);
     1041        r[dst] = constructEmptyObject(exec);
    10421042
    10431043        ++vPC;
     
    10551055        int firstArg = (++vPC)->u.operand;
    10561056        int argCount = (++vPC)->u.operand;
    1057         ArgList args(reinterpret_cast<JSValue**>(r) + firstArg, argCount);
    1058         r[dst].u.jsValue = constructArray(exec, args);
     1057        ArgList args(r + firstArg, argCount);
     1058        r[dst] = constructArray(exec, args);
    10591059
    10601060        ++vPC;
     
    10701070        int dst = (++vPC)->u.operand;
    10711071        int regExp = (++vPC)->u.operand;
    1072         r[dst].u.jsValue = new (exec) RegExpObject(scopeChain->globalObject()->regExpPrototype(), codeBlock->regexps[regExp]);
     1072        r[dst] = new (exec) RegExpObject(scopeChain->globalObject()->regExpPrototype(), codeBlock->regexps[regExp]);
    10731073
    10741074        ++vPC;
     
    10941094           as a boolean in register dst.
    10951095        */
    1096         JSValue*& dst = r[(++vPC)->u.operand].u.jsValue;
    1097         JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;
    1098         JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;
    1099         JSValue* result;
     1096        int dst = (++vPC)->u.operand;
     1097        JSValue* src1 = r[(++vPC)->u.operand].jsValue();
     1098        JSValue* src2 = r[(++vPC)->u.operand].jsValue();
    11001099        if (JSImmediate::areBothImmediateNumbers(src1, src2))
    1101             result = jsBoolean(reinterpret_cast<intptr_t>(src1) == reinterpret_cast<intptr_t>(src2));
     1100            r[dst] = jsBoolean(reinterpret_cast<intptr_t>(src1) == reinterpret_cast<intptr_t>(src2));
    11021101        else {
    1103             result = jsBoolean(equal(exec, src1, src2));
     1102            JSValue* result = jsBoolean(equal(exec, src1, src2));
    11041103            VM_CHECK_EXCEPTION();
    1105         }
    1106         dst = result;
     1104            r[dst] = result;
     1105        }
    11071106
    11081107        ++vPC;
     
    11161115           result as a boolean in register dst.
    11171116        */
    1118         JSValue*& dst = r[(++vPC)->u.operand].u.jsValue;
    1119         JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;
    1120         JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;
    1121         JSValue* result;
     1117        int dst = (++vPC)->u.operand;
     1118        JSValue* src1 = r[(++vPC)->u.operand].jsValue();
     1119        JSValue* src2 = r[(++vPC)->u.operand].jsValue();
    11221120        if (JSImmediate::areBothImmediateNumbers(src1, src2))
    1123             result = jsBoolean(reinterpret_cast<intptr_t>(src1) != reinterpret_cast<intptr_t>(src2));
     1121            r[dst] = jsBoolean(reinterpret_cast<intptr_t>(src1) != reinterpret_cast<intptr_t>(src2));
    11241122        else {
    1125             result = jsBoolean(!equal(exec, src1, src2));
     1123            JSValue* result = jsBoolean(!equal(exec, src1, src2));
    11261124            VM_CHECK_EXCEPTION();
    1127         }
    1128         dst = result;
     1125            r[dst] = result;
     1126        }
    11291127
    11301128        ++vPC;
     
    11381136           result as a boolean in register dst.
    11391137        */
    1140         JSValue*& dst = r[(++vPC)->u.operand].u.jsValue;
    1141         JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;
    1142         JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;
     1138        int dst = (++vPC)->u.operand;
     1139        JSValue* src1 = r[(++vPC)->u.operand].jsValue();
     1140        JSValue* src2 = r[(++vPC)->u.operand].jsValue();
    11431141        if (JSImmediate::areBothImmediateNumbers(src1, src2))
    1144             dst = jsBoolean(reinterpret_cast<intptr_t>(src1) == reinterpret_cast<intptr_t>(src2));
     1142            r[dst] = jsBoolean(reinterpret_cast<intptr_t>(src1) == reinterpret_cast<intptr_t>(src2));
    11451143        else
    1146             dst = jsBoolean(strictEqual(src1, src2));
     1144            r[dst] = jsBoolean(strictEqual(src1, src2));
    11471145
    11481146        ++vPC;
     
    11561154           puts the result as a boolean in register dst.
    11571155        */
    1158         JSValue*& dst = r[(++vPC)->u.operand].u.jsValue;
    1159         JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;
    1160         JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;
     1156        int dst = (++vPC)->u.operand;
     1157        JSValue* src1 = r[(++vPC)->u.operand].jsValue();
     1158        JSValue* src2 = r[(++vPC)->u.operand].jsValue();
    11611159        if (JSImmediate::areBothImmediateNumbers(src1, src2))
    1162             dst = jsBoolean(reinterpret_cast<intptr_t>(src1) != reinterpret_cast<intptr_t>(src2));
     1160            r[dst] = jsBoolean(reinterpret_cast<intptr_t>(src1) != reinterpret_cast<intptr_t>(src2));
    11631161        else
    1164             dst = jsBoolean(!strictEqual(src1, src2));
     1162            r[dst] = jsBoolean(!strictEqual(src1, src2));
    11651163
    11661164        ++vPC;
     
    11741172           a boolean in register dst.
    11751173        */
    1176         JSValue*& dst = r[(++vPC)->u.operand].u.jsValue;
    1177         JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;
    1178         JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;
     1174        int dst = (++vPC)->u.operand;
     1175        JSValue* src1 = r[(++vPC)->u.operand].jsValue();
     1176        JSValue* src2 = r[(++vPC)->u.operand].jsValue();
    11791177        JSValue* result = jsBoolean(jsLess(exec, src1, src2));
    11801178        VM_CHECK_EXCEPTION();
    1181         dst = result;
     1179        r[dst] = result;
    11821180
    11831181        ++vPC;
     
    11911189           puts the result as a boolean in register dst.
    11921190        */
    1193         JSValue*& dst = r[(++vPC)->u.operand].u.jsValue;
    1194         JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;
    1195         JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;
     1191        int dst = (++vPC)->u.operand;
     1192        JSValue* src1 = r[(++vPC)->u.operand].jsValue();
     1193        JSValue* src2 = r[(++vPC)->u.operand].jsValue();
    11961194        JSValue* result = jsBoolean(jsLessEq(exec, src1, src2));
    11971195        VM_CHECK_EXCEPTION();
    1198         dst = result;
     1196        r[dst] = result;
    11991197
    12001198        ++vPC;
     
    12081206        */
    12091207        int srcDst = (++vPC)->u.operand;
    1210         JSValue* v = r[srcDst].u.jsValue;
    1211         JSValue* result;
     1208        JSValue* v = r[srcDst].jsValue();
    12121209        if (JSImmediate::canDoFastAdditiveOperations(v))
    1213             result = JSImmediate::incImmediateNumber(v);
    1214         else
    1215             result = jsNumber(exec, v->toNumber(exec) + 1);
    1216         VM_CHECK_EXCEPTION();
    1217         r[srcDst].u.jsValue = result;
     1210            r[srcDst] = JSImmediate::incImmediateNumber(v);
     1211        else {
     1212            JSValue* result = jsNumber(exec, v->toNumber(exec) + 1);
     1213            VM_CHECK_EXCEPTION();
     1214            r[srcDst] = result;
     1215        }
    12181216
    12191217        ++vPC;
     
    12271225        */
    12281226        int srcDst = (++vPC)->u.operand;
    1229         JSValue* v = r[srcDst].u.jsValue;
    1230         JSValue* result;
     1227        JSValue* v = r[srcDst].jsValue();
    12311228        if (JSImmediate::canDoFastAdditiveOperations(v))
    1232             result = JSImmediate::decImmediateNumber(v);
    1233         else
    1234             result = jsNumber(exec, v->toNumber(exec) - 1);
    1235         VM_CHECK_EXCEPTION();
    1236         r[srcDst].u.jsValue = result;
     1229            r[srcDst] = JSImmediate::decImmediateNumber(v);
     1230        else {
     1231            JSValue* result = jsNumber(exec, v->toNumber(exec) - 1);
     1232            VM_CHECK_EXCEPTION();
     1233            r[srcDst] = result;
     1234        }
    12371235
    12381236        ++vPC;
     
    12481246        int dst = (++vPC)->u.operand;
    12491247        int srcDst = (++vPC)->u.operand;
    1250         JSValue* v = r[srcDst].u.jsValue;
    1251         JSValue* result;
    1252         JSValue* number;
     1248        JSValue* v = r[srcDst].jsValue();
    12531249        if (JSImmediate::canDoFastAdditiveOperations(v)) {
    1254             number = v;
    1255             result = JSImmediate::incImmediateNumber(v);
     1250            r[dst] = v;
     1251            r[srcDst] = JSImmediate::incImmediateNumber(v);
    12561252        } else {
    1257             number = r[srcDst].u.jsValue->toJSNumber(exec);
    1258             result = jsNumber(exec, number->uncheckedGetNumber() + 1);
    1259         }
    1260         VM_CHECK_EXCEPTION();
    1261 
    1262         r[dst].u.jsValue = number;
    1263         r[srcDst].u.jsValue = result;
     1253            JSValue* number = r[srcDst].jsValue()->toJSNumber(exec);
     1254            VM_CHECK_EXCEPTION();
     1255            r[dst] = number;
     1256            r[srcDst] = jsNumber(exec, number->uncheckedGetNumber() + 1);
     1257        }
    12641258
    12651259        ++vPC;
     
    12751269        int dst = (++vPC)->u.operand;
    12761270        int srcDst = (++vPC)->u.operand;
    1277         JSValue* v = r[srcDst].u.jsValue;
    1278         JSValue* result;
    1279         JSValue* number;
     1271        JSValue* v = r[srcDst].jsValue();
    12801272        if (JSImmediate::canDoFastAdditiveOperations(v)) {
    1281             number = v;
    1282             result = JSImmediate::decImmediateNumber(v);
     1273            r[dst] = v;
     1274            r[srcDst] = JSImmediate::decImmediateNumber(v);
    12831275        } else {
    1284             number = r[srcDst].u.jsValue->toJSNumber(exec);
    1285             result = jsNumber(exec, number->uncheckedGetNumber() - 1);
    1286         }
    1287         VM_CHECK_EXCEPTION();
    1288 
    1289         r[dst].u.jsValue = number;
    1290         r[srcDst].u.jsValue = result;
     1276            JSValue* number = r[srcDst].jsValue()->toJSNumber(exec);
     1277            VM_CHECK_EXCEPTION();
     1278            r[dst] = number;
     1279            r[srcDst] = jsNumber(exec, number->uncheckedGetNumber() - 1);
     1280        }
    12911281
    12921282        ++vPC;
     
    13011291        int dst = (++vPC)->u.operand;
    13021292        int src = (++vPC)->u.operand;
    1303         JSValue* result = r[src].u.jsValue->toJSNumber(exec);
     1293        JSValue* result = r[src].jsValue()->toJSNumber(exec);
    13041294        VM_CHECK_EXCEPTION();
    13051295
    1306         r[dst].u.jsValue = result;
     1296        r[dst] = result;
    13071297
    13081298        ++vPC;
     
    13171307        int dst = (++vPC)->u.operand;
    13181308        int src = (++vPC)->u.operand;
    1319         JSValue* result = jsNumber(exec, -r[src].u.jsValue->toNumber(exec));
     1309        JSValue* result = jsNumber(exec, -r[src].jsValue()->toNumber(exec));
    13201310        VM_CHECK_EXCEPTION();
    1321         r[dst].u.jsValue = result;
     1311        r[dst] = result;
    13221312
    13231313        ++vPC;
     
    13311321           numeric add, depending on the types of the operands.)
    13321322        */
    1333         JSValue*& dst = r[(++vPC)->u.operand].u.jsValue;
    1334         JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;
    1335         JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;
    1336         JSValue* result;
     1323        int dst = (++vPC)->u.operand;
     1324        JSValue* src1 = r[(++vPC)->u.operand].jsValue();
     1325        JSValue* src2 = r[(++vPC)->u.operand].jsValue();
    13371326        if (JSImmediate::canDoFastAdditiveOperations(src1) && JSImmediate::canDoFastAdditiveOperations(src2))
    1338             result = JSImmediate::addImmediateNumbers(src1, src2);
     1327            r[dst] = JSImmediate::addImmediateNumbers(src1, src2);
    13391328        else {
    1340             result = jsAdd(exec, src1, src2);
     1329            JSValue* result = jsAdd(exec, src1, src2);
    13411330            VM_CHECK_EXCEPTION();
    1342         }
    1343         dst = result;
     1331            r[dst] = result;
     1332        }
    13441333        ++vPC;
    13451334        NEXT_OPCODE;
     
    13511340           numbers), and puts the product in register dst.
    13521341        */
    1353         JSValue*& dst = r[(++vPC)->u.operand].u.jsValue;
    1354         JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;
    1355         JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;
     1342        int dst = (++vPC)->u.operand;
     1343        JSValue* src1 = r[(++vPC)->u.operand].jsValue();
     1344        JSValue* src2 = r[(++vPC)->u.operand].jsValue();
    13561345        JSValue* result = jsNumber(exec, src1->toNumber(exec) * src2->toNumber(exec));
    13571346        VM_CHECK_EXCEPTION();
    1358         dst = result;
     1347        r[dst] = result;
    13591348
    13601349        ++vPC;
     
    13711360        int dividend = (++vPC)->u.operand;
    13721361        int divisor = (++vPC)->u.operand;
    1373         JSValue* result = jsNumber(exec, r[dividend].u.jsValue->toNumber(exec) / r[divisor].u.jsValue->toNumber(exec));
     1362        JSValue* result = jsNumber(exec, r[dividend].jsValue()->toNumber(exec) / r[divisor].jsValue()->toNumber(exec));
    13741363        VM_CHECK_EXCEPTION();
    1375         r[dst].u.jsValue = result;
     1364        r[dst] = result;
    13761365        ++vPC;
    13771366        NEXT_OPCODE;
     
    13871376        int dividend = (++vPC)->u.operand;
    13881377        int divisor = (++vPC)->u.operand;
    1389         double d = r[dividend].u.jsValue->toNumber(exec);
    1390         JSValue* result = jsNumber(exec, fmod(d, r[divisor].u.jsValue->toNumber(exec)));
     1378        double d = r[dividend].jsValue()->toNumber(exec);
     1379        JSValue* result = jsNumber(exec, fmod(d, r[divisor].jsValue()->toNumber(exec)));
    13911380        VM_CHECK_EXCEPTION();
    1392         r[dst].u.jsValue = result;
     1381        r[dst] = result;
    13931382        ++vPC;
    13941383        NEXT_OPCODE;
     
    14011390           register dst.
    14021391        */
    1403         JSValue*& dst = r[(++vPC)->u.operand].u.jsValue;
    1404         JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;
    1405         JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;
    1406         JSValue* result;
     1392        int dst = (++vPC)->u.operand;
     1393        JSValue* src1 = r[(++vPC)->u.operand].jsValue();
     1394        JSValue* src2 = r[(++vPC)->u.operand].jsValue();
    14071395        if (JSImmediate::canDoFastAdditiveOperations(src1) && JSImmediate::canDoFastAdditiveOperations(src2))
    1408             result = JSImmediate::subImmediateNumbers(src1, src2);
     1396            r[dst] = JSImmediate::subImmediateNumbers(src1, src2);
    14091397        else {
    1410             result = jsNumber(exec, src1->toNumber(exec) - src2->toNumber(exec));
     1398            JSValue* result = jsNumber(exec, src1->toNumber(exec) - src2->toNumber(exec));
    14111399            VM_CHECK_EXCEPTION();
    1412         }
    1413         dst = result;
     1400            r[dst] = result;
     1401        }
    14141402        ++vPC;
    14151403        NEXT_OPCODE;
     
    14221410           in register dst.
    14231411        */
    1424         JSValue*& dst = r[(++vPC)->u.operand].u.jsValue;
    1425         JSValue* val = r[(++vPC)->u.operand].u.jsValue;
    1426         JSValue* shift = r[(++vPC)->u.operand].u.jsValue;
    1427         JSValue* result;
     1412        int dst = (++vPC)->u.operand;
     1413        JSValue* val = r[(++vPC)->u.operand].jsValue();
     1414        JSValue* shift = r[(++vPC)->u.operand].jsValue();
    14281415        if (JSImmediate::areBothImmediateNumbers(val, shift))
    1429             result = jsNumber(exec, JSImmediate::getTruncatedInt32(val) << (JSImmediate::toTruncatedUInt32(shift) & 0x1f));
     1416            r[dst] = jsNumber(exec, JSImmediate::getTruncatedInt32(val) << (JSImmediate::toTruncatedUInt32(shift) & 0x1f));
    14301417        else {
    1431             result = jsNumber(exec, (val->toInt32(exec)) << (shift->toUInt32(exec) & 0x1f));
     1418            JSValue* result = jsNumber(exec, (val->toInt32(exec)) << (shift->toUInt32(exec) & 0x1f));
    14321419            VM_CHECK_EXCEPTION();
    1433         }
    1434         dst = result;
     1420            r[dst] = result;
     1421        }
    14351422
    14361423        ++vPC;
     
    14441431           uint32), and puts the result in register dst.
    14451432        */
    1446         JSValue*& dst = r[(++vPC)->u.operand].u.jsValue;
    1447         JSValue* val = r[(++vPC)->u.operand].u.jsValue;
    1448         JSValue* shift = r[(++vPC)->u.operand].u.jsValue;
    1449         JSValue* result;
     1433        int dst = (++vPC)->u.operand;
     1434        JSValue* val = r[(++vPC)->u.operand].jsValue();
     1435        JSValue* shift = r[(++vPC)->u.operand].jsValue();
    14501436        if (JSImmediate::areBothImmediateNumbers(val, shift))
    1451             result = JSImmediate::rightShiftImmediateNumbers(val, shift);
     1437            r[dst] = JSImmediate::rightShiftImmediateNumbers(val, shift);
    14521438        else {
    1453             result = jsNumber(exec, (val->toInt32(exec)) >> (shift->toUInt32(exec) & 0x1f));
     1439            JSValue* result = jsNumber(exec, (val->toInt32(exec)) >> (shift->toUInt32(exec) & 0x1f));
    14541440            VM_CHECK_EXCEPTION();
    1455         }
    1456         dst = result;
     1441            r[dst] = result;
     1442        }
    14571443
    14581444        ++vPC;
     
    14661452           uint32), and puts the result in register dst.
    14671453        */
    1468         JSValue*& dst = r[(++vPC)->u.operand].u.jsValue;
    1469         JSValue* val = r[(++vPC)->u.operand].u.jsValue;
    1470         JSValue* shift = r[(++vPC)->u.operand].u.jsValue;
    1471         JSValue* result;
     1454        int dst = (++vPC)->u.operand;
     1455        JSValue* val = r[(++vPC)->u.operand].jsValue();
     1456        JSValue* shift = r[(++vPC)->u.operand].jsValue();
    14721457        if (JSImmediate::areBothImmediateNumbers(val, shift) && !JSImmediate::isNegative(val))
    1473             result = JSImmediate::rightShiftImmediateNumbers(val, shift);
     1458            r[dst] = JSImmediate::rightShiftImmediateNumbers(val, shift);
    14741459        else {
    1475             result = jsNumber(exec, (val->toUInt32(exec)) >> (shift->toUInt32(exec) & 0x1f));
     1460            JSValue* result = jsNumber(exec, (val->toUInt32(exec)) >> (shift->toUInt32(exec) & 0x1f));
    14761461            VM_CHECK_EXCEPTION();
    1477         }
    1478         dst = result;
     1462            r[dst] = result;
     1463        }
    14791464
    14801465        ++vPC;
     
    14881473           in register dst.
    14891474        */
    1490         JSValue*& dst = r[(++vPC)->u.operand].u.jsValue;
    1491         JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;
    1492         JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;
    1493         JSValue* result;
     1475        int dst = (++vPC)->u.operand;
     1476        JSValue* src1 = r[(++vPC)->u.operand].jsValue();
     1477        JSValue* src2 = r[(++vPC)->u.operand].jsValue();
    14941478        if (JSImmediate::areBothImmediateNumbers(src1, src2))
    1495             result = JSImmediate::andImmediateNumbers(src1, src2);
     1479            r[dst] = JSImmediate::andImmediateNumbers(src1, src2);
    14961480        else {
    1497             result = jsNumber(exec, src1->toInt32(exec) & src2->toInt32(exec));
     1481            JSValue* result = jsNumber(exec, src1->toInt32(exec) & src2->toInt32(exec));
    14981482            VM_CHECK_EXCEPTION();
    1499         }
    1500         dst = result;
     1483            r[dst] = result;
     1484        }
    15011485
    15021486        ++vPC;
     
    15101494           in register dst.
    15111495        */
    1512         JSValue*& dst = r[(++vPC)->u.operand].u.jsValue;
    1513         JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;
    1514         JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;
    1515         JSValue* result;
     1496        int dst = (++vPC)->u.operand;
     1497        JSValue* src1 = r[(++vPC)->u.operand].jsValue();
     1498        JSValue* src2 = r[(++vPC)->u.operand].jsValue();
    15161499        if (JSImmediate::areBothImmediateNumbers(src1, src2))
    1517             result = JSImmediate::xorImmediateNumbers(src1, src2);
     1500            r[dst] = JSImmediate::xorImmediateNumbers(src1, src2);
    15181501        else {
    1519             result = jsNumber(exec, src1->toInt32(exec) ^ src2->toInt32(exec));
     1502            JSValue* result = jsNumber(exec, src1->toInt32(exec) ^ src2->toInt32(exec));
    15201503            VM_CHECK_EXCEPTION();
    1521         }
    1522         dst = result;
     1504            r[dst] = result;
     1505        }
    15231506
    15241507        ++vPC;
     
    15321515           result in register dst.
    15331516        */
    1534         JSValue*& dst = r[(++vPC)->u.operand].u.jsValue;
    1535         JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;
    1536         JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;
    1537         JSValue* result;
     1517        int dst = (++vPC)->u.operand;
     1518        JSValue* src1 = r[(++vPC)->u.operand].jsValue();
     1519        JSValue* src2 = r[(++vPC)->u.operand].jsValue();
    15381520        if (JSImmediate::areBothImmediateNumbers(src1, src2))
    1539             result = JSImmediate::orImmediateNumbers(src1, src2);
     1521            r[dst] = JSImmediate::orImmediateNumbers(src1, src2);
    15401522        else {
    1541             result = jsNumber(exec, src1->toInt32(exec) | src2->toInt32(exec));
     1523            JSValue* result = jsNumber(exec, src1->toInt32(exec) | src2->toInt32(exec));
    15421524            VM_CHECK_EXCEPTION();
    1543         }
    1544         dst = result;
     1525            r[dst] = result;
     1526        }
    15451527
    15461528        ++vPC;
     
    15551537        int dst = (++vPC)->u.operand;
    15561538        int src = (++vPC)->u.operand;
    1557         JSValue* result = jsNumber(exec, ~r[src].u.jsValue->toInt32(exec));
     1539        JSValue* result = jsNumber(exec, ~r[src].jsValue()->toInt32(exec));
    15581540        VM_CHECK_EXCEPTION();
    1559         r[dst].u.jsValue = result;
     1541        r[dst] = result;
    15601542
    15611543        ++vPC;
     
    15701552        int dst = (++vPC)->u.operand;
    15711553        int src = (++vPC)->u.operand;
    1572         JSValue* result = jsBoolean(!r[src].u.jsValue->toBoolean(exec));
     1554        JSValue* result = jsBoolean(!r[src].jsValue()->toBoolean(exec));
    15731555        VM_CHECK_EXCEPTION();
    1574         r[dst].u.jsValue = result;
     1556        r[dst] = result;
    15751557
    15761558        ++vPC;
     
    15901572        int base = (++vPC)->u.operand;
    15911573
    1592         JSValue* baseVal = r[base].u.jsValue;
     1574        JSValue* baseVal = r[base].jsValue();
    15931575
    15941576        if (isNotObject(exec, vPC, codeBlock, baseVal, exceptionValue))
     
    15961578
    15971579        JSObject* baseObj = static_cast<JSObject*>(baseVal);
    1598         r[dst].u.jsValue = jsBoolean(baseObj->implementsHasInstance() ? baseObj->hasInstance(exec, r[value].u.jsValue) : false);
     1580        r[dst] = jsBoolean(baseObj->implementsHasInstance() ? baseObj->hasInstance(exec, r[value].jsValue()) : false);
    15991581
    16001582        ++vPC;
     
    16091591        int dst = (++vPC)->u.operand;
    16101592        int src = (++vPC)->u.operand;
    1611         r[dst].u.jsValue = jsTypeStringForValue(exec, r[src].u.jsValue);
     1593        r[dst] = jsTypeStringForValue(exec, r[src].jsValue());
    16121594
    16131595        ++vPC;
     
    16271609        int base = (++vPC)->u.operand;
    16281610
    1629         JSValue* baseVal = r[base].u.jsValue;
     1611        JSValue* baseVal = r[base].jsValue();
    16301612        if (isNotObject(exec, vPC, codeBlock, baseVal, exceptionValue))
    16311613            goto vm_throw;
     
    16331615        JSObject* baseObj = static_cast<JSObject*>(baseVal);
    16341616
    1635         JSValue* propName = r[property].u.jsValue;
     1617        JSValue* propName = r[property].jsValue();
    16361618
    16371619        uint32_t i;
    16381620        if (propName->getUInt32(i))
    1639             r[dst].u.jsValue = jsBoolean(baseObj->hasProperty(exec, i));
     1621            r[dst] = jsBoolean(baseObj->hasProperty(exec, i));
    16401622        else {
    16411623            Identifier property(exec, propName->toString(exec));
    16421624            VM_CHECK_EXCEPTION();
    1643             r[dst].u.jsValue = jsBoolean(baseObj->hasProperty(exec, property));
     1625            r[dst] = jsBoolean(baseObj->hasProperty(exec, property));
    16441626        }
    16451627
     
    16941676        ASSERT((*iter)->isVariableObject());
    16951677        JSVariableObject* scope = static_cast<JSVariableObject*>(*iter);
    1696         r[dst].u.jsValue = scope->valueAt(index);
     1678        r[dst] = scope->registerAt(index);
    16971679        ++vPC;
    16981680        NEXT_OPCODE;
     
    17161698        ASSERT((*iter)->isVariableObject());
    17171699        JSVariableObject* scope = static_cast<JSVariableObject*>(*iter);
    1718         scope->valueAt(index) = r[value].u.jsValue;
     1700        scope->registerAt(index) = r[value].jsValue();
    17191701        ++vPC;
    17201702        NEXT_OPCODE;
     
    17841766
    17851767        Identifier& ident = codeBlock->identifiers[property];
    1786         JSValue *result = r[base].u.jsValue->get(exec, ident);
     1768        JSValue *result = r[base].jsValue()->get(exec, ident);
    17871769        VM_CHECK_EXCEPTION();
    1788         r[dst].u.jsValue = result;
     1770        r[dst] = result;
    17891771        ++vPC;
    17901772        NEXT_OPCODE;
     
    18041786
    18051787        Identifier& ident = codeBlock->identifiers[property];
    1806         r[base].u.jsValue->put(exec, ident, r[value].u.jsValue);
     1788        r[base].jsValue()->put(exec, ident, r[value].jsValue());
    18071789
    18081790        VM_CHECK_EXCEPTION();
     
    18221804        int property = (++vPC)->u.operand;
    18231805
    1824         JSObject* baseObj = r[base].u.jsValue->toObject(exec);
     1806        JSObject* baseObj = r[base].jsValue()->toObject(exec);
    18251807
    18261808        Identifier& ident = codeBlock->identifiers[property];
    18271809        JSValue* result = jsBoolean(baseObj->deleteProperty(exec, ident));
    18281810        VM_CHECK_EXCEPTION();
    1829         r[dst].u.jsValue = result;
     1811        r[dst] = result;
    18301812        ++vPC;
    18311813        NEXT_OPCODE;
     
    18431825        int property = (++vPC)->u.operand;
    18441826
    1845         JSValue* baseValue = r[base].u.jsValue;
    1846         JSValue* subscript = r[property].u.jsValue;
     1827        JSValue* baseValue = r[base].jsValue();
     1828        JSValue* subscript = r[property].jsValue();
    18471829
    18481830        JSValue* result;
     
    18671849
    18681850        VM_CHECK_EXCEPTION();
    1869         r[dst].u.jsValue = result;
     1851        r[dst] = result;
    18701852        ++vPC;
    18711853        NEXT_OPCODE;
     
    18861868        int value = (++vPC)->u.operand;
    18871869
    1888         JSValue* baseValue = r[base].u.jsValue;
    1889         JSValue* subscript = r[property].u.jsValue;
     1870        JSValue* baseValue = r[base].jsValue();
     1871        JSValue* subscript = r[property].jsValue();
    18901872
    18911873        unsigned i;
     
    18961878                JSArray* jsArray = static_cast<JSArray*>(baseValue);
    18971879                if (jsArray->canSetIndex(i))
    1898                     jsArray->setIndex(i, r[value].u.jsValue);
     1880                    jsArray->setIndex(i, r[value].jsValue());
    18991881                else
    1900                     jsArray->JSArray::put(exec, i, r[value].u.jsValue);
     1882                    jsArray->JSArray::put(exec, i, r[value].jsValue());
    19011883            } else
    1902                 baseValue->put(exec, i, r[value].u.jsValue);
     1884                baseValue->put(exec, i, r[value].jsValue());
    19031885        } else {
    19041886            Identifier property(exec, subscript->toString(exec));
    19051887            if (!exec->hadException()) // Don't put to an object if toString threw an exception.
    1906                 baseValue->put(exec, property, r[value].u.jsValue);
     1888                baseValue->put(exec, property, r[value].jsValue());
    19071889        }
    19081890
     
    19231905        int property = (++vPC)->u.operand;
    19241906
    1925         JSObject* baseObj = r[base].u.jsValue->toObject(exec); // may throw
    1926 
    1927         JSValue* subscript = r[property].u.jsValue;
     1907        JSObject* baseObj = r[base].jsValue()->toObject(exec); // may throw
     1908
     1909        JSValue* subscript = r[property].jsValue();
    19281910        JSValue* result;
    19291911        uint32_t i;
     
    19381920
    19391921        VM_CHECK_EXCEPTION();
    1940         r[dst].u.jsValue = result;
     1922        r[dst] = result;
    19411923        ++vPC;
    19421924        NEXT_OPCODE;
     
    19581940        int value = (++vPC)->u.operand;
    19591941
    1960         r[base].u.jsObject->put(exec, property, r[value].u.jsValue);
     1942        r[base].jsValue()->put(exec, property, r[value].jsValue());
    19611943
    19621944        ++vPC;
     
    20051987        int cond = (++vPC)->u.operand;
    20061988        int target = (++vPC)->u.operand;
    2007         if (r[cond].u.jsValue->toBoolean(exec)) {
     1989        if (r[cond].jsValue()->toBoolean(exec)) {
    20081990            vPC += target;
    20091991            CHECK_FOR_TIMEOUT();
     
    20222004        int cond = (++vPC)->u.operand;
    20232005        int target = (++vPC)->u.operand;
    2024         if (r[cond].u.jsValue->toBoolean(exec)) {
     2006        if (r[cond].jsValue()->toBoolean(exec)) {
    20252007            vPC += target;
    20262008            NEXT_OPCODE;
     
    20382020        int cond = (++vPC)->u.operand;
    20392021        int target = (++vPC)->u.operand;
    2040         if (!r[cond].u.jsValue->toBoolean(exec)) {
     2022        if (!r[cond].jsValue()->toBoolean(exec)) {
    20412023            vPC += target;
    20422024            NEXT_OPCODE;
     
    20572039           the JS timeout is reached.
    20582040         */
    2059         JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;
    2060         JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;
     2041        JSValue* src1 = r[(++vPC)->u.operand].jsValue();
     2042        JSValue* src2 = r[(++vPC)->u.operand].jsValue();
    20612043        int target = (++vPC)->u.operand;
    20622044       
     
    20812063           result of the comparison is true.
    20822064        */
    2083         JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;
    2084         JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;
     2065        JSValue* src1 = r[(++vPC)->u.operand].jsValue();
     2066        JSValue* src2 = r[(++vPC)->u.operand].jsValue();
    20852067        int target = (++vPC)->u.operand;
    20862068
     
    21042086           result of the comparison is false.
    21052087        */
    2106         JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;
    2107         JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;
     2088        JSValue* src1 = r[(++vPC)->u.operand].jsValue();
     2089        JSValue* src2 = r[(++vPC)->u.operand].jsValue();
    21082090        int target = (++vPC)->u.operand;
    21092091
     
    21302112        int func = (++vPC)->u.operand;
    21312113
    2132         r[dst].u.jsValue = codeBlock->functions[func]->makeFunction(exec, scopeChain);
     2114        r[dst] = codeBlock->functions[func]->makeFunction(exec, scopeChain);
    21332115
    21342116        ++vPC;
     
    21462128        int func = (++vPC)->u.operand;
    21472129
    2148         r[dst].u.jsValue = codeBlock->functionExpressions[func]->makeFunction(exec, scopeChain);
     2130        r[dst] = codeBlock->functionExpressions[func]->makeFunction(exec, scopeChain);
    21492131
    21502132        ++vPC;
     
    21692151        int argCount = (++vPC)->u.operand;
    21702152
    2171         JSValue* funcVal = r[func].u.jsValue;
    2172         JSValue* baseVal = r[thisVal].u.jsValue;
     2153        JSValue* funcVal = r[func].jsValue();
     2154        JSValue* baseVal = r[thisVal].jsValue();
    21732155
    21742156        if (baseVal == scopeChain->globalObject() && funcVal == scopeChain->globalObject()->evalFunction()) {
    2175             JSObject* thisObject = r[codeBlock->thisRegister].u.jsObject;
     2157            JSObject* thisObject = static_cast<JSObject*>(r[codeBlock->thisRegister].jsValue());
    21762158            JSValue* result = callEval(exec, thisObject, scopeChain, registerFile, r, firstArg, argCount, exceptionValue);
    21772159            if (exceptionValue)
    21782160                goto vm_throw;
    21792161
    2180             r[dst].u.jsValue = result;
     2162            r[dst] = result;
    21812163
    21822164            ++vPC;
     
    21882170        // value.
    21892171        vPC -= 5;
    2190         r[thisVal].u.jsValue = baseVal->toThisObject(exec);
     2172        r[thisVal] = baseVal->toThisObject(exec);
    21912173
    21922174#if HAVE(COMPUTED_GOTO)
     
    22412223        int argCount = (++vPC)->u.operand;
    22422224
    2243         JSValue* v = r[func].u.jsValue;
     2225        JSValue* v = r[func].jsValue();
    22442226
    22452227        CallData callData;
     
    22542236            CodeBlock* newCodeBlock = &functionBodyNode->code(callDataScopeChain);
    22552237
    2256             r[firstArg].u.jsValue = thisVal == missingThisObjectMarker() ? exec->globalThisValue() : r[thisVal].u.jsValue;
     2238            r[firstArg] = thisVal == missingThisObjectMarker() ? exec->globalThisValue() : r[thisVal].jsValue();
    22572239
    22582240            Register* callFrame = r + firstArg - RegisterFile::CallFrameHeaderSize;
     
    22802262                (*enabledProfilerReference)->willExecute(exec, static_cast<JSObject*>(v));
    22812263
    2282             JSValue* thisValue = thisVal == missingThisObjectMarker() ? exec->globalThisValue() : r[thisVal].u.jsValue;
    2283             ArgList args(reinterpret_cast<JSValue**>(r) + firstArg + 1, argCount - 1);
     2264            JSValue* thisValue = thisVal == missingThisObjectMarker() ? exec->globalThisValue() : r[thisVal].jsValue();
     2265            ArgList args(r + firstArg + 1, argCount - 1);
    22842266
    22852267            JSValue* returnValue = callData.native.function(exec, static_cast<JSObject*>(v), thisValue, args);
    22862268            VM_CHECK_EXCEPTION();
    22872269
    2288             r[dst].u.jsValue = returnValue;
     2270            r[dst] = returnValue;
    22892271
    22902272            if (*enabledProfilerReference)
     
    23132295
    23142296        Register* callFrame = r - codeBlock->numLocals - RegisterFile::CallFrameHeaderSize;
    2315         if (JSActivation* activation = static_cast<JSActivation*>(callFrame[RegisterFile::OptionalCalleeActivation].u.jsValue)) {
     2297        if (JSActivation* activation = static_cast<JSActivation*>(callFrame[RegisterFile::OptionalCalleeActivation].jsValue())) {
    23162298            ASSERT(!codeBlock->needsFullScopeChain || scopeChain->object == activation);
    23172299            ASSERT(activation->isActivationObject());
     
    23202302
    23212303        if (*enabledProfilerReference)
    2322             (*enabledProfilerReference)->didExecute(exec, callFrame[RegisterFile::Callee].u.jsObject);
     2304            (*enabledProfilerReference)->didExecute(exec, static_cast<JSObject*>(callFrame[RegisterFile::Callee].jsValue()));
    23232305
    23242306        if (codeBlock->needsFullScopeChain)
    23252307            scopeChain->deref();
    23262308
    2327         JSValue* returnValue = r[result].u.jsValue;
    2328         if (callFrame[RegisterFile::CalledAsConstructor].u.i && !returnValue->isObject()) {
    2329             JSValue* thisObject = callFrame[RegisterFile::CallFrameHeaderSize].u.jsValue;
     2309        JSValue* returnValue = r[result].jsValue();
     2310        if (callFrame[RegisterFile::CalledAsConstructor].i() && !returnValue->isObject()) {
     2311            JSValue* thisObject = callFrame[RegisterFile::CallFrameHeaderSize].jsValue();
    23302312            returnValue = thisObject;
    23312313        }
    23322314
    2333         codeBlock = callFrame[RegisterFile::CallerCodeBlock].u.codeBlock;
     2315        codeBlock = callFrame[RegisterFile::CallerCodeBlock].codeBlock();
    23342316        if (!codeBlock)
    23352317            return returnValue;
    23362318
    23372319        k = codeBlock->jsValues.data();
    2338         vPC = callFrame[RegisterFile::ReturnVPC].u.vPC;
    2339         setScopeChain(exec, scopeChain, callFrame[RegisterFile::CallerScopeChain].u.scopeChain);
    2340         r = callFrame[RegisterFile::CallerRegisters].u.r;
     2320        vPC = callFrame[RegisterFile::ReturnVPC].vPC();
     2321        setScopeChain(exec, scopeChain, callFrame[RegisterFile::CallerScopeChain].scopeChain());
     2322        r = callFrame[RegisterFile::CallerRegisters].r();
    23412323        exec->m_callFrame = r - codeBlock->numLocals - RegisterFile::CallFrameHeaderSize;
    2342         int dst = callFrame[RegisterFile::ReturnValueRegister].u.i;
    2343         r[dst].u.jsValue = returnValue;
     2324        int dst = callFrame[RegisterFile::ReturnValueRegister].i();
     2325        r[dst] = returnValue;
    23442326
    23452327        NEXT_OPCODE;
     
    23612343        int argCount = (++vPC)->u.operand;
    23622344
    2363         JSValue* constrVal = r[constr].u.jsValue;
     2345        JSValue* constrVal = r[constr].jsValue();
    23642346
    23652347        ConstructData constructData;
     
    23852367            CodeBlock* newCodeBlock = &functionBodyNode->code(callDataScopeChain);
    23862368
    2387             r[firstArg].u.jsValue = newObject; // "this" value
     2369            r[firstArg] = newObject; // "this" value
    23882370
    23892371            Register* callFrame = r + firstArg - RegisterFile::CallFrameHeaderSize;
     
    24072389                (*enabledProfilerReference)->willExecute(exec, constructor);
    24082390
    2409             ArgList args(reinterpret_cast<JSValue**>(r) + firstArg + 1, argCount - 1);
     2391            ArgList args(r + firstArg + 1, argCount - 1);
    24102392            JSValue* returnValue = constructData.native.function(exec, constructor, args);
    24112393
    24122394            VM_CHECK_EXCEPTION();
    2413             r[dst].u.jsValue = returnValue;
     2395            r[dst] = returnValue;
    24142396
    24152397            if (*enabledProfilerReference)
     
    24322414        */
    24332415        int scope = (++vPC)->u.operand;
    2434         JSValue* v = r[scope].u.jsValue;
     2416        JSValue* v = r[scope].jsValue();
    24352417        JSObject* o = v->toObject(exec);
    24362418        VM_CHECK_EXCEPTION();
     
    24622444        int base = (++vPC)->u.operand;
    24632445
    2464         r[dst].u.jsPropertyNameIterator = JSPropertyNameIterator::create(exec, r[base].u.jsValue);
     2446        r[dst] = JSPropertyNameIterator::create(exec, r[base].jsValue());
    24652447        ++vPC;
    24662448        NEXT_OPCODE;
     
    24792461        int target = (++vPC)->u.operand;
    24802462
    2481         JSPropertyNameIterator* it = r[iter].u.jsPropertyNameIterator;
     2463        JSPropertyNameIterator* it = r[iter].jsPropertyNameIterator();
    24822464        if (JSValue* temp = it->next(exec)) {
    24832465            CHECK_FOR_TIMEOUT();
    2484             r[dst].u.jsValue = temp;
     2466            r[dst] = temp;
    24852467            vPC += target;
    24862468            NEXT_OPCODE;
     
    25192501        ASSERT(!exec->hadException());
    25202502        int ex = (++vPC)->u.operand;
    2521         r[ex].u.jsValue = exceptionValue;
     2503        r[ex] = exceptionValue;
    25222504        exceptionValue = 0;
    25232505
     
    25372519
    25382520        int ex = (++vPC)->u.operand;
    2539         exceptionValue = r[ex].u.jsValue;
     2521        exceptionValue = r[ex].jsValue();
    25402522        handlerVPC = throwException(exec, exceptionValue, vPC, codeBlock, k, scopeChain, r);
    25412523        if (!handlerVPC) {
     
    25682550        int message = (++vPC)->u.operand;
    25692551
    2570         r[dst].u.jsValue = Error::create(exec, (ErrorType)type, k[message]->toString(exec), codeBlock->lineNumberForVPC(vPC), codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->sourceURL());
     2552        r[dst] = Error::create(exec, (ErrorType)type, k[message]->toString(exec), codeBlock->lineNumberForVPC(vPC), codeBlock->ownerNode->sourceId(), codeBlock->ownerNode->sourceURL());
    25712553
    25722554        ++vPC;
     
    25852567        }
    25862568        int result = (++vPC)->u.operand;
    2587         return r[result].u.jsValue;
     2569        return r[result].jsValue();
    25882570    }
    25892571    BEGIN_OPCODE(op_put_getter) {
     
    26022584        int function = (++vPC)->u.operand;
    26032585
    2604         ASSERT(r[base].u.jsValue->isObject());
    2605         JSObject* baseObj = static_cast<JSObject*>(r[base].u.jsValue);
     2586        ASSERT(r[base].jsValue()->isObject());
     2587        JSObject* baseObj = static_cast<JSObject*>(r[base].jsValue());
    26062588        Identifier& ident = codeBlock->identifiers[property];
    2607         ASSERT(r[function].u.jsValue->isObject());
    2608         baseObj->defineGetter(exec, ident, static_cast<JSObject* >(r[function].u.jsValue));
     2589        ASSERT(r[function].jsValue()->isObject());
     2590        baseObj->defineGetter(exec, ident, static_cast<JSObject*>(r[function].jsValue()));
    26092591
    26102592        ++vPC;
     
    26262608        int function = (++vPC)->u.operand;
    26272609
    2628         ASSERT(r[base].u.jsValue->isObject());
    2629         JSObject* baseObj = static_cast<JSObject*>(r[base].u.jsValue);
     2610        ASSERT(r[base].jsValue()->isObject());
     2611        JSObject* baseObj = static_cast<JSObject*>(r[base].jsValue());
    26302612        Identifier& ident = codeBlock->identifiers[property];
    2631         ASSERT(r[function].u.jsValue->isObject());
    2632         baseObj->defineSetter(exec, ident, static_cast<JSObject* >(r[function].u.jsValue));
     2613        ASSERT(r[function].jsValue()->isObject());
     2614        baseObj->defineSetter(exec, ident, static_cast<JSObject*>(r[function].jsValue()));
    26332615
    26342616        ++vPC;
     
    26432625        int retAddrDst = (++vPC)->u.operand;
    26442626        int target = (++vPC)->u.operand;
    2645         r[retAddrDst].u.vPC = vPC + 1;
     2627        r[retAddrDst] = vPC + 1;
    26462628
    26472629        vPC += target;
     
    26562638        */
    26572639        int retAddrSrc = (++vPC)->u.operand;
    2658         vPC = r[retAddrSrc].u.vPC;
     2640        vPC = r[retAddrSrc].vPC();
    26592641        NEXT_OPCODE;
    26602642    }
     
    26982680        return jsNull();
    26992681
    2700     JSActivation* activation = static_cast<JSActivation*>(callFrame[RegisterFile::OptionalCalleeActivation].u.jsValue);
     2682    JSActivation* activation = static_cast<JSActivation*>(callFrame[RegisterFile::OptionalCalleeActivation].jsValue());
    27012683    if (!activation) {
    27022684        CodeBlock* codeBlock = &function->m_body->generatedCode();
    27032685        activation = new (exec) JSActivation(function->m_body, callFrame + RegisterFile::CallFrameHeaderSize + codeBlock->numLocals);
    2704         callFrame[RegisterFile::OptionalCalleeActivation].u.jsValue = activation;
     2686        callFrame[RegisterFile::OptionalCalleeActivation] = activation;
    27052687    }
    27062688
     
    27142696        return jsNull();
    27152697
    2716     CodeBlock* callerCodeBlock = callFrame[RegisterFile::CallerCodeBlock].u.codeBlock;
     2698    CodeBlock* callerCodeBlock = callFrame[RegisterFile::CallerCodeBlock].codeBlock();
    27172699    if (!callerCodeBlock)
    27182700        return jsNull();
    27192701
    2720     Register* callerCallFrame = callFrame[RegisterFile::CallerRegisters].u.r - callerCodeBlock->numLocals - RegisterFile::CallFrameHeaderSize;
    2721     if (JSValue* caller = callerCallFrame[RegisterFile::Callee].u.jsValue)
     2702    Register* callerCallFrame = callFrame[RegisterFile::CallerRegisters].r() - callerCodeBlock->numLocals - RegisterFile::CallFrameHeaderSize;
     2703    if (JSValue* caller = callerCallFrame[RegisterFile::Callee].jsValue())
    27222704        return caller;
    27232705
     
    27372719        }
    27382720
    2739         if (callFrame[RegisterFile::Callee].u.jsValue == function)
     2721        if (callFrame[RegisterFile::Callee].jsValue() == function)
    27402722            return callFrame;
    27412723
    2742         CodeBlock* callerCodeBlock = callFrame[RegisterFile::CallerCodeBlock].u.codeBlock;
     2724        CodeBlock* callerCodeBlock = callFrame[RegisterFile::CallerCodeBlock].codeBlock();
    27432725        if (!callerCodeBlock) {
    27442726            callFrame = 0;
     
    27462728        }
    27472729       
    2748         callFrame = callFrame[RegisterFile::CallerRegisters].u.r - callerCodeBlock->numLocals - RegisterFile::CallFrameHeaderSize;
     2730        callFrame = callFrame[RegisterFile::CallerRegisters].r() - callerCodeBlock->numLocals - RegisterFile::CallFrameHeaderSize;
    27492731    }
    27502732}
     
    27522734void Machine::getArgumentsData(Register* callFrame, JSFunction*& function, Register*& argv, int& argc)
    27532735{
    2754     function = static_cast<JSFunction*>(callFrame[RegisterFile::Callee].u.jsValue);
     2736    function = static_cast<JSFunction*>(callFrame[RegisterFile::Callee].jsValue());
    27552737    ASSERT(function->inherits(&JSFunction::info));
    27562738
    2757     argv = callFrame[RegisterFile::CallerRegisters].u.r + callFrame[RegisterFile::ArgumentStartRegister].u.i + 1; //  + 1 to skip "this"
    2758     argc = callFrame[RegisterFile::ArgumentCount].u.i - 1; // - 1 to skip "this"
     2739    argv = callFrame[RegisterFile::CallerRegisters].r() + callFrame[RegisterFile::ArgumentStartRegister].i() + 1; //  + 1 to skip "this"
     2740    argc = callFrame[RegisterFile::ArgumentCount].i() - 1; // - 1 to skip "this"
    27592741}
    27602742
  • trunk/JavaScriptCore/VM/Machine.h

    r35021 r35203  
    124124        enum ExecutionFlag { Normal, InitializeAndReturn };
    125125
    126         friend NEVER_INLINE JSValue* callEval(ExecState* exec, JSObject* thisObj, ScopeChainNode* scopeChain, RegisterFile*, Register* r, int argv, int argc, JSValue*& exceptionValue);
     126        NEVER_INLINE JSValue* callEval(ExecState* exec, JSObject* thisObj, ScopeChainNode* scopeChain, RegisterFile*, Register* r, int argv, int argc, JSValue*& exceptionValue);
    127127        JSValue* execute(EvalNode*, ExecState*, JSObject* thisObj, int registerOffset, ScopeChainNode*, JSValue** exception);
     128
     129        ALWAYS_INLINE void initializeCallFrame(Register* callFrame, CodeBlock*, Instruction*, ScopeChainNode*, Register* r, int returnValueRegister, int argv, int argc, int calledAsConstructor, JSValue* function);
    128130
    129131        ALWAYS_INLINE void setScopeChain(ExecState* exec, ScopeChainNode*&, ScopeChainNode*);
  • trunk/JavaScriptCore/VM/Register.h

    r34578 r35203  
    3030#define Register_h
    3131
     32#include "JSValue.h"
    3233#include <wtf/VectorTraits.h>
    3334
     
    3536
    3637    class CodeBlock;
     38    class ExecState;
    3739    class JSFunction;
    38     class JSObject;
    3940    class JSPropertyNameIterator;
    4041    class JSValue;
     
    4243    struct Instruction;
    4344
    44     struct Register {
     45    class Register {
     46    public:
     47        Register();
     48        Register(JSValue*);
     49
     50        JSValue* jsValue() const;
     51
     52        bool marked() const;
     53        void mark();
     54       
     55        uint32_t toUInt32(ExecState*) const;
     56        UString toString(ExecState*) const;
     57
     58    private:
     59        friend class Machine;
     60
     61        // Only the Machine should use these functions.
     62
     63        Register(CodeBlock*);
     64        Register(ScopeChainNode*);
     65        Register(int);
     66        Register(Register*);
     67        Register(Instruction*);
     68        Register(JSPropertyNameIterator*);
     69
     70        CodeBlock* codeBlock() const;
     71        ScopeChainNode* scopeChain() const;
     72        int i() const;
     73        Register* r() const;
     74        Instruction* vPC() const;
     75        JSPropertyNameIterator* jsPropertyNameIterator() const;
     76
    4577        union {
     78        private:
     79            friend class Register;
     80
    4681            CodeBlock* codeBlock;
    4782            Instruction* vPC;
    4883            JSValue* jsValue;
    49             JSObject* jsObject;
    5084            ScopeChainNode* scopeChain;
    5185            JSPropertyNameIterator* jsPropertyNameIterator;
     
    5387            int i;
    5488        } u;
     89
     90#ifndef NDEBUG
     91        enum {
     92            CodeBlockType = 0,
     93            InstructionType,
     94            JSValueType,
     95            ScopeChainNodeType,
     96            JSPropertyNameIteratorType,
     97            RegisterType,
     98            intType
     99        } m_type;
     100#endif
    55101    };
    56102
     103    ALWAYS_INLINE Register::Register()
     104    {
     105#ifndef NDEBUG
     106        *this = 0;
     107#endif
     108    }
     109
     110    ALWAYS_INLINE Register::Register(JSValue* v)
     111    {
     112#ifndef NDEBUG
     113        m_type = JSValueType;
     114#endif
     115        u.jsValue = v;
     116    }
     117   
     118    ALWAYS_INLINE Register::Register(CodeBlock* codeBlock)
     119    {
     120#ifndef NDEBUG
     121        m_type = CodeBlockType;
     122#endif
     123        u.codeBlock = codeBlock;
     124    }
     125
     126    ALWAYS_INLINE Register::Register(Instruction* vPC)
     127    {
     128#ifndef NDEBUG
     129        m_type = InstructionType;
     130#endif
     131        u.vPC = vPC;
     132    }
     133
     134    ALWAYS_INLINE Register::Register(ScopeChainNode* scopeChain)
     135    {
     136#ifndef NDEBUG
     137        m_type = ScopeChainNodeType;
     138#endif
     139        u.scopeChain = scopeChain;
     140    }
     141
     142    ALWAYS_INLINE Register::Register(JSPropertyNameIterator* jsPropertyNameIterator)
     143    {
     144#ifndef NDEBUG
     145        m_type = JSPropertyNameIteratorType;
     146#endif
     147        u.jsPropertyNameIterator = jsPropertyNameIterator;
     148    }
     149
     150    ALWAYS_INLINE Register::Register(Register* r)
     151    {
     152#ifndef NDEBUG
     153        m_type = RegisterType;
     154#endif
     155        u.r = r;
     156    }
     157
     158    ALWAYS_INLINE Register::Register(int i)
     159    {
     160#ifndef NDEBUG
     161        m_type = intType;
     162#endif
     163        u.i = i;
     164    }
     165
     166    ALWAYS_INLINE JSValue* Register::jsValue() const
     167    {
     168        ASSERT(m_type == JSValueType || !i());
     169        return u.jsValue;
     170    }
     171   
     172    ALWAYS_INLINE CodeBlock* Register::codeBlock() const
     173    {
     174        ASSERT(m_type == CodeBlockType);
     175        return u.codeBlock;
     176    }
     177   
     178    ALWAYS_INLINE ScopeChainNode* Register::scopeChain() const
     179    {
     180        ASSERT(m_type == ScopeChainNodeType);
     181        return u.scopeChain;
     182    }
     183   
     184    ALWAYS_INLINE int Register::i() const
     185    {
     186        ASSERT(m_type == intType);
     187        return u.i;
     188    }
     189   
     190    ALWAYS_INLINE Register* Register::r() const
     191    {
     192        ASSERT(m_type == RegisterType);
     193        return u.r;
     194    }
     195   
     196    ALWAYS_INLINE Instruction* Register::vPC() const
     197    {
     198        ASSERT(m_type == InstructionType);
     199        return u.vPC;
     200    }
     201   
     202    ALWAYS_INLINE JSPropertyNameIterator* Register::jsPropertyNameIterator() const
     203    {
     204        ASSERT(m_type == JSPropertyNameIteratorType);
     205        return u.jsPropertyNameIterator;
     206    }
     207   
     208    ALWAYS_INLINE bool Register::marked() const
     209    {
     210        return jsValue()->marked();
     211    }
     212
     213    ALWAYS_INLINE void Register::mark()
     214    {
     215        jsValue()->mark();
     216    }
     217   
     218    ALWAYS_INLINE uint32_t Register::toUInt32(ExecState* exec) const
     219    {
     220        return jsValue()->toUInt32(exec);
     221    }
     222
     223    ALWAYS_INLINE UString Register::toString(ExecState* exec) const
     224    {
     225        return jsValue()->toString(exec);
     226    }
     227
    57228} // namespace KJS
    58229
  • trunk/JavaScriptCore/kjs/ArgList.cpp

    r35021 r35203  
    4646
    4747        iterator end2 = list->end();
    48         for (iterator it2 = list->begin(); it2 != end2; ++it2) {
    49             JSValue* v = *it2;
    50             if (!v->marked())
    51                 v->mark();
    52         }
     48        for (iterator it2 = list->begin(); it2 != end2; ++it2)
     49            if (!(*it2).marked())
     50                (*it2).mark();
    5351    }
    5452}
  • trunk/JavaScriptCore/kjs/ArgList.h

    r35021 r35203  
    2424
    2525#include "JSImmediate.h"
     26#include "Register.h"
     27
    2628#include <wtf/HashSet.h>
    2729#include <wtf/Noncopyable.h>
     
    3537    private:
    3638        static const unsigned inlineCapacity = 8;
    37         typedef Vector<JSValue*, inlineCapacity> VectorType;
     39        typedef Vector<Register, inlineCapacity> VectorType;
    3840        typedef HashSet<ArgList*> ListSet;
    3941
     
    5557
    5658        // Constructor for a read-only list whose data has already been allocated elsewhere.
    57         ArgList(JSValue** buffer, size_t size)
     59        ArgList(Register* buffer, size_t size)
    5860            : m_buffer(buffer)
    5961            , m_size(size)
     
    7779        {
    7880            if (i < m_size)
    79                 return m_buffer[i];
     81                return m_buffer[i].jsValue();
    8082            return jsUndefined();
    8183        }
     
    118120        void slowAppend(JSValue*);
    119121       
    120         JSValue** m_buffer;
     122        Register* m_buffer;
    121123        size_t m_size;
    122124
  • trunk/JavaScriptCore/kjs/Arguments.cpp

    r35022 r35203  
    4949        Identifier name = Identifier::from(exec, i);
    5050        if (!m_indexToNameMap.isMapped(name))
    51             putDirect(name, *it, DontEnum);
     51            putDirect(name, (*it).jsValue(), DontEnum);
    5252    }
    5353}
  • trunk/JavaScriptCore/kjs/ArrayPrototype.cpp

    r35022 r35203  
    275275        if (it == end)
    276276            break;
    277         curArg = *it;
     277        curArg = (*it).jsValue();
    278278        ++it;
    279279    }
  • trunk/JavaScriptCore/kjs/DebuggerCallFrame.cpp

    r34906 r35203  
    4747        return 0;
    4848
    49     JSFunction* function = static_cast<JSFunction*>(callFrame()[RegisterFile::Callee].u.jsValue);
     49    JSFunction* function = static_cast<JSFunction*>(callFrame()[RegisterFile::Callee].jsValue());
    5050    if (!function)
    5151        return 0;
     
    5555DebuggerCallFrame::Type DebuggerCallFrame::type() const
    5656{
    57     if (callFrame()[RegisterFile::Callee].u.jsObject)
     57    if (callFrame()[RegisterFile::Callee].jsValue())
    5858        return FunctionType;
    5959
     
    6666        return 0;
    6767
    68     return static_cast<JSObject*>(m_registers[m_codeBlock->thisRegister].u.jsValue);
     68    return static_cast<JSObject*>(m_registers[m_codeBlock->thisRegister].jsValue());
    6969}
    7070
  • trunk/JavaScriptCore/kjs/IndexToNameMap.cpp

    r35022 r35203  
    4545    , m_map(new Identifier[args.size()])
    4646{
    47     unsigned i = 0;
    48     ArgList::const_iterator end = args.end();
    49     for (ArgList::const_iterator it = args.begin(); it != end; ++i, ++it)
     47    size_t size = args.size();
     48    for (size_t i = 0; i < size; ++i)
    5049        m_map[i] = func->getParameterName(i); // null if there is no corresponding parameter
    5150}
  • trunk/JavaScriptCore/kjs/JSActivation.cpp

    r35027 r35203  
    164164    exec->machine()->getArgumentsData(callFrame, function, argv, argc);
    165165
    166     ArgList args(reinterpret_cast<JSValue**>(argv), argc);
     166    ArgList args(argv, argc);
    167167    return new (exec) Arguments(exec, function, args, this);
    168168}
  • trunk/JavaScriptCore/kjs/JSArray.cpp

    r35022 r35203  
    104104    ArgList::const_iterator end = list.end();
    105105    for (ArgList::const_iterator it = list.begin(); it != end; ++it, ++i)
    106         storage->m_vector[i] = *it;
     106        storage->m_vector[i] = (*it).jsValue();
    107107
    108108    m_storage = storage;
  • trunk/JavaScriptCore/kjs/JSGlobalObject.h

    r35184 r35203  
    269269            SymbolTableEntry newEntry(index, global.attributes);
    270270            symbolTable().add(global.identifier.ustring().rep(), newEntry);
    271             valueAt(index) = global.value;
     271            registerAt(index) = global.value;
    272272        }
    273273    }
  • trunk/JavaScriptCore/kjs/JSString.h

    r35027 r35203  
    2626
    2727#include "CommonIdentifiers.h"
     28#include "ExecState.h"
    2829#include "JSCell.h"
    2930#include "PropertySlot.h"
  • trunk/JavaScriptCore/kjs/JSValue.h

    r35027 r35203  
    2626#include "CallData.h"
    2727#include "ConstructData.h"
    28 #include "ExecState.h"
    2928#include "JSImmediate.h"
    3029#include "ustring.h"
     
    112111        // These are identical logic to above, and faster than jsNumber(number)->toInt32(exec)
    113112        static int32_t toInt32(double);
    114         static int32_t toUInt32(double);
     113        static uint32_t toUInt32(double);
    115114
    116115        // Floating point conversions.
     
    219218    }
    220219
    221     inline int32_t JSValue::toUInt32(double val)
     220    inline uint32_t JSValue::toUInt32(double val)
    222221    {
    223222        if (!(val >= 0.0 && val < 4294967296.0)) {
  • trunk/JavaScriptCore/kjs/JSVariableObject.cpp

    r34946 r35203  
    7272   
    7373    Register* end = d->registerArray.get() + d->registerArraySize;
    74     for (Register* it = d->registerArray.get(); it != end; ++it) {
    75         JSValue* v = (*it).u.jsValue;
    76         if (!v->marked())
    77             v->mark();
    78     }
     74    for (Register* it = d->registerArray.get(); it != end; ++it)
     75        if (!(*it).marked())
     76            (*it).mark();
    7977}
    8078
  • trunk/JavaScriptCore/kjs/JSVariableObject.h

    r35027 r35203  
    5656        virtual bool getPropertyAttributes(ExecState*, const Identifier& propertyName, unsigned& attributes) const;
    5757
    58         JSValue*& valueAt(int index) const { return d->registers[index].u.jsValue; }
     58        Register& registerAt(int index) const { return d->registers[index]; }
    5959
    6060    protected:
     
    107107        SymbolTableEntry entry = symbolTable().inlineGet(propertyName.ustring().rep());
    108108        if (!entry.isNull()) {
    109             slot.setValueSlot(&valueAt(entry.getIndex()));
     109            slot.setRegisterSlot(&registerAt(entry.getIndex()));
    110110            return true;
    111111        }
     
    117117        SymbolTableEntry entry = symbolTable().inlineGet(propertyName.ustring().rep());
    118118        if (!entry.isNull()) {
    119             slot.setValueSlot(&valueAt(entry.getIndex()));
     119            slot.setRegisterSlot(&registerAt(entry.getIndex()));
    120120            slotIsWriteable = !entry.isReadOnly();
    121121            return true;
     
    131131        if (entry.isReadOnly())
    132132            return true;
    133         valueAt(entry.getIndex()) = value;
     133        registerAt(entry.getIndex()) = value;
    134134        return true;
    135135    }
     
    143143        ASSERT(!entry.isNull());
    144144        entry.setAttributes(attributes);
    145         valueAt(entry.getIndex()) = value;
     145        registerAt(entry.getIndex()) = value;
    146146        return true;
    147147    }
  • trunk/JavaScriptCore/kjs/PropertySlot.h

    r35027 r35203  
    2222#define PropertySlot_h
    2323
     24#include "Register.h"
    2425#include "JSValue.h"
    2526#include "identifier.h"
     
    3334
    3435#define KJS_VALUE_SLOT_MARKER 0
    35 #define KJS_NUMERIC_PROPERTY_NAME_SLOT_MARKER reinterpret_cast<GetValueFunc>(1)
     36#define KJS_REGISTER_SLOT_MARKER reinterpret_cast<GetValueFunc>(1)
     37#define KJS_NUMERIC_PROPERTY_NAME_SLOT_MARKER reinterpret_cast<GetValueFunc>(2)
    3638
    3739    class PropertySlot {
     
    5456            if (m_getValue == KJS_VALUE_SLOT_MARKER)
    5557                return *m_data.valueSlot;
     58            if (m_getValue == KJS_REGISTER_SLOT_MARKER)
     59                return (*m_data.registerSlot).jsValue();
    5660            ASSERT(m_getValue != KJS_NUMERIC_PROPERTY_NAME_SLOT_MARKER);
    5761            return m_getValue(exec, propertyName, *this);
     
    6468            if (m_getValue == KJS_NUMERIC_PROPERTY_NAME_SLOT_MARKER)
    6569                return m_data.numericFunc(exec, propertyName, *this);
     70            if (m_getValue == KJS_REGISTER_SLOT_MARKER)
     71                return (*m_data.registerSlot).jsValue();
    6672            return m_getValue(exec, Identifier::from(exec, propertyName), *this);
    6773        }
     
    6975        void putValue(JSValue* value)
    7076        {
    71             ASSERT(m_getValue == KJS_VALUE_SLOT_MARKER);
    72             *m_data.valueSlot = value;
     77            if (m_getValue == KJS_VALUE_SLOT_MARKER) {
     78                *m_data.valueSlot = value;
     79                return;
     80            }
     81            ASSERT(m_getValue == KJS_REGISTER_SLOT_MARKER);
     82            *m_data.registerSlot = value;
    7383        }
    74        
     84
    7585        void setValueSlot(JSValue** valueSlot)
    7686        {
     
    7989            clearBase();
    8090            m_data.valueSlot = valueSlot;
     91        }
     92       
     93        void setRegisterSlot(Register* registerSlot)
     94        {
     95            ASSERT(registerSlot);
     96            m_getValue = KJS_REGISTER_SLOT_MARKER;
     97            clearBase();
     98            m_data.registerSlot = registerSlot;
    8199        }
    82100
     
    163181            JSObject* getterFunc;
    164182            JSValue** valueSlot;
     183            Register* registerSlot;
    165184            const HashEntry* staticEntry;
    166185            unsigned index;
  • trunk/JavaScriptCore/kjs/StringConstructor.cpp

    r35199 r35203  
    3737        ArgList::const_iterator end = args.end();
    3838        for (ArgList::const_iterator it = args.begin(); it != end; ++it)
    39             *p++ = static_cast<UChar>((*it)->toUInt32(exec));
     39            *p++ = static_cast<UChar>((*it).toUInt32(exec));
    4040        s = UString::adopt(buf, args.size());
    4141    } else
  • trunk/JavaScriptCore/kjs/StringPrototype.cpp

    r35199 r35203  
    351351    ArgList::const_iterator end = args.end();
    352352    for (ArgList::const_iterator it = args.begin(); it != end; ++it)
    353         s += (*it)->toString(exec);
     353        s += (*it).toString(exec);
    354354    return jsString(exec, s);
    355355}
  • trunk/WebCore/ChangeLog

    r35190 r35203  
     12008-07-16  Geoffrey Garen  <ggaren@apple.com>
     2
     3        Reviewed by Oliver Hunt.
     4
     5        Support for JavaScriptCore's first step toward putting doubles in
     6        registers: Treat ArgList iterators as Register*'s, not JSValue*'s.
     7
     8        * bindings/js/ScheduledAction.cpp:
     9        (WebCore::ScheduledAction::ScheduledAction):
     10
    1112008-07-15  Maxime Britto  <britto@apple.com>
    212
  • trunk/WebCore/bindings/js/ScheduledAction.cpp

    r34947 r35203  
    4343    ArgList::const_iterator end = args.end();
    4444    for (ArgList::const_iterator it = args.begin(); it != end; ++it)
    45         m_args.append(*it);
     45        m_args.append((*it).jsValue());
    4646}
    4747
Note: See TracChangeset for help on using the changeset viewer.