Changeset 34659 in webkit for trunk/JavaScriptCore/VM/Machine.cpp


Ignore:
Timestamp:
Jun 19, 2008, 10:29:29 AM (17 years ago)
Author:
[email protected]
Message:

Reviewed by Darin.

Prepare JavaScript heap for being per-thread.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/VM/Machine.cpp

    r34607 r34659  
    132132        if (value.isNull())
    133133            return throwOutOfMemoryError(exec);
    134         return jsString(value);
    135     }
    136 
    137     return jsNumber(p1->toNumber(exec) + p2->toNumber(exec));
     134        return jsString(exec, value);
     135    }
     136
     137    return jsNumber(exec, p1->toNumber(exec) + p2->toNumber(exec));
    138138}
    139139
     
    154154
    155155    if (bothTypes == ((NumberType << 3) | NumberType))
    156         return jsNumber(v1->uncheckedGetNumber() + v2->uncheckedGetNumber());
     156        return jsNumber(exec, v1->uncheckedGetNumber() + v2->uncheckedGetNumber());
    157157    if (bothTypes == ((StringType << 3) | StringType)) {
    158158        UString value = static_cast<JSString*>(v1)->value() + static_cast<JSString*>(v2)->value();
    159159        if (value.isNull())
    160160            return throwOutOfMemoryError(exec);
    161         return jsString(value);
     161        return jsString(exec, value);
    162162    }
    163163
     
    166166}
    167167
    168 static JSValue* jsTypeStringForValue(JSValue* v)
     168static JSValue* jsTypeStringForValue(ExecState* exec, JSValue* v)
    169169{
    170170    switch (v->type()) {
    171171        case UndefinedType:
    172             return jsString("undefined");
     172            return jsString(exec, "undefined");
    173173        case NullType:
    174             return jsString("object");
     174            return jsString(exec, "object");
    175175        case BooleanType:
    176             return jsString("boolean");
     176            return jsString(exec, "boolean");
    177177        case NumberType:
    178             return jsString("number");
     178            return jsString(exec, "number");
    179179        case StringType:
    180             return jsString("string");
     180            return jsString(exec, "string");
    181181        default:
    182182            if (v->isObject()) {
     
    184184                // as null when doing comparisons.
    185185                if (static_cast<JSObject*>(v)->masqueradeAsUndefined())
    186                     return jsString("undefined");
     186                    return jsString(exec, "undefined");
    187187                else if (static_cast<JSObject*>(v)->implementsCall())
    188                     return jsString("function");
     188                    return jsString(exec, "function");
    189189            }
    190190
    191             return jsString("object");
     191            return jsString(exec, "object");
    192192    }
    193193}
     
    413413}
    414414
    415 ALWAYS_INLINE ScopeChainNode* scopeChainForCall(FunctionBodyNode* functionBodyNode, CodeBlock* newCodeBlock, ScopeChainNode* callDataScopeChain, Register** registerBase, Register* r)
     415ALWAYS_INLINE ScopeChainNode* scopeChainForCall(ExecState* exec, FunctionBodyNode* functionBodyNode, CodeBlock* newCodeBlock, ScopeChainNode* callDataScopeChain, Register** registerBase, Register* r)
    416416{
    417417    if (newCodeBlock->needsFullScopeChain) {
    418         JSActivation* activation = new JSActivation(functionBodyNode, registerBase, r - (*registerBase));
     418        JSActivation* activation = new (exec) JSActivation(functionBodyNode, registerBase, r - (*registerBase));
    419419        r[Machine::OptionalCalleeActivation - Machine::CallFrameHeaderSize - newCodeBlock->numLocals].u.jsValue = activation;
    420420
     
    611611        JSObject* exception = static_cast<JSObject*>(exceptionValue);
    612612        if (!exception->hasProperty(exec, Identifier(exec, "line")) && !exception->hasProperty(exec, Identifier(exec, "sourceURL"))) {
    613             exception->put(exec, Identifier(exec, "line"), jsNumber(codeBlock->lineNumberForVPC(vPC)));
    614             exception->put(exec, Identifier(exec, "sourceURL"), jsOwnedString(codeBlock->ownerNode->sourceURL()));
     613            exception->put(exec, Identifier(exec, "line"), jsNumber(exec, codeBlock->lineNumberForVPC(vPC)));
     614            exception->put(exec, Identifier(exec, "sourceURL"), jsOwnedString(exec, codeBlock->ownerNode->sourceURL()));
    615615        }
    616616    }
     
    726726    }
    727727
    728     scopeChain = scopeChainForCall(functionBodyNode, newCodeBlock, scopeChain, registerBase, r);
     728    scopeChain = scopeChainForCall(exec, functionBodyNode, newCodeBlock, scopeChain, registerBase, r);
    729729
    730730    ExecState newExec(exec, this, registerFile, scopeChain, callFrameOffset);
     
    971971        int dst = (++vPC)->u.operand;
    972972        int regExp = (++vPC)->u.operand;
    973         r[dst].u.jsValue = new RegExpObject(scopeChain->globalObject()->regExpPrototype(), codeBlock->regexps[regExp]);
     973        r[dst].u.jsValue = new (exec) RegExpObject(scopeChain->globalObject()->regExpPrototype(), codeBlock->regexps[regExp]);
    974974
    975975        ++vPC;
     
    11141114            result = JSImmediate::incImmediateNumber(v);
    11151115        else
    1116             result = jsNumber(v->toNumber(exec) + 1);
     1116            result = jsNumber(exec, v->toNumber(exec) + 1);
    11171117        VM_CHECK_EXCEPTION();
    11181118        r[srcDst].u.jsValue = result;
     
    11331133            result = JSImmediate::decImmediateNumber(v);
    11341134        else
    1135             result = jsNumber(v->toNumber(exec) - 1);
     1135            result = jsNumber(exec, v->toNumber(exec) - 1);
    11361136        VM_CHECK_EXCEPTION();
    11371137        r[srcDst].u.jsValue = result;
     
    11571157        } else {
    11581158            number = r[srcDst].u.jsValue->toJSNumber(exec);
    1159             result = jsNumber(number->uncheckedGetNumber() + 1);
     1159            result = jsNumber(exec, number->uncheckedGetNumber() + 1);
    11601160        }
    11611161        VM_CHECK_EXCEPTION();
     
    11841184        } else {
    11851185            number = r[srcDst].u.jsValue->toJSNumber(exec);
    1186             result = jsNumber(number->uncheckedGetNumber() - 1);
     1186            result = jsNumber(exec, number->uncheckedGetNumber() - 1);
    11871187        }
    11881188        VM_CHECK_EXCEPTION();
     
    12181218        int dst = (++vPC)->u.operand;
    12191219        int src = (++vPC)->u.operand;
    1220         JSValue* result = jsNumber(-r[src].u.jsValue->toNumber(exec));
     1220        JSValue* result = jsNumber(exec, -r[src].u.jsValue->toNumber(exec));
    12211221        VM_CHECK_EXCEPTION();
    12221222        r[dst].u.jsValue = result;
     
    12551255        JSValue* src1 = r[(++vPC)->u.operand].u.jsValue;
    12561256        JSValue* src2 = r[(++vPC)->u.operand].u.jsValue;
    1257         JSValue* result = jsNumber(src1->toNumber(exec) * src2->toNumber(exec));
     1257        JSValue* result = jsNumber(exec, src1->toNumber(exec) * src2->toNumber(exec));
    12581258        VM_CHECK_EXCEPTION();
    12591259        dst = result;
     
    12721272        int dividend = (++vPC)->u.operand;
    12731273        int divisor = (++vPC)->u.operand;
    1274         JSValue* result = jsNumber(r[dividend].u.jsValue->toNumber(exec) / r[divisor].u.jsValue->toNumber(exec));
     1274        JSValue* result = jsNumber(exec, r[dividend].u.jsValue->toNumber(exec) / r[divisor].u.jsValue->toNumber(exec));
    12751275        VM_CHECK_EXCEPTION();
    12761276        r[dst].u.jsValue = result;
     
    12891289        int divisor = (++vPC)->u.operand;
    12901290        double d = r[dividend].u.jsValue->toNumber(exec);
    1291         JSValue* result = jsNumber(fmod(d, r[divisor].u.jsValue->toNumber(exec)));
     1291        JSValue* result = jsNumber(exec, fmod(d, r[divisor].u.jsValue->toNumber(exec)));
    12921292        VM_CHECK_EXCEPTION();
    12931293        r[dst].u.jsValue = result;
     
    13091309            result = JSImmediate::subImmediateNumbers(src1, src2);
    13101310        else {
    1311             result = jsNumber(src1->toNumber(exec) - src2->toNumber(exec));
     1311            result = jsNumber(exec, src1->toNumber(exec) - src2->toNumber(exec));
    13121312            VM_CHECK_EXCEPTION();
    13131313        }
     
    13281328        JSValue* result;
    13291329        if (JSImmediate::areBothImmediateNumbers(val, shift))
    1330             result = jsNumber(JSImmediate::getTruncatedInt32(val) << (JSImmediate::toTruncatedUInt32(shift) & 0x1f));
     1330            result = jsNumber(exec, JSImmediate::getTruncatedInt32(val) << (JSImmediate::toTruncatedUInt32(shift) & 0x1f));
    13311331        else {
    1332             result = jsNumber((val->toInt32(exec)) << (shift->toUInt32(exec) & 0x1f));
     1332            result = jsNumber(exec, (val->toInt32(exec)) << (shift->toUInt32(exec) & 0x1f));
    13331333            VM_CHECK_EXCEPTION();
    13341334        }
     
    13521352            result = JSImmediate::rightShiftImmediateNumbers(val, shift);
    13531353        else {
    1354             result = jsNumber((val->toInt32(exec)) >> (shift->toUInt32(exec) & 0x1f));
     1354            result = jsNumber(exec, (val->toInt32(exec)) >> (shift->toUInt32(exec) & 0x1f));
    13551355            VM_CHECK_EXCEPTION();
    13561356        }
     
    13741374            result = JSImmediate::rightShiftImmediateNumbers(val, shift);
    13751375        else {
    1376             result = jsNumber((val->toUInt32(exec)) >> (shift->toUInt32(exec) & 0x1f));
     1376            result = jsNumber(exec, (val->toUInt32(exec)) >> (shift->toUInt32(exec) & 0x1f));
    13771377            VM_CHECK_EXCEPTION();
    13781378        }
     
    13961396            result = JSImmediate::andImmediateNumbers(src1, src2);
    13971397        else {
    1398             result = jsNumber(src1->toInt32(exec) & src2->toInt32(exec));
     1398            result = jsNumber(exec, src1->toInt32(exec) & src2->toInt32(exec));
    13991399            VM_CHECK_EXCEPTION();
    14001400        }
     
    14181418            result = JSImmediate::xorImmediateNumbers(src1, src2);
    14191419        else {
    1420             result = jsNumber(src1->toInt32(exec) ^ src2->toInt32(exec));
     1420            result = jsNumber(exec, src1->toInt32(exec) ^ src2->toInt32(exec));
    14211421            VM_CHECK_EXCEPTION();
    14221422        }
     
    14401440            result = JSImmediate::orImmediateNumbers(src1, src2);
    14411441        else {
    1442             result = jsNumber(src1->toInt32(exec) | src2->toInt32(exec));
     1442            result = jsNumber(exec, src1->toInt32(exec) | src2->toInt32(exec));
    14431443            VM_CHECK_EXCEPTION();
    14441444        }
     
    14561456        int dst = (++vPC)->u.operand;
    14571457        int src = (++vPC)->u.operand;
    1458         JSValue* result = jsNumber(~r[src].u.jsValue->toInt32(exec));
     1458        JSValue* result = jsNumber(exec, ~r[src].u.jsValue->toInt32(exec));
    14591459        VM_CHECK_EXCEPTION();
    14601460        r[dst].u.jsValue = result;
     
    15101510        int dst = (++vPC)->u.operand;
    15111511        int src = (++vPC)->u.operand;
    1512         r[dst].u.jsValue = jsTypeStringForValue(r[src].u.jsValue);
     1512        r[dst].u.jsValue = jsTypeStringForValue(exec, r[src].u.jsValue);
    15131513
    15141514        ++vPC;
     
    20962096            codeBlock = newCodeBlock;
    20972097            exec->m_callFrameOffset = callFrameOffset;
    2098             setScopeChain(exec, scopeChain, scopeChainForCall(functionBodyNode, codeBlock, callDataScopeChain, registerBase, r));
     2098            setScopeChain(exec, scopeChain, scopeChainForCall(exec, functionBodyNode, codeBlock, callDataScopeChain, registerBase, r));
    20992099            k = codeBlock->jsValues.data();
    21002100            vPC = codeBlock->instructions.begin();
     
    22242224            else
    22252225                prototype = scopeChain->globalObject()->objectPrototype();
    2226             JSObject* newObject = new JSObject(prototype);
     2226            JSObject* newObject = new (exec) JSObject(prototype);
    22272227            r[firstArg].u.jsValue = newObject; // "this" value
    22282228
     
    22392239            codeBlock = newCodeBlock;
    22402240            exec->m_callFrameOffset = callFrameOffset;
    2241             setScopeChain(exec, scopeChain, scopeChainForCall(functionBodyNode, codeBlock, callDataScopeChain, registerBase, r));
     2241            setScopeChain(exec, scopeChain, scopeChainForCall(exec, functionBodyNode, codeBlock, callDataScopeChain, registerBase, r));
    22422242            k = codeBlock->jsValues.data();
    22432243            vPC = codeBlock->instructions.begin();
     
    25512551    if (!activation) {
    25522552        CodeBlock* codeBlock = &function->body->generatedCode();
    2553         activation = new JSActivation(function->body, registerBase, callFrameOffset + CallFrameHeaderSize + codeBlock->numLocals);
     2553        activation = new (exec) JSActivation(function->body, registerBase, callFrameOffset + CallFrameHeaderSize + codeBlock->numLocals);
    25542554        callFrame[OptionalCalleeActivation].u.jsValue = activation;
    25552555    }
Note: See TracChangeset for help on using the changeset viewer.