summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/runtime/InternalFunction.cpp
diff options
context:
space:
mode:
authorKonstantin Tokarev <annulen@yandex.ru>2016-08-25 19:20:41 +0300
committerKonstantin Tokarev <annulen@yandex.ru>2017-02-02 12:30:55 +0000
commit6882a04fb36642862b11efe514251d32070c3d65 (patch)
treeb7959826000b061fd5ccc7512035c7478742f7b0 /Source/JavaScriptCore/runtime/InternalFunction.cpp
parentab6df191029eeeb0b0f16f127d553265659f739e (diff)
downloadqtwebkit-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.cpp51
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