Skip to content

Commit 98721f3

Browse files
committed
Added GlobalDataHelper for getting constructors/prototypes
1 parent 8c56723 commit 98721f3

File tree

6 files changed

+95
-45
lines changed

6 files changed

+95
-45
lines changed

JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,8 @@
553553
B6D188711672DFE800D1037C /* JSFloat32Array.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B6D1886E1672DFE700D1037C /* JSFloat32Array.cpp */; };
554554
B6D188721672DFE800D1037C /* JSFloat32Array.h in Headers */ = {isa = PBXBuildFile; fileRef = B6D1886F1672DFE700D1037C /* JSFloat32Array.h */; };
555555
B6D188731672DFE800D1037C /* JSFloat32Array.h in Headers */ = {isa = PBXBuildFile; fileRef = B6D1886F1672DFE700D1037C /* JSFloat32Array.h */; };
556+
B6D1888B1673751400D1037C /* GlobalDataHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = B6D188881673751400D1037C /* GlobalDataHelper.h */; };
557+
B6D1888C1673751400D1037C /* GlobalDataHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = B6D188881673751400D1037C /* GlobalDataHelper.h */; };
556558
B6E69991166BD63D005EF4B1 /* AbstractMacroAssembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 860161DF0F3A83C100F84710 /* AbstractMacroAssembler.h */; };
557559
B6E69992166BD63D005EF4B1 /* APICast.h in Headers */ = {isa = PBXBuildFile; fileRef = 1482B78A0A4305AB00517CFC /* APICast.h */; settings = {ATTRIBUTES = (Private, ); }; };
558560
B6E69993166BD63D005EF4B1 /* APIShims.h in Headers */ = {isa = PBXBuildFile; fileRef = 865F408710E7D56300947361 /* APIShims.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -1828,6 +1830,7 @@
18281830
B6D18819166FA73400D1037C /* JSArrayBufferViewHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSArrayBufferViewHelper.h; sourceTree = "<group>"; };
18291831
B6D1886E1672DFE700D1037C /* JSFloat32Array.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSFloat32Array.cpp; sourceTree = "<group>"; };
18301832
B6D1886F1672DFE700D1037C /* JSFloat32Array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSFloat32Array.h; sourceTree = "<group>"; };
1833+
B6D188881673751400D1037C /* GlobalDataHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GlobalDataHelper.h; sourceTree = "<group>"; };
18311834
B6E69BC4166BD63D005EF4B1 /* libJavaScriptCore.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libJavaScriptCore.a; sourceTree = BUILT_PRODUCTS_DIR; };
18321835
B6E69BDB166BD6C1005EF4B1 /* libJSCLLIntOffsetsExtractor.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libJSCLLIntOffsetsExtractor.a; sourceTree = BUILT_PRODUCTS_DIR; };
18331836
B6E69BFD166BDCE7005EF4B1 /* libWTF.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libWTF.a; path = ../Build/libWTF.a; sourceTree = "<group>"; };
@@ -2885,6 +2888,7 @@
28852888
B6D18819166FA73400D1037C /* JSArrayBufferViewHelper.h */,
28862889
B6D1886E1672DFE700D1037C /* JSFloat32Array.cpp */,
28872890
B6D1886F1672DFE700D1037C /* JSFloat32Array.h */,
2891+
B6D188881673751400D1037C /* GlobalDataHelper.h */,
28882892
);
28892893
path = TypedArrays;
28902894
sourceTree = "<group>";
@@ -3250,6 +3254,7 @@
32503254
B6D18834166FA73400D1037C /* JSArrayBufferView.h in Headers */,
32513255
B6D18836166FA73400D1037C /* JSArrayBufferViewHelper.h in Headers */,
32523256
B6D188721672DFE800D1037C /* JSFloat32Array.h in Headers */,
3257+
B6D1888B1673751400D1037C /* GlobalDataHelper.h in Headers */,
32533258
);
32543259
runOnlyForDeploymentPostprocessing = 0;
32553260
};
@@ -3599,6 +3604,7 @@
35993604
B6D18835166FA73400D1037C /* JSArrayBufferView.h in Headers */,
36003605
B6D18837166FA73400D1037C /* JSArrayBufferViewHelper.h in Headers */,
36013606
B6D188731672DFE800D1037C /* JSFloat32Array.h in Headers */,
3607+
B6D1888C1673751400D1037C /* GlobalDataHelper.h in Headers */,
36023608
);
36033609
runOnlyForDeploymentPostprocessing = 0;
36043610
};
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#ifndef __JavaScriptCore__GlobalDataHelper__
2+
#define __JavaScriptCore__GlobalDataHelper__
3+
4+
#include <wtf/HashMap.h>
5+
#include "Lookup.h"
6+
7+
#include "JSObject.h"
8+
#include "InternalFunction.h"
9+
10+
#include <runtime/JSGlobalObject.h>
11+
#include <runtime/JSObject.h>
12+
#include <runtime/ObjectPrototype.h>
13+
#include <wtf/ArrayBuffer.h>
14+
15+
namespace WebCore {
16+
17+
enum ParameterDefaultPolicy {
18+
DefaultIsUndefined,
19+
DefaultIsNullString
20+
};
21+
22+
23+
#define MAYBE_MISSING_PARAMETER(exec, index, policy) (((policy) == DefaultIsNullString && (index) >= (exec)->argumentCount()) ? (JSValue()) : ((exec)->argument(index)))
24+
25+
static inline const JSC::HashTable* getHashTableForGlobalData(JSC::JSGlobalData& globalData, const JSC::HashTable* staticTable) {
26+
ASSERT_UNUSED(&globalData, &globalData);
27+
// PL FIXME: this should return a copy per globalData. I think.
28+
return staticTable;
29+
}
30+
31+
32+
template<class ConstructorClass>
33+
static inline JSC::JSObject* getDOMConstructor(JSC::ExecState* exec, JSC::JSGlobalObject* globalObject)
34+
{
35+
static ConstructorClass * globalConstructor;
36+
if( !globalConstructor ) {
37+
globalConstructor = ConstructorClass::create(exec, ConstructorClass::createStructure(exec->globalData(), globalObject, globalObject->objectPrototype()), globalObject);
38+
}
39+
return (JSC::JSObject *)globalConstructor;
40+
}
41+
42+
43+
template<class PrototypeClass>
44+
static inline JSC::JSObject* getDOMPrototype(JSC::ExecState* exec, JSC::JSGlobalObject* globalObject)
45+
{
46+
static PrototypeClass * globalPrototype;
47+
if( !globalPrototype ) {
48+
JSC::JSGlobalData &data = exec->globalData();
49+
50+
globalPrototype = PrototypeClass::create(data, globalObject,
51+
PrototypeClass::createStructure(data, globalObject, globalObject->objectPrototype()));
52+
}
53+
return (JSC::JSObject *)globalPrototype;
54+
}
55+
56+
57+
}
58+
59+
#endif /* defined(__JavaScriptCore__GlobalDataHelper__) */

JavaScriptCore/runtime/TypedArrays/JSArrayBuffer.cpp

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,12 @@
2727
#include <wtf/ArrayBuffer.h>
2828
#include <wtf/GetPtr.h>
2929

30+
#include "GlobalDataHelper.h"
31+
3032
using namespace JSC;
3133

3234
namespace WebCore {
3335

34-
enum ParameterDefaultPolicy {
35-
DefaultIsUndefined,
36-
DefaultIsNullString
37-
};
38-
39-
#define MAYBE_MISSING_PARAMETER(exec, index, policy) (((policy) == DefaultIsNullString && (index) >= (exec)->argumentCount()) ? (JSValue()) : ((exec)->argument(index)))
40-
4136

4237
ASSERT_CLASS_FITS_IN_CELL(JSArrayBuffer);
4338
/* Hash table */
@@ -195,14 +190,9 @@ JSValue jsArrayBufferConstructor(ExecState* exec, JSValue slotBase, const Identi
195190
return JSArrayBuffer::getConstructor(exec, domObject->globalObject());
196191
}
197192

198-
static JSObject * globalConstructor;
199193
JSValue JSArrayBuffer::getConstructor(ExecState* exec, JSGlobalObject* globalObject)
200194
{
201-
if( !globalConstructor ) {
202-
JSArrayBufferConstructor * constructor = JSArrayBufferConstructor::create(exec, JSArrayBufferConstructor::createStructure(exec->globalData(), globalObject, globalObject->objectPrototype()), globalObject);
203-
globalConstructor = constructor;
204-
}
205-
return globalConstructor;
195+
return getDOMConstructor<JSArrayBufferConstructor>(exec, jsCast<JSGlobalObject*>(globalObject));
206196
}
207197

208198
EncodedJSValue JSC_HOST_CALL jsArrayBufferPrototypeFunctionSlice(ExecState* exec)

JavaScriptCore/runtime/TypedArrays/JSArrayBufferView.cpp

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
#include <wtf/ArrayBufferView.h>
2828
#include <wtf/GetPtr.h>
2929

30+
#include "GlobalDataHelper.h"
31+
3032
using namespace JSC;
3133

3234
namespace WebCore {
@@ -60,23 +62,14 @@ static const HashTable* getJSArrayBufferViewPrototypeTable(ExecState* exec)
6062
const ClassInfo JSArrayBufferViewPrototype::s_info = { "ArrayBufferViewPrototype", &Base::s_info, 0, getJSArrayBufferViewPrototypeTable, CREATE_METHOD_TABLE(JSArrayBufferViewPrototype) };
6163

6264

63-
static JSObject * globalProto = NULL;
6465
JSObject* JSArrayBufferViewPrototype::self(ExecState* exec, JSGlobalObject* globalObject)
6566
{
66-
// PL FIXME: dirty hack to provide one global prototype
67-
if( !globalProto ) {
68-
JSGlobalData &data = exec->globalData();
69-
globalProto = JSArrayBufferViewPrototype::create(data, globalObject,
70-
JSArrayBufferViewPrototype::createStructure(data, globalObject,
71-
globalObject->objectPrototype()));
72-
}
73-
return globalProto;
67+
return getDOMPrototype<JSArrayBufferViewPrototype>(exec, globalObject);
7468
}
7569

7670
static const HashTable* getJSArrayBufferViewTable(ExecState* exec)
7771
{
78-
ASSERT_UNUSED(exec, exec);
79-
return &JSArrayBufferViewTable;
72+
return getHashTableForGlobalData(exec->globalData(), &JSArrayBufferViewTable);
8073
}
8174

8275
const ClassInfo JSArrayBufferView::s_info = { "ArrayBufferView", &Base::s_info, 0, getJSArrayBufferViewTable , CREATE_METHOD_TABLE(JSArrayBufferView) };

JavaScriptCore/runtime/TypedArrays/JSFloat32Array.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@
2121
#include "config.h"
2222
#include "JSFloat32Array.h"
2323

24-
#include "ExceptionCode.h"
25-
#include "JSDOMBinding.h"
24+
#include "Lookup.h"
25+
#include "GlobalDataHelper.h"
26+
2627
#include "JSFloat32Array.h"
2728
#include <runtime/Error.h>
2829
#include <runtime/PropertyNameArray.h>
@@ -55,27 +56,28 @@ static const HashTableValue JSFloat32ArrayConstructorTableValues[] =
5556
static const HashTable JSFloat32ArrayConstructorTable = { 2, 1, JSFloat32ArrayConstructorTableValues, 0 };
5657
const ClassInfo JSFloat32ArrayConstructor::s_info = { "Float32ArrayConstructor", &Base::s_info, &JSFloat32ArrayConstructorTable, 0, CREATE_METHOD_TABLE(JSFloat32ArrayConstructor) };
5758

58-
JSFloat32ArrayConstructor::JSFloat32ArrayConstructor(Structure* structure, JSDOMGlobalObject* globalObject)
59-
: DOMConstructorObject(structure, globalObject)
59+
JSFloat32ArrayConstructor::JSFloat32ArrayConstructor(Structure* structure, JSGlobalObject* globalObject)
60+
: InternalFunction(globalObject, structure)
6061
{
6162
}
6263

63-
void JSFloat32ArrayConstructor::finishCreation(ExecState* exec, JSDOMGlobalObject* globalObject)
64+
void JSFloat32ArrayConstructor::finishCreation(ExecState* exec, JSGlobalObject* globalObject)
6465
{
65-
Base::finishCreation(exec->globalData());
66+
JSC::JSObject * proto = JSFloat32ArrayPrototype::self(exec, globalObject);
67+
Base::finishCreation(exec->globalData(), Identifier(exec, proto->classInfo()->className));
6668
ASSERT(inherits(&s_info));
6769
putDirect(exec->globalData(), exec->propertyNames().prototype, JSFloat32ArrayPrototype::self(exec, globalObject), DontDelete | ReadOnly);
6870
putDirect(exec->globalData(), exec->propertyNames().length, jsNumber(1), ReadOnly | DontDelete | DontEnum);
6971
}
7072

7173
bool JSFloat32ArrayConstructor::getOwnPropertySlot(JSCell* cell, ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
7274
{
73-
return getStaticValueSlot<JSFloat32ArrayConstructor, JSDOMWrapper>(exec, &JSFloat32ArrayConstructorTable, jsCast<JSFloat32ArrayConstructor*>(cell), propertyName, slot);
75+
return getStaticFunctionSlot<InternalFunction>(exec, &JSFloat32ArrayConstructorTable, jsCast<JSFloat32ArrayConstructor*>(cell), propertyName, slot);
7476
}
7577

7678
bool JSFloat32ArrayConstructor::getOwnPropertyDescriptor(JSObject* object, ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)
7779
{
78-
return getStaticValueDescriptor<JSFloat32ArrayConstructor, JSDOMWrapper>(exec, &JSFloat32ArrayConstructorTable, jsCast<JSFloat32ArrayConstructor*>(object), propertyName, descriptor);
80+
return getStaticFunctionDescriptor<InternalFunction>(exec, &JSFloat32ArrayConstructorTable, jsCast<JSFloat32ArrayConstructor*>(object), propertyName, descriptor);
7981
}
8082

8183
ConstructType JSFloat32ArrayConstructor::getConstructData(JSCell*, ConstructData& constructData)
@@ -104,7 +106,7 @@ const ClassInfo JSFloat32ArrayPrototype::s_info = { "Float32ArrayPrototype", &Ba
104106

105107
JSObject* JSFloat32ArrayPrototype::self(ExecState* exec, JSGlobalObject* globalObject)
106108
{
107-
return getDOMPrototype<JSFloat32Array>(exec, globalObject);
109+
return getDOMPrototype<JSFloat32ArrayPrototype>(exec, globalObject);
108110
}
109111

110112
bool JSFloat32ArrayPrototype::getOwnPropertySlot(JSCell* cell, ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
@@ -126,7 +128,7 @@ static const HashTable* getJSFloat32ArrayTable(ExecState* exec)
126128

127129
const ClassInfo JSFloat32Array::s_info = { "Float32Array", &Base::s_info, 0, getJSFloat32ArrayTable , CREATE_METHOD_TABLE(JSFloat32Array) };
128130

129-
JSFloat32Array::JSFloat32Array(Structure* structure, JSDOMGlobalObject* globalObject, PassRefPtr<Float32Array> impl)
131+
JSFloat32Array::JSFloat32Array(Structure* structure, JSGlobalObject* globalObject, PassRefPtr<Float32Array> impl)
130132
: JSArrayBufferView(structure, globalObject, impl)
131133
{
132134
}
@@ -231,7 +233,7 @@ void JSFloat32Array::getOwnPropertyNames(JSObject* object, ExecState* exec, Prop
231233

232234
JSValue JSFloat32Array::getConstructor(ExecState* exec, JSGlobalObject* globalObject)
233235
{
234-
return getDOMConstructor<JSFloat32ArrayConstructor>(exec, jsCast<JSDOMGlobalObject*>(globalObject));
236+
return getDOMConstructor<JSFloat32ArrayConstructor>(exec, jsCast<JSGlobalObject*>(globalObject));
235237
}
236238

237239
EncodedJSValue JSC_HOST_CALL jsFloat32ArrayPrototypeFunctionSubarray(ExecState* exec)

JavaScriptCore/runtime/TypedArrays/JSFloat32Array.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
#define JSFloat32Array_h
2323

2424
#include "JSArrayBufferView.h"
25-
#include "JSDOMBinding.h"
25+
#include "InternalFunction.h"
2626
#include <runtime/JSObject.h>
2727
#include <wtf/Float32Array.h>
2828

@@ -31,7 +31,7 @@ namespace WebCore {
3131
class JSFloat32Array : public JSArrayBufferView {
3232
public:
3333
typedef JSArrayBufferView Base;
34-
static JSFloat32Array* create(JSC::Structure* structure, JSDOMGlobalObject* globalObject, PassRefPtr<Float32Array> impl)
34+
static JSFloat32Array* create(JSC::Structure* structure, JSC::JSGlobalObject* globalObject, PassRefPtr<Float32Array> impl)
3535
{
3636
JSFloat32Array* ptr = new (NotNull, JSC::allocateCell<JSFloat32Array>(globalObject->globalData().heap)) JSFloat32Array(structure, globalObject, impl);
3737
ptr->finishCreation(globalObject->globalData());
@@ -64,14 +64,14 @@ class JSFloat32Array : public JSArrayBufferView {
6464
intptr_t m_storageLength;
6565
void* m_storage;
6666
protected:
67-
JSFloat32Array(JSC::Structure*, JSDOMGlobalObject*, PassRefPtr<Float32Array>);
67+
JSFloat32Array(JSC::Structure*, JSC::JSGlobalObject*, PassRefPtr<Float32Array>);
6868
void finishCreation(JSC::JSGlobalData&);
6969
static const unsigned StructureFlags = JSC::OverridesGetPropertyNames | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
7070
JSC::JSValue getByIndex(JSC::ExecState*, unsigned index);
7171
void indexSetter(JSC::ExecState*, unsigned index, JSC::JSValue);
7272
};
7373

74-
JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, Float32Array*);
74+
JSC::JSValue toJS(JSC::ExecState*, JSC::JSGlobalObject*, Float32Array*);
7575
Float32Array* toFloat32Array(JSC::JSValue);
7676

7777
class JSFloat32ArrayPrototype : public JSC::JSNonFinalObject {
@@ -99,14 +99,14 @@ class JSFloat32ArrayPrototype : public JSC::JSNonFinalObject {
9999
static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | Base::StructureFlags;
100100
};
101101

102-
class JSFloat32ArrayConstructor : public DOMConstructorObject {
102+
class JSFloat32ArrayConstructor : public JSC::InternalFunction {
103103
private:
104-
JSFloat32ArrayConstructor(JSC::Structure*, JSDOMGlobalObject*);
105-
void finishCreation(JSC::ExecState*, JSDOMGlobalObject*);
104+
JSFloat32ArrayConstructor(JSC::Structure*, JSC::JSGlobalObject*);
105+
void finishCreation(JSC::ExecState*, JSC::JSGlobalObject*);
106106

107107
public:
108-
typedef DOMConstructorObject Base;
109-
static JSFloat32ArrayConstructor* create(JSC::ExecState* exec, JSC::Structure* structure, JSDOMGlobalObject* globalObject)
108+
typedef JSC::InternalFunction Base;
109+
static JSFloat32ArrayConstructor* create(JSC::ExecState* exec, JSC::Structure* structure, JSC::JSGlobalObject* globalObject)
110110
{
111111
JSFloat32ArrayConstructor* ptr = new (NotNull, JSC::allocateCell<JSFloat32ArrayConstructor>(*exec->heap())) JSFloat32ArrayConstructor(structure, globalObject);
112112
ptr->finishCreation(exec, globalObject);
@@ -121,7 +121,7 @@ class JSFloat32ArrayConstructor : public DOMConstructorObject {
121121
return JSC::Structure::create(globalData, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), &s_info);
122122
}
123123
protected:
124-
static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | JSC::ImplementsHasInstance | DOMConstructorObject::StructureFlags;
124+
static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | JSC::ImplementsHasInstance | InternalFunction::StructureFlags;
125125
static JSC::EncodedJSValue JSC_HOST_CALL constructJSFloat32Array(JSC::ExecState*);
126126
static JSC::ConstructType getConstructData(JSC::JSCell*, JSC::ConstructData&);
127127
};

0 commit comments

Comments
 (0)