diff options
Diffstat (limited to 'Source/JavaScriptCore/runtime/Arguments.h')
-rw-r--r-- | Source/JavaScriptCore/runtime/Arguments.h | 62 |
1 files changed, 32 insertions, 30 deletions
diff --git a/Source/JavaScriptCore/runtime/Arguments.h b/Source/JavaScriptCore/runtime/Arguments.h index 658538b..007e0f1 100644 --- a/Source/JavaScriptCore/runtime/Arguments.h +++ b/Source/JavaScriptCore/runtime/Arguments.h @@ -29,7 +29,6 @@ #include "JSGlobalObject.h" #include "Interpreter.h" #include "ObjectConstructor.h" -#include "PrototypeFunction.h" namespace JSC { @@ -43,12 +42,12 @@ namespace JSC { ptrdiff_t firstParameterIndex; unsigned numArguments; - Register* registers; - OwnArrayPtr<Register> registerArray; + WriteBarrier<Unknown>* registers; + OwnArrayPtr<WriteBarrier<Unknown> > registerArray; - Register* extraArguments; + WriteBarrier<Unknown>* extraArguments; OwnArrayPtr<bool> deletedArguments; - Register extraArgumentsFixedBuffer[4]; + WriteBarrier<Unknown> extraArgumentsFixedBuffer[4]; WriteBarrier<JSFunction> callee; bool overrodeLength : 1; @@ -58,7 +57,7 @@ namespace JSC { }; - class Arguments : public JSObject { + class Arguments : public JSNonFinalObject { public: // Use an enum because otherwise gcc insists on doing a memory // read. @@ -70,7 +69,7 @@ namespace JSC { Arguments(CallFrame*, NoParametersType); virtual ~Arguments(); - static const ClassInfo info; + static const ClassInfo s_info; virtual void markChildren(MarkStack&); @@ -84,17 +83,18 @@ namespace JSC { } void copyToRegisters(ExecState* exec, Register* buffer, uint32_t maxSize); - void copyRegisters(); + void copyRegisters(JSGlobalData&); bool isTornOff() const { return d->registerArray; } void setActivation(JSGlobalData& globalData, JSActivation* activation) { + ASSERT(!d->registerArray); d->activation.set(globalData, this, activation); d->registers = &activation->registerAt(0); } static PassRefPtr<Structure> createStructure(JSValue prototype) { - return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount); + return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount, &s_info); } protected: @@ -113,8 +113,6 @@ namespace JSC { void createStrictModeCallerIfNecessary(ExecState*); void createStrictModeCalleeIfNecessary(ExecState*); - virtual const ClassInfo* classInfo() const { return &info; } - void init(CallFrame*); OwnPtr<ArgumentsData> d; @@ -124,7 +122,7 @@ namespace JSC { inline Arguments* asArguments(JSValue value) { - ASSERT(asObject(value)->inherits(&Arguments::info)); + ASSERT(asObject(value)->inherits(&Arguments::s_info)); return static_cast<Arguments*>(asObject(value)); } @@ -145,9 +143,11 @@ namespace JSC { } inline Arguments::Arguments(CallFrame* callFrame) - : JSObject(callFrame->lexicalGlobalObject()->argumentsStructure()) + : JSNonFinalObject(callFrame->lexicalGlobalObject()->argumentsStructure()) , d(adoptPtr(new ArgumentsData)) { + ASSERT(inherits(&s_info)); + JSFunction* callee; ptrdiff_t firstParameterIndex; Register* argv; @@ -158,19 +158,19 @@ namespace JSC { d->firstParameterIndex = firstParameterIndex; d->numArguments = numArguments; - d->registers = callFrame->registers(); + d->registers = reinterpret_cast<WriteBarrier<Unknown>*>(callFrame->registers()); - Register* extraArguments; + WriteBarrier<Unknown>* extraArguments; if (d->numArguments <= d->numParameters) extraArguments = 0; else { unsigned numExtraArguments = d->numArguments - d->numParameters; - if (numExtraArguments > sizeof(d->extraArgumentsFixedBuffer) / sizeof(Register)) - extraArguments = new Register[numExtraArguments]; + if (numExtraArguments > sizeof(d->extraArgumentsFixedBuffer) / sizeof(WriteBarrier<Unknown>)) + extraArguments = new WriteBarrier<Unknown>[numExtraArguments]; else extraArguments = d->extraArgumentsFixedBuffer; for (unsigned i = 0; i < numExtraArguments; ++i) - extraArguments[i] = argv[d->numParameters + i]; + extraArguments[i].set(callFrame->globalData(), this, argv[d->numParameters + i].jsValue()); } d->extraArguments = extraArguments; @@ -181,13 +181,14 @@ namespace JSC { d->overrodeCaller = false; d->isStrictMode = callFrame->codeBlock()->isStrictMode(); if (d->isStrictMode) - copyRegisters(); + copyRegisters(callFrame->globalData()); } inline Arguments::Arguments(CallFrame* callFrame, NoParametersType) - : JSObject(callFrame->lexicalGlobalObject()->argumentsStructure()) + : JSNonFinalObject(callFrame->lexicalGlobalObject()->argumentsStructure()) , d(adoptPtr(new ArgumentsData)) { + ASSERT(inherits(&s_info)); ASSERT(!asFunction(callFrame->callee())->jsExecutable()->parameterCount()); unsigned numArguments = callFrame->argumentCount(); @@ -195,15 +196,15 @@ namespace JSC { d->numParameters = 0; d->numArguments = numArguments; - Register* extraArguments; + WriteBarrier<Unknown>* extraArguments; if (numArguments > sizeof(d->extraArgumentsFixedBuffer) / sizeof(Register)) - extraArguments = new Register[numArguments]; + extraArguments = new WriteBarrier<Unknown>[numArguments]; else extraArguments = d->extraArgumentsFixedBuffer; Register* argv = callFrame->registers() - RegisterFile::CallFrameHeaderSize - numArguments - 1; for (unsigned i = 0; i < numArguments; ++i) - extraArguments[i] = argv[i]; + extraArguments[i].set(callFrame->globalData(), this, argv[i].jsValue()); d->extraArguments = extraArguments; @@ -213,10 +214,10 @@ namespace JSC { d->overrodeCaller = false; d->isStrictMode = callFrame->codeBlock()->isStrictMode(); if (d->isStrictMode) - copyRegisters(); + copyRegisters(callFrame->globalData()); } - inline void Arguments::copyRegisters() + inline void Arguments::copyRegisters(JSGlobalData& globalData) { ASSERT(!isTornOff()); @@ -226,14 +227,15 @@ namespace JSC { int registerOffset = d->numParameters + RegisterFile::CallFrameHeaderSize; size_t registerArraySize = d->numParameters; - OwnArrayPtr<Register> registerArray = adoptArrayPtr(new Register[registerArraySize]); - memcpy(registerArray.get(), d->registers - registerOffset, registerArraySize * sizeof(Register)); + OwnArrayPtr<WriteBarrier<Unknown> > registerArray = adoptArrayPtr(new WriteBarrier<Unknown>[registerArraySize]); + for (size_t i = 0; i < registerArraySize; i++) + registerArray[i].set(globalData, this, d->registers[i - registerOffset].get()); d->registers = registerArray.get() + registerOffset; d->registerArray = registerArray.release(); } // This JSActivation function is defined here so it can get at Arguments::setRegisters. - inline void JSActivation::copyRegisters() + inline void JSActivation::copyRegisters(JSGlobalData& globalData) { ASSERT(!d()->registerArray); @@ -247,8 +249,8 @@ namespace JSC { int registerOffset = numParametersMinusThis + RegisterFile::CallFrameHeaderSize; size_t registerArraySize = numLocals + RegisterFile::CallFrameHeaderSize; - OwnArrayPtr<Register> registerArray = copyRegisterArray(d()->registers - registerOffset, registerArraySize); - Register* registers = registerArray.get() + registerOffset; + OwnArrayPtr<WriteBarrier<Unknown> > registerArray = copyRegisterArray(globalData, d()->registers - registerOffset, registerArraySize); + WriteBarrier<Unknown>* registers = registerArray.get() + registerOffset; setRegisters(registers, registerArray.release()); } |