diff options
author | Konstantin Tokarev <annulen@yandex.ru> | 2016-08-25 19:20:41 +0300 |
---|---|---|
committer | Konstantin Tokarev <annulen@yandex.ru> | 2017-02-02 12:30:55 +0000 |
commit | 6882a04fb36642862b11efe514251d32070c3d65 (patch) | |
tree | b7959826000b061fd5ccc7512035c7478742f7b0 /Source/JavaScriptCore/runtime/InternalFunction.cpp | |
parent | ab6df191029eeeb0b0f16f127d553265659f739e (diff) | |
download | qtwebkit-6882a04fb36642862b11efe514251d32070c3d65.tar.gz |
Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443)
Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f
Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
Diffstat (limited to 'Source/JavaScriptCore/runtime/InternalFunction.cpp')
-rw-r--r-- | Source/JavaScriptCore/runtime/InternalFunction.cpp | 51 |
1 files changed, 43 insertions, 8 deletions
diff --git a/Source/JavaScriptCore/runtime/InternalFunction.cpp b/Source/JavaScriptCore/runtime/InternalFunction.cpp index 071babc46..bb23d45ed 100644 --- a/Source/JavaScriptCore/runtime/InternalFunction.cpp +++ b/Source/JavaScriptCore/runtime/InternalFunction.cpp @@ -1,7 +1,7 @@ /* * Copyright (C) 1999-2002 Harri Porten (porten@kde.org) * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * Copyright (C) 2004, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2004, 2007, 2008, 2016 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -26,24 +26,24 @@ #include "FunctionPrototype.h" #include "JSGlobalObject.h" #include "JSString.h" -#include "Operations.h" +#include "JSCInlines.h" namespace JSC { -ASSERT_HAS_TRIVIAL_DESTRUCTOR(InternalFunction); +STATIC_ASSERT_IS_TRIVIALLY_DESTRUCTIBLE(InternalFunction); -const ClassInfo InternalFunction::s_info = { "Function", &Base::s_info, 0, 0, CREATE_METHOD_TABLE(InternalFunction) }; +const ClassInfo InternalFunction::s_info = { "Function", &Base::s_info, 0, CREATE_METHOD_TABLE(InternalFunction) }; -InternalFunction::InternalFunction(JSGlobalObject* globalObject, Structure* structure) - : JSDestructibleObject(globalObject->vm(), structure) +InternalFunction::InternalFunction(VM& vm, Structure* structure) + : JSDestructibleObject(vm, structure) { } void InternalFunction::finishCreation(VM& vm, const String& name) { Base::finishCreation(vm); - ASSERT(inherits(&s_info)); - ASSERT(methodTable()->getCallData != InternalFunction::s_info.methodTable.getCallData); + ASSERT(inherits(info())); + ASSERT(methodTable()->getCallData != InternalFunction::info()->methodTable.getCallData); putDirect(vm, vm.propertyNames->name, jsString(&vm, name), DontDelete | ReadOnly | DontEnum); } @@ -78,4 +78,39 @@ const String InternalFunction::calculatedDisplayName(ExecState* exec) return name(exec); } +Structure* InternalFunction::createSubclassStructure(ExecState* exec, JSValue newTarget, Structure* baseClass) +{ + + VM& vm = exec->vm(); + // We allow newTarget == JSValue() because the API needs to be able to create classes without having a real JS frame. + // Since we don't allow subclassing in the API we just treat newTarget == JSValue() as newTarget == exec->callee() + ASSERT(!newTarget || newTarget.isFunction()); + + if (newTarget && newTarget != exec->callee()) { + // newTarget may be an InternalFunction if we were called from Reflect.construct. + JSFunction* targetFunction = jsDynamicCast<JSFunction*>(newTarget); + + if (LIKELY(targetFunction)) { + Structure* structure = targetFunction->rareData(vm)->internalFunctionAllocationStructure(); + if (LIKELY(structure && structure->classInfo() == baseClass->classInfo())) + return structure; + + // Note, Reflect.construct might cause the profile to churn but we don't care. + JSObject* prototype = jsDynamicCast<JSObject*>(newTarget.get(exec, exec->propertyNames().prototype)); + if (prototype) + return targetFunction->rareData(vm)->createInternalFunctionAllocationStructureFromBase(vm, prototype, baseClass); + } else { + JSObject* prototype = jsDynamicCast<JSObject*>(newTarget.get(exec, exec->propertyNames().prototype)); + if (prototype) { + // This only happens if someone Reflect.constructs our builtin constructor with another builtin constructor as the new.target. + // Thus, we don't care about the cost of looking up the structure from our hash table every time. + return vm.prototypeMap.emptyStructureForPrototypeFromBaseStructure(prototype, baseClass); + } + } + } + + return baseClass; +} + + } // namespace JSC |