diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/runtime/ClonedArguments.cpp | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz |
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/JavaScriptCore/runtime/ClonedArguments.cpp')
-rw-r--r-- | Source/JavaScriptCore/runtime/ClonedArguments.cpp | 248 |
1 files changed, 0 insertions, 248 deletions
diff --git a/Source/JavaScriptCore/runtime/ClonedArguments.cpp b/Source/JavaScriptCore/runtime/ClonedArguments.cpp deleted file mode 100644 index 8241d6e0c..000000000 --- a/Source/JavaScriptCore/runtime/ClonedArguments.cpp +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright (C) 2015 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" -#include "ClonedArguments.h" - -#include "GetterSetter.h" -#include "InlineCallFrame.h" -#include "JSCInlines.h" - -namespace JSC { - -STATIC_ASSERT_IS_TRIVIALLY_DESTRUCTIBLE(ClonedArguments); - -const ClassInfo ClonedArguments::s_info = { "Arguments", &Base::s_info, 0, CREATE_METHOD_TABLE(ClonedArguments) }; - -ClonedArguments::ClonedArguments(VM& vm, Structure* structure) - : Base(vm, structure, nullptr) -{ -} - -ClonedArguments* ClonedArguments::createEmpty( - VM& vm, Structure* structure, JSFunction* callee) -{ - ClonedArguments* result = - new (NotNull, allocateCell<ClonedArguments>(vm.heap)) - ClonedArguments(vm, structure); - result->finishCreation(vm); - result->m_callee.set(vm, result, callee); - return result; -} - -ClonedArguments* ClonedArguments::createEmpty(ExecState* exec, JSFunction* callee) -{ - // NB. Some clients might expect that the global object of of this object is the global object - // of the callee. We don't do this for now, but maybe we should. - return createEmpty( - exec->vm(), exec->lexicalGlobalObject()->outOfBandArgumentsStructure(), callee); -} - -ClonedArguments* ClonedArguments::createWithInlineFrame(ExecState* myFrame, ExecState* targetFrame, InlineCallFrame* inlineCallFrame, ArgumentsMode mode) -{ - VM& vm = myFrame->vm(); - - JSFunction* callee; - - if (inlineCallFrame) - callee = jsCast<JSFunction*>(inlineCallFrame->calleeRecovery.recover(targetFrame)); - else - callee = jsCast<JSFunction*>(targetFrame->callee()); - - ClonedArguments* result = createEmpty(myFrame, callee); - - unsigned length = 0; // Initialize because VC needs it. - switch (mode) { - case ArgumentsMode::Cloned: { - if (inlineCallFrame) { - if (inlineCallFrame->argumentCountRegister.isValid()) - length = targetFrame->r(inlineCallFrame->argumentCountRegister).unboxedInt32(); - else - length = inlineCallFrame->arguments.size(); - length--; - - for (unsigned i = length; i--;) - result->putDirectIndex(myFrame, i, inlineCallFrame->arguments[i + 1].recover(targetFrame)); - } else { - length = targetFrame->argumentCount(); - - for (unsigned i = length; i--;) - result->putDirectIndex(myFrame, i, targetFrame->uncheckedArgument(i)); - } - break; - } - - case ArgumentsMode::FakeValues: { - length = 0; - break; - } } - - result->putDirect(vm, vm.propertyNames->length, jsNumber(length), DontEnum); - - return result; -} - -ClonedArguments* ClonedArguments::createWithMachineFrame(ExecState* myFrame, ExecState* targetFrame, ArgumentsMode mode) -{ - return createWithInlineFrame(myFrame, targetFrame, nullptr, mode); -} - -ClonedArguments* ClonedArguments::createByCopyingFrom( - ExecState* exec, Structure* structure, Register* argumentStart, unsigned length, - JSFunction* callee) -{ - VM& vm = exec->vm(); - ClonedArguments* result = createEmpty(vm, structure, callee); - - for (unsigned i = length; i--;) - result->putDirectIndex(exec, i, argumentStart[i].jsValue()); - - result->putDirect(vm, vm.propertyNames->length, jsNumber(length), DontEnum); - return result; -} - -Structure* ClonedArguments::createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) -{ - return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info()); -} - -bool ClonedArguments::getOwnPropertySlot(JSObject* object, ExecState* exec, PropertyName ident, PropertySlot& slot) -{ - ClonedArguments* thisObject = jsCast<ClonedArguments*>(object); - VM& vm = exec->vm(); - - if (!thisObject->specialsMaterialized()) { - FunctionExecutable* executable = jsCast<FunctionExecutable*>(thisObject->m_callee->executable()); - bool isStrictMode = executable->isStrictMode(); - - if (isStrictMode) { - if (ident == vm.propertyNames->callee) { - slot.setGetterSlot(thisObject, DontDelete | DontEnum | Accessor, thisObject->globalObject()->throwTypeErrorGetterSetter(vm)); - return true; - } - if (ident == vm.propertyNames->caller) { - slot.setGetterSlot(thisObject, DontDelete | DontEnum | Accessor, thisObject->globalObject()->throwTypeErrorGetterSetter(vm)); - return true; - } - - } else if (ident == vm.propertyNames->callee) { - slot.setValue(thisObject, 0, thisObject->m_callee.get()); - return true; - } - - if (ident == vm.propertyNames->iteratorSymbol) { - slot.setValue(thisObject, DontEnum, thisObject->globalObject()->arrayProtoValuesFunction()); - return true; - } - } - - return Base::getOwnPropertySlot(thisObject, exec, ident, slot); -} - -void ClonedArguments::getOwnPropertyNames(JSObject* object, ExecState* exec, PropertyNameArray& array, EnumerationMode mode) -{ - ClonedArguments* thisObject = jsCast<ClonedArguments*>(object); - thisObject->materializeSpecialsIfNecessary(exec); - Base::getOwnPropertyNames(thisObject, exec, array, mode); -} - -void ClonedArguments::put(JSCell* cell, ExecState* exec, PropertyName ident, JSValue value, PutPropertySlot& slot) -{ - ClonedArguments* thisObject = jsCast<ClonedArguments*>(cell); - VM& vm = exec->vm(); - - if (ident == vm.propertyNames->callee - || ident == vm.propertyNames->caller - || ident == vm.propertyNames->iteratorSymbol) { - thisObject->materializeSpecialsIfNecessary(exec); - PutPropertySlot dummy = slot; // Shadow the given PutPropertySlot to prevent caching. - Base::put(thisObject, exec, ident, value, dummy); - return; - } - - Base::put(thisObject, exec, ident, value, slot); -} - -bool ClonedArguments::deleteProperty(JSCell* cell, ExecState* exec, PropertyName ident) -{ - ClonedArguments* thisObject = jsCast<ClonedArguments*>(cell); - VM& vm = exec->vm(); - - if (ident == vm.propertyNames->callee - || ident == vm.propertyNames->caller - || ident == vm.propertyNames->iteratorSymbol) - thisObject->materializeSpecialsIfNecessary(exec); - - return Base::deleteProperty(thisObject, exec, ident); -} - -bool ClonedArguments::defineOwnProperty(JSObject* object, ExecState* exec, PropertyName ident, const PropertyDescriptor& descriptor, bool shouldThrow) -{ - ClonedArguments* thisObject = jsCast<ClonedArguments*>(object); - VM& vm = exec->vm(); - - if (ident == vm.propertyNames->callee - || ident == vm.propertyNames->caller - || ident == vm.propertyNames->iteratorSymbol) - thisObject->materializeSpecialsIfNecessary(exec); - - return Base::defineOwnProperty(object, exec, ident, descriptor, shouldThrow); -} - -void ClonedArguments::materializeSpecials(ExecState* exec) -{ - RELEASE_ASSERT(!specialsMaterialized()); - VM& vm = exec->vm(); - - FunctionExecutable* executable = jsCast<FunctionExecutable*>(m_callee->executable()); - bool isStrictMode = executable->isStrictMode(); - - if (isStrictMode) { - putDirectAccessor(exec, vm.propertyNames->callee, globalObject()->throwTypeErrorGetterSetter(vm), DontDelete | DontEnum | Accessor); - putDirectAccessor(exec, vm.propertyNames->caller, globalObject()->throwTypeErrorGetterSetter(vm), DontDelete | DontEnum | Accessor); - } else - putDirect(vm, vm.propertyNames->callee, JSValue(m_callee.get())); - - putDirect(vm, vm.propertyNames->iteratorSymbol, globalObject()->arrayProtoValuesFunction(), DontEnum); - - m_callee.clear(); -} - -void ClonedArguments::materializeSpecialsIfNecessary(ExecState* exec) -{ - if (!specialsMaterialized()) - materializeSpecials(exec); -} - -void ClonedArguments::visitChildren(JSCell* cell, SlotVisitor& visitor) -{ - ClonedArguments* thisObject = jsCast<ClonedArguments*>(cell); - ASSERT_GC_OBJECT_INHERITS(thisObject, info()); - Base::visitChildren(thisObject, visitor); - visitor.append(&thisObject->m_callee); -} - -} // namespace JSC - |