bool Arguments::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor) { 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(), None); } else descriptor.setDescriptor(d->extraArguments[i - d->numParameters].get(), None); return true; } if (propertyName == exec->propertyNames().length && LIKELY(!d->overrodeLength)) { descriptor.setDescriptor(jsNumber(d->numArguments), DontEnum); return true; } if (propertyName == exec->propertyNames().callee && LIKELY(!d->overrodeCallee)) { if (!d->isStrictMode) { descriptor.setDescriptor(d->callee.get(), DontEnum); return true; } createStrictModeCalleeIfNecessary(exec); } if (propertyName == exec->propertyNames().caller && d->isStrictMode) createStrictModeCallerIfNecessary(exec); return JSObject::getOwnPropertyDescriptor(exec, propertyName, descriptor); }
void Arguments::put(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot) { 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] = JSValue(value); else d->extraArguments[i - d->numParameters] = JSValue(value); return; } if (propertyName == exec->propertyNames().length && !d->overrodeLength) { d->overrodeLength = true; putDirect(propertyName, value, DontEnum); return; } if (propertyName == exec->propertyNames().callee && !d->overrodeCallee) { if (!d->isStrictMode) { d->overrodeCallee = true; putDirect(propertyName, value, DontEnum); return; } createStrictModeCalleeIfNecessary(exec); } if (propertyName == exec->propertyNames().caller && d->isStrictMode) createStrictModeCallerIfNecessary(exec); JSObject::put(exec, propertyName, value, slot); }
bool Arguments::deleteProperty(ExecState* exec, const Identifier& propertyName) { bool isArrayIndex; unsigned i = propertyName.toArrayIndex(isArrayIndex); if (isArrayIndex && i < d->numArguments) { if (!d->deletedArguments) { d->deletedArguments.set(new bool[d->numArguments]); memset(d->deletedArguments.get(), 0, sizeof(bool) * d->numArguments); } if (!d->deletedArguments[i]) { d->deletedArguments[i] = true; return true; } } if (propertyName == exec->propertyNames().length && !d->overrodeLength) { d->overrodeLength = true; return true; } if (propertyName == exec->propertyNames().callee && !d->overrodeCallee) { if (!d->isStrictMode) { d->overrodeCallee = true; return true; } createStrictModeCalleeIfNecessary(exec); } if (propertyName == exec->propertyNames().caller && !d->isStrictMode) createStrictModeCallerIfNecessary(exec); return JSObject::deleteProperty(exec, propertyName); }
bool Arguments::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) { bool isArrayIndex; unsigned i = propertyName.toArrayIndex(isArrayIndex); if (isArrayIndex && i < d->numArguments && (!d->deletedArguments || !d->deletedArguments[i])) { if (i < d->numParameters) { slot.setRegisterSlot(&d->registers[d->firstParameterIndex + i]); } else slot.setValue(d->extraArguments[i - d->numParameters].jsValue()); return true; } if (propertyName == exec->propertyNames().length && LIKELY(!d->overrodeLength)) { slot.setValue(jsNumber(d->numArguments)); return true; } if (propertyName == exec->propertyNames().callee && LIKELY(!d->overrodeCallee)) { if (!d->isStrictMode) { slot.setValue(d->callee); return true; } createStrictModeCalleeIfNecessary(exec); } if (propertyName == exec->propertyNames().caller && d->isStrictMode) createStrictModeCallerIfNecessary(exec); return JSObject::getOwnPropertySlot(exec, propertyName, slot); }