X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/14957cd040308e3eeec43d26bae5d76da13fcd85..a253471d7f8e4d91bf6ebabab00155c3b387d3d0:/runtime/Arguments.cpp diff --git a/runtime/Arguments.cpp b/runtime/Arguments.cpp index ec6cc8f..9a3d725 100644 --- a/runtime/Arguments.cpp +++ b/runtime/Arguments.cpp @@ -35,67 +35,42 @@ namespace JSC { ASSERT_CLASS_FITS_IN_CELL(Arguments); -const ClassInfo Arguments::s_info = { "Arguments", &JSNonFinalObject::s_info, 0, 0 }; +const ClassInfo Arguments::s_info = { "Arguments", &JSNonFinalObject::s_info, 0, 0, CREATE_METHOD_TABLE(Arguments) }; -Arguments::~Arguments() +void Arguments::visitChildren(JSCell* cell, SlotVisitor& visitor) { - if (d->extraArguments != d->extraArgumentsFixedBuffer) - delete [] d->extraArguments; + Arguments* thisObject = jsCast(cell); + ASSERT_GC_OBJECT_INHERITS(thisObject, &s_info); + COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); + ASSERT(thisObject->structure()->typeInfo().overridesVisitChildren()); + JSObject::visitChildren(thisObject, visitor); + + if (thisObject->d->registerArray) + visitor.appendValues(thisObject->d->registerArray.get(), thisObject->d->numArguments); + visitor.append(&thisObject->d->callee); + if (thisObject->d->activation) + visitor.append(&thisObject->d->activation); } -void Arguments::visitChildren(SlotVisitor& visitor) +void Arguments::destroy(JSCell* cell) { - ASSERT_GC_OBJECT_INHERITS(this, &s_info); - COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); - ASSERT(structure()->typeInfo().overridesVisitChildren()); - JSObject::visitChildren(visitor); - - if (d->registerArray) - visitor.appendValues(d->registerArray.get(), d->numParameters); - - if (d->extraArguments) { - unsigned numExtraArguments = d->numArguments - d->numParameters; - visitor.appendValues(d->extraArguments, numExtraArguments); - } - - visitor.append(&d->callee); - - if (d->activation) - visitor.append(&d->activation); + jsCast(cell)->Arguments::~Arguments(); } -void Arguments::copyToRegisters(ExecState* exec, Register* buffer, uint32_t maxSize) +void Arguments::copyToArguments(ExecState* exec, CallFrame* callFrame, uint32_t length) { if (UNLIKELY(d->overrodeLength)) { - unsigned length = min(get(exec, exec->propertyNames().length).toUInt32(exec), maxSize); + length = min(get(exec, exec->propertyNames().length).toUInt32(exec), length); for (unsigned i = 0; i < length; i++) - buffer[i] = get(exec, i); + callFrame->setArgument(i, get(exec, i)); return; } - - if (LIKELY(!d->deletedArguments)) { - unsigned parametersLength = min(min(d->numParameters, d->numArguments), maxSize); - unsigned i = 0; - for (; i < parametersLength; ++i) - buffer[i] = d->registers[d->firstParameterIndex + i].get(); - for (; i < d->numArguments; ++i) - buffer[i] = d->extraArguments[i - d->numParameters].get(); - return; - } - - unsigned parametersLength = min(min(d->numParameters, d->numArguments), maxSize); - unsigned i = 0; - for (; i < parametersLength; ++i) { - if (!d->deletedArguments[i]) - buffer[i] = d->registers[d->firstParameterIndex + i].get(); + ASSERT(length == this->length(exec)); + for (size_t i = 0; i < length; ++i) { + if (!d->deletedArguments || !d->deletedArguments[i]) + callFrame->setArgument(i, argument(i).get()); else - buffer[i] = get(exec, i); - } - for (; i < d->numArguments; ++i) { - if (!d->deletedArguments[i]) - buffer[i] = d->extraArguments[i - d->numParameters].get(); - else - buffer[i] = get(exec, i); + callFrame->setArgument(i, get(exec, i)); } } @@ -107,54 +82,24 @@ void Arguments::fillArgList(ExecState* exec, MarkedArgumentBuffer& args) args.append(get(exec, i)); return; } - - if (LIKELY(!d->deletedArguments)) { - if (LIKELY(!d->numParameters)) { - args.initialize(d->extraArguments, d->numArguments); - return; - } - - if (d->numParameters == d->numArguments) { - args.initialize(&d->registers[d->firstParameterIndex], d->numArguments); - return; - } - - unsigned parametersLength = min(d->numParameters, d->numArguments); - unsigned i = 0; - for (; i < parametersLength; ++i) - args.append(d->registers[d->firstParameterIndex + i].get()); - for (; i < d->numArguments; ++i) - args.append(d->extraArguments[i - d->numParameters].get()); - return; - } - - unsigned parametersLength = min(d->numParameters, d->numArguments); - unsigned i = 0; - for (; i < parametersLength; ++i) { - if (!d->deletedArguments[i]) - args.append(d->registers[d->firstParameterIndex + i].get()); - else - args.append(get(exec, i)); - } - for (; i < d->numArguments; ++i) { - if (!d->deletedArguments[i]) - args.append(d->extraArguments[i - d->numParameters].get()); + uint32_t length = this->length(exec); + for (size_t i = 0; i < length; ++i) { + if (!d->deletedArguments || !d->deletedArguments[i]) + args.append(argument(i).get()); else args.append(get(exec, i)); } } -bool Arguments::getOwnPropertySlot(ExecState* exec, unsigned i, PropertySlot& slot) +bool Arguments::getOwnPropertySlotByIndex(JSCell* cell, ExecState* exec, unsigned i, PropertySlot& slot) { - if (i < d->numArguments && (!d->deletedArguments || !d->deletedArguments[i])) { - if (i < d->numParameters) { - slot.setValue(d->registers[d->firstParameterIndex + i].get()); - } else - slot.setValue(d->extraArguments[i - d->numParameters].get()); + Arguments* thisObject = jsCast(cell); + if (i < thisObject->d->numArguments && (!thisObject->d->deletedArguments || !thisObject->d->deletedArguments[i])) { + slot.setValue(thisObject->argument(i).get()); return true; } - return JSObject::getOwnPropertySlot(exec, Identifier(exec, UString::number(i)), slot); + return JSObject::getOwnPropertySlot(thisObject, exec, Identifier(exec, UString::number(i)), slot); } void Arguments::createStrictModeCallerIfNecessary(ExecState* exec) @@ -164,9 +109,8 @@ void Arguments::createStrictModeCallerIfNecessary(ExecState* exec) d->overrodeCaller = true; PropertyDescriptor descriptor; - JSValue thrower = createTypeErrorFunction(exec, "Unable to access caller of strict mode function"); - descriptor.setAccessorDescriptor(thrower, thrower, DontEnum | DontDelete | Getter | Setter); - defineOwnProperty(exec, exec->propertyNames().caller, descriptor, false); + descriptor.setAccessorDescriptor(globalObject()->throwTypeErrorGetterSetter(exec), DontEnum | DontDelete | Accessor); + methodTable()->defineOwnProperty(this, exec, exec->propertyNames().caller, descriptor, false); } void Arguments::createStrictModeCalleeIfNecessary(ExecState* exec) @@ -176,181 +120,292 @@ void Arguments::createStrictModeCalleeIfNecessary(ExecState* exec) d->overrodeCallee = true; PropertyDescriptor descriptor; - JSValue thrower = createTypeErrorFunction(exec, "Unable to access callee of strict mode function"); - descriptor.setAccessorDescriptor(thrower, thrower, DontEnum | DontDelete | Getter | Setter); - defineOwnProperty(exec, exec->propertyNames().callee, descriptor, false); + descriptor.setAccessorDescriptor(globalObject()->throwTypeErrorGetterSetter(exec), DontEnum | DontDelete | Accessor); + methodTable()->defineOwnProperty(this, exec, exec->propertyNames().callee, descriptor, false); } -bool Arguments::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) +bool Arguments::getOwnPropertySlot(JSCell* cell, ExecState* exec, const Identifier& propertyName, PropertySlot& slot) { + Arguments* thisObject = jsCast(cell); bool isArrayIndex; unsigned i = propertyName.toArrayIndex(isArrayIndex); - if (isArrayIndex && i < d->numArguments && (!d->deletedArguments || !d->deletedArguments[i])) { - if (i < d->numParameters) { - slot.setValue(d->registers[d->firstParameterIndex + i].get()); - } else - slot.setValue(d->extraArguments[i - d->numParameters].get()); + if (isArrayIndex && i < thisObject->d->numArguments && (!thisObject->d->deletedArguments || !thisObject->d->deletedArguments[i])) { + slot.setValue(thisObject->argument(i).get()); return true; } - if (propertyName == exec->propertyNames().length && LIKELY(!d->overrodeLength)) { - slot.setValue(jsNumber(d->numArguments)); + if (propertyName == exec->propertyNames().length && LIKELY(!thisObject->d->overrodeLength)) { + slot.setValue(jsNumber(thisObject->d->numArguments)); return true; } - if (propertyName == exec->propertyNames().callee && LIKELY(!d->overrodeCallee)) { - if (!d->isStrictMode) { - slot.setValue(d->callee.get()); + if (propertyName == exec->propertyNames().callee && LIKELY(!thisObject->d->overrodeCallee)) { + if (!thisObject->d->isStrictMode) { + slot.setValue(thisObject->d->callee.get()); return true; } - createStrictModeCalleeIfNecessary(exec); + thisObject->createStrictModeCalleeIfNecessary(exec); } - if (propertyName == exec->propertyNames().caller && d->isStrictMode) - createStrictModeCallerIfNecessary(exec); + if (propertyName == exec->propertyNames().caller && thisObject->d->isStrictMode) + thisObject->createStrictModeCallerIfNecessary(exec); - return JSObject::getOwnPropertySlot(exec, propertyName, slot); + return JSObject::getOwnPropertySlot(thisObject, exec, propertyName, slot); } -bool Arguments::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor) +bool Arguments::getOwnPropertyDescriptor(JSObject* object, ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor) { + Arguments* thisObject = jsCast(object); bool isArrayIndex; unsigned i = propertyName.toArrayIndex(isArrayIndex); - if (isArrayIndex && i < d->numArguments && (!d->deletedArguments || !d->deletedArguments[i])) { - if (i < d->numParameters) { - descriptor.setDescriptor(d->registers[d->firstParameterIndex + i].get(), DontEnum); - } else - descriptor.setDescriptor(d->extraArguments[i - d->numParameters].get(), DontEnum); + if (isArrayIndex && i < thisObject->d->numArguments && (!thisObject->d->deletedArguments || !thisObject->d->deletedArguments[i])) { + descriptor.setDescriptor(thisObject->argument(i).get(), None); return true; } - if (propertyName == exec->propertyNames().length && LIKELY(!d->overrodeLength)) { - descriptor.setDescriptor(jsNumber(d->numArguments), DontEnum); + if (propertyName == exec->propertyNames().length && LIKELY(!thisObject->d->overrodeLength)) { + descriptor.setDescriptor(jsNumber(thisObject->d->numArguments), DontEnum); return true; } - if (propertyName == exec->propertyNames().callee && LIKELY(!d->overrodeCallee)) { - if (!d->isStrictMode) { - descriptor.setDescriptor(d->callee.get(), DontEnum); + if (propertyName == exec->propertyNames().callee && LIKELY(!thisObject->d->overrodeCallee)) { + if (!thisObject->d->isStrictMode) { + descriptor.setDescriptor(thisObject->d->callee.get(), DontEnum); return true; } - createStrictModeCalleeIfNecessary(exec); + thisObject->createStrictModeCalleeIfNecessary(exec); } - if (propertyName == exec->propertyNames().caller && d->isStrictMode) - createStrictModeCallerIfNecessary(exec); + if (propertyName == exec->propertyNames().caller && thisObject->d->isStrictMode) + thisObject->createStrictModeCallerIfNecessary(exec); - return JSObject::getOwnPropertyDescriptor(exec, propertyName, descriptor); + return JSObject::getOwnPropertyDescriptor(thisObject, exec, propertyName, descriptor); } -void Arguments::getOwnPropertyNames(ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode) +void Arguments::getOwnPropertyNames(JSObject* object, ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode) { + Arguments* thisObject = jsCast(object); + for (unsigned i = 0; i < thisObject->d->numArguments; ++i) { + if (!thisObject->d->deletedArguments || !thisObject->d->deletedArguments[i]) + propertyNames.add(Identifier(exec, UString::number(i))); + } if (mode == IncludeDontEnumProperties) { - for (unsigned i = 0; i < d->numArguments; ++i) { - if (!d->deletedArguments || !d->deletedArguments[i]) - propertyNames.add(Identifier(exec, UString::number(i))); - } propertyNames.add(exec->propertyNames().callee); propertyNames.add(exec->propertyNames().length); } - JSObject::getOwnPropertyNames(exec, propertyNames, mode); + JSObject::getOwnPropertyNames(thisObject, exec, propertyNames, mode); } -void Arguments::put(ExecState* exec, unsigned i, JSValue value) +void Arguments::putByIndex(JSCell* cell, ExecState* exec, unsigned i, JSValue value, bool shouldThrow) { - if (i < d->numArguments && (!d->deletedArguments || !d->deletedArguments[i])) { - if (i < d->numParameters) - d->registers[d->firstParameterIndex + i].set(exec->globalData(), d->activation ? static_cast(d->activation.get()) : static_cast(this), value); - else - d->extraArguments[i - d->numParameters].set(exec->globalData(), this, value); + Arguments* thisObject = jsCast(cell); + if (i < static_cast(thisObject->d->numArguments) && (!thisObject->d->deletedArguments || !thisObject->d->deletedArguments[i])) { + thisObject->argument(i).set(exec->globalData(), thisObject, value); return; } - PutPropertySlot slot; - JSObject::put(exec, Identifier(exec, UString::number(i)), value, slot); + PutPropertySlot slot(shouldThrow); + JSObject::put(thisObject, exec, Identifier(exec, UString::number(i)), value, slot); } -void Arguments::put(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot) +void Arguments::put(JSCell* cell, ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot) { + Arguments* thisObject = jsCast(cell); bool isArrayIndex; unsigned i = propertyName.toArrayIndex(isArrayIndex); - if (isArrayIndex && i < d->numArguments && (!d->deletedArguments || !d->deletedArguments[i])) { - if (i < d->numParameters) - d->registers[d->firstParameterIndex + i].set(exec->globalData(), d->activation ? static_cast(d->activation.get()) : static_cast(this), value); - else - d->extraArguments[i - d->numParameters].set(exec->globalData(), this, value); + if (isArrayIndex && i < thisObject->d->numArguments && (!thisObject->d->deletedArguments || !thisObject->d->deletedArguments[i])) { + thisObject->argument(i).set(exec->globalData(), thisObject, value); return; } - if (propertyName == exec->propertyNames().length && !d->overrodeLength) { - d->overrodeLength = true; - putDirect(exec->globalData(), propertyName, value, DontEnum); + if (propertyName == exec->propertyNames().length && !thisObject->d->overrodeLength) { + thisObject->d->overrodeLength = true; + thisObject->putDirect(exec->globalData(), propertyName, value, DontEnum); return; } - if (propertyName == exec->propertyNames().callee && !d->overrodeCallee) { - if (!d->isStrictMode) { - d->overrodeCallee = true; - putDirect(exec->globalData(), propertyName, value, DontEnum); + if (propertyName == exec->propertyNames().callee && !thisObject->d->overrodeCallee) { + if (!thisObject->d->isStrictMode) { + thisObject->d->overrodeCallee = true; + thisObject->putDirect(exec->globalData(), propertyName, value, DontEnum); return; } - createStrictModeCalleeIfNecessary(exec); + thisObject->createStrictModeCalleeIfNecessary(exec); } - if (propertyName == exec->propertyNames().caller && d->isStrictMode) - createStrictModeCallerIfNecessary(exec); + if (propertyName == exec->propertyNames().caller && thisObject->d->isStrictMode) + thisObject->createStrictModeCallerIfNecessary(exec); - JSObject::put(exec, propertyName, value, slot); + JSObject::put(thisObject, exec, propertyName, value, slot); } -bool Arguments::deleteProperty(ExecState* exec, unsigned i) +bool Arguments::deletePropertyByIndex(JSCell* cell, ExecState* exec, unsigned i) { - if (i < d->numArguments) { - if (!d->deletedArguments) { - d->deletedArguments = adoptArrayPtr(new bool[d->numArguments]); - memset(d->deletedArguments.get(), 0, sizeof(bool) * d->numArguments); + Arguments* thisObject = jsCast(cell); + if (i < thisObject->d->numArguments) { + if (!Base::deletePropertyByIndex(cell, exec, i)) + return false; + + if (!thisObject->d->deletedArguments) { + thisObject->d->deletedArguments = adoptArrayPtr(new bool[thisObject->d->numArguments]); + memset(thisObject->d->deletedArguments.get(), 0, sizeof(bool) * thisObject->d->numArguments); } - if (!d->deletedArguments[i]) { - d->deletedArguments[i] = true; + if (!thisObject->d->deletedArguments[i]) { + thisObject->d->deletedArguments[i] = true; return true; } } - return JSObject::deleteProperty(exec, Identifier(exec, UString::number(i))); + return JSObject::deleteProperty(thisObject, exec, Identifier(exec, UString::number(i))); } -bool Arguments::deleteProperty(ExecState* exec, const Identifier& propertyName) +bool Arguments::deleteProperty(JSCell* cell, ExecState* exec, const Identifier& propertyName) { + if (exec->globalData().isInDefineOwnProperty()) + return Base::deleteProperty(cell, exec, propertyName); + + Arguments* thisObject = jsCast(cell); bool isArrayIndex; unsigned i = propertyName.toArrayIndex(isArrayIndex); - if (isArrayIndex && i < d->numArguments) { - if (!d->deletedArguments) { - d->deletedArguments = adoptArrayPtr(new bool[d->numArguments]); - memset(d->deletedArguments.get(), 0, sizeof(bool) * d->numArguments); + if (isArrayIndex && i < thisObject->d->numArguments) { + if (!Base::deleteProperty(cell, exec, propertyName)) + return false; + + if (!thisObject->d->deletedArguments) { + thisObject->d->deletedArguments = adoptArrayPtr(new bool[thisObject->d->numArguments]); + memset(thisObject->d->deletedArguments.get(), 0, sizeof(bool) * thisObject->d->numArguments); } - if (!d->deletedArguments[i]) { - d->deletedArguments[i] = true; + if (!thisObject->d->deletedArguments[i]) { + thisObject->d->deletedArguments[i] = true; return true; } } - if (propertyName == exec->propertyNames().length && !d->overrodeLength) { - d->overrodeLength = true; + if (propertyName == exec->propertyNames().length && !thisObject->d->overrodeLength) { + thisObject->d->overrodeLength = true; return true; } - if (propertyName == exec->propertyNames().callee && !d->overrodeCallee) { - if (!d->isStrictMode) { - d->overrodeCallee = true; + if (propertyName == exec->propertyNames().callee && !thisObject->d->overrodeCallee) { + if (!thisObject->d->isStrictMode) { + thisObject->d->overrodeCallee = true; return true; } - createStrictModeCalleeIfNecessary(exec); + thisObject->createStrictModeCalleeIfNecessary(exec); } - if (propertyName == exec->propertyNames().caller && !d->isStrictMode) - createStrictModeCallerIfNecessary(exec); + if (propertyName == exec->propertyNames().caller && thisObject->d->isStrictMode) + thisObject->createStrictModeCallerIfNecessary(exec); + + return JSObject::deleteProperty(thisObject, exec, propertyName); +} + +bool Arguments::defineOwnProperty(JSObject* object, ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor, bool shouldThrow) +{ + Arguments* thisObject = jsCast(object); + bool isArrayIndex; + unsigned i = propertyName.toArrayIndex(isArrayIndex); + if (isArrayIndex && i < thisObject->d->numArguments) { + // If the property is not yet present on the object, and is not yet marked as deleted, then add it now. + PropertySlot slot; + if ((!thisObject->d->deletedArguments || !thisObject->d->deletedArguments[i]) && !JSObject::getOwnPropertySlot(thisObject, exec, propertyName, slot)) + object->putDirect(exec->globalData(), propertyName, thisObject->argument(i).get(), 0); + if (!Base::defineOwnProperty(object, exec, propertyName, descriptor, shouldThrow)) + return false; + + if (!thisObject->d->deletedArguments) { + thisObject->d->deletedArguments = adoptArrayPtr(new bool[thisObject->d->numArguments]); + memset(thisObject->d->deletedArguments.get(), 0, sizeof(bool) * thisObject->d->numArguments); + } + // From ES 5.1, 10.6 Arguments Object + // 5. If the value of isMapped is not undefined, then + if (!thisObject->d->deletedArguments[i]) { + // a. If IsAccessorDescriptor(Desc) is true, then + if (descriptor.isAccessorDescriptor()) { + // i. Call the [[Delete]] internal method of map passing P, and false as the arguments. + thisObject->d->deletedArguments[i] = true; + } else { // b. Else + // i. If Desc.[[Value]] is present, then + // 1. Call the [[Put]] internal method of map passing P, Desc.[[Value]], and Throw as the arguments. + if (descriptor.value()) + thisObject->argument(i).set(exec->globalData(), thisObject, descriptor.value()); + // ii. If Desc.[[Writable]] is present and its value is false, then + // 1. Call the [[Delete]] internal method of map passing P and false as arguments. + if (descriptor.writablePresent() && !descriptor.writable()) + thisObject->d->deletedArguments[i] = true; + } + } + return true; + } - return JSObject::deleteProperty(exec, propertyName); + if (propertyName == exec->propertyNames().length && !thisObject->d->overrodeLength) { + thisObject->putDirect(exec->globalData(), propertyName, jsNumber(thisObject->d->numArguments), DontEnum); + thisObject->d->overrodeLength = true; + } else if (propertyName == exec->propertyNames().callee && !thisObject->d->overrodeCallee) { + thisObject->putDirect(exec->globalData(), propertyName, thisObject->d->callee.get(), DontEnum); + thisObject->d->overrodeCallee = true; + } else if (propertyName == exec->propertyNames().caller && thisObject->d->isStrictMode) + thisObject->createStrictModeCallerIfNecessary(exec); + + return Base::defineOwnProperty(object, exec, propertyName, descriptor, shouldThrow); +} + +void Arguments::tearOff(CallFrame* callFrame) +{ + if (isTornOff()) + return; + + if (!d->numArguments) + return; + + d->registerArray = adoptArrayPtr(new WriteBarrier[d->numArguments]); + d->registers = d->registerArray.get() + CallFrame::offsetFor(d->numArguments + 1); + + if (!callFrame->isInlineCallFrame()) { + for (size_t i = 0; i < d->numArguments; ++i) + argument(i).set(callFrame->globalData(), this, callFrame->argument(i)); + return; + } + + InlineCallFrame* inlineCallFrame = callFrame->inlineCallFrame(); + for (size_t i = 0; i < d->numArguments; ++i) { + ValueRecovery& recovery = inlineCallFrame->arguments[i + 1]; + // In the future we'll support displaced recoveries (indicating that the + // argument was flushed to a different location), but for now we don't do + // that so this code will fail if that were to happen. On the other hand, + // it's much less likely that we'll support in-register recoveries since + // this code does not (easily) have access to registers. + JSValue value; + Register* location = &callFrame->registers()[CallFrame::argumentOffset(i)]; + switch (recovery.technique()) { + case AlreadyInRegisterFile: + value = location->jsValue(); + break; + case AlreadyInRegisterFileAsUnboxedInt32: + value = jsNumber(location->unboxedInt32()); + break; + case AlreadyInRegisterFileAsUnboxedCell: + value = location->unboxedCell(); + break; + case AlreadyInRegisterFileAsUnboxedBoolean: + value = jsBoolean(location->unboxedBoolean()); + break; + case AlreadyInRegisterFileAsUnboxedDouble: +#if USE(JSVALUE64) + value = jsNumber(*bitwise_cast(location)); +#else + value = location->jsValue(); +#endif + break; + case Constant: + value = recovery.constant(); + break; + default: + ASSERT_NOT_REACHED(); + break; + } + argument(i).set(callFrame->globalData(), this, value); + } } } // namespace JSC