2 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 #include <JavaScriptCore/JSObjectRef.h>
33 #include <wtf/HashMap.h>
34 #include <wtf/text/WTFString.h>
36 struct StaticValueEntry
{
37 WTF_MAKE_FAST_ALLOCATED
;
39 StaticValueEntry(JSObjectGetPropertyCallback _getProperty
, JSObjectSetPropertyCallback _setProperty
, JSPropertyAttributes _attributes
)
40 : getProperty(_getProperty
), setProperty(_setProperty
), attributes(_attributes
)
44 JSObjectGetPropertyCallback getProperty
;
45 JSObjectSetPropertyCallback setProperty
;
46 JSPropertyAttributes attributes
;
49 struct StaticFunctionEntry
{
50 WTF_MAKE_FAST_ALLOCATED
;
52 StaticFunctionEntry(JSObjectCallAsFunctionCallback _callAsFunction
, JSPropertyAttributes _attributes
)
53 : callAsFunction(_callAsFunction
), attributes(_attributes
)
57 JSObjectCallAsFunctionCallback callAsFunction
;
58 JSPropertyAttributes attributes
;
61 typedef HashMap
<RefPtr
<StringImpl
>, OwnPtr
<StaticValueEntry
> > OpaqueJSClassStaticValuesTable
;
62 typedef HashMap
<RefPtr
<StringImpl
>, OwnPtr
<StaticFunctionEntry
> > OpaqueJSClassStaticFunctionsTable
;
66 // An OpaqueJSClass (JSClass) is created without a context, so it can be used with any context, even across context groups.
67 // This structure holds data members that vary across context groups.
68 struct OpaqueJSClassContextData
{
69 WTF_MAKE_NONCOPYABLE(OpaqueJSClassContextData
); WTF_MAKE_FAST_ALLOCATED
;
71 OpaqueJSClassContextData(JSC::VM
&, OpaqueJSClass
*);
73 // It is necessary to keep OpaqueJSClass alive because of the following rare scenario:
74 // 1. A class is created and used, so its context data is stored in VM hash map.
75 // 2. The class is released, and when all JS objects that use it are collected, OpaqueJSClass
76 // is deleted (that's the part prevented by this RefPtr).
77 // 3. Another class is created at the same address.
78 // 4. When it is used, the old context data is found in VM and used.
79 RefPtr
<OpaqueJSClass
> m_class
;
81 OwnPtr
<OpaqueJSClassStaticValuesTable
> staticValues
;
82 OwnPtr
<OpaqueJSClassStaticFunctionsTable
> staticFunctions
;
83 JSC::Weak
<JSC::JSObject
> cachedPrototype
;
86 struct OpaqueJSClass
: public ThreadSafeRefCounted
<OpaqueJSClass
> {
87 static PassRefPtr
<OpaqueJSClass
> create(const JSClassDefinition
*);
88 static PassRefPtr
<OpaqueJSClass
> createNoAutomaticPrototype(const JSClassDefinition
*);
89 JS_EXPORT_PRIVATE
~OpaqueJSClass();
92 OpaqueJSClassStaticValuesTable
* staticValues(JSC::ExecState
*);
93 OpaqueJSClassStaticFunctionsTable
* staticFunctions(JSC::ExecState
*);
94 JSC::JSObject
* prototype(JSC::ExecState
*);
96 OpaqueJSClass
* parentClass
;
97 OpaqueJSClass
* prototypeClass
;
99 JSObjectInitializeCallback initialize
;
100 JSObjectFinalizeCallback finalize
;
101 JSObjectHasPropertyCallback hasProperty
;
102 JSObjectGetPropertyCallback getProperty
;
103 JSObjectSetPropertyCallback setProperty
;
104 JSObjectDeletePropertyCallback deleteProperty
;
105 JSObjectGetPropertyNamesCallback getPropertyNames
;
106 JSObjectCallAsFunctionCallback callAsFunction
;
107 JSObjectCallAsConstructorCallback callAsConstructor
;
108 JSObjectHasInstanceCallback hasInstance
;
109 JSObjectConvertToTypeCallback convertToType
;
112 friend struct OpaqueJSClassContextData
;
115 OpaqueJSClass(const OpaqueJSClass
&);
116 OpaqueJSClass(const JSClassDefinition
*, OpaqueJSClass
* protoClass
);
118 OpaqueJSClassContextData
& contextData(JSC::ExecState
*);
120 // Strings in these data members should not be put into any IdentifierTable.
122 OwnPtr
<OpaqueJSClassStaticValuesTable
> m_staticValues
;
123 OwnPtr
<OpaqueJSClassStaticFunctionsTable
> m_staticFunctions
;
126 #endif // JSClassRef_h