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 "JSObjectRef.h"
31 #include <runtime/JSObject.h>
32 #include <runtime/Protect.h>
33 #include <runtime/UString.h>
34 #include <wtf/HashMap.h>
35 #include <wtf/RefCounted.h>
37 struct StaticValueEntry
{
38 StaticValueEntry(JSObjectGetPropertyCallback _getProperty
, JSObjectSetPropertyCallback _setProperty
, JSPropertyAttributes _attributes
)
39 : getProperty(_getProperty
), setProperty(_setProperty
), attributes(_attributes
)
43 JSObjectGetPropertyCallback getProperty
;
44 JSObjectSetPropertyCallback setProperty
;
45 JSPropertyAttributes attributes
;
48 struct StaticFunctionEntry
{
49 StaticFunctionEntry(JSObjectCallAsFunctionCallback _callAsFunction
, JSPropertyAttributes _attributes
)
50 : callAsFunction(_callAsFunction
), attributes(_attributes
)
54 JSObjectCallAsFunctionCallback callAsFunction
;
55 JSPropertyAttributes attributes
;
58 typedef HashMap
<RefPtr
<JSC::UString::Rep
>, StaticValueEntry
*> OpaqueJSClassStaticValuesTable
;
59 typedef HashMap
<RefPtr
<JSC::UString::Rep
>, StaticFunctionEntry
*> OpaqueJSClassStaticFunctionsTable
;
63 // An OpaqueJSClass (JSClass) is created without a context, so it can be used with any context, even across context groups.
64 // This structure holds data members that vary across context groups.
65 struct OpaqueJSClassContextData
: Noncopyable
{
66 OpaqueJSClassContextData(OpaqueJSClass
*);
67 ~OpaqueJSClassContextData();
69 // It is necessary to keep OpaqueJSClass alive because of the following rare scenario:
70 // 1. A class is created and used, so its context data is stored in JSGlobalData hash map.
71 // 2. The class is released, and when all JS objects that use it are collected, OpaqueJSClass
72 // is deleted (that's the part prevented by this RefPtr).
73 // 3. Another class is created at the same address.
74 // 4. When it is used, the old context data is found in JSGlobalData and used.
75 RefPtr
<OpaqueJSClass
> m_class
;
77 OpaqueJSClassStaticValuesTable
* staticValues
;
78 OpaqueJSClassStaticFunctionsTable
* staticFunctions
;
79 JSC::JSObject
* cachedPrototype
;
82 struct OpaqueJSClass
: public ThreadSafeShared
<OpaqueJSClass
> {
83 static PassRefPtr
<OpaqueJSClass
> create(const JSClassDefinition
*);
84 static PassRefPtr
<OpaqueJSClass
> createNoAutomaticPrototype(const JSClassDefinition
*);
87 JSC::UString
className();
88 OpaqueJSClassStaticValuesTable
* staticValues(JSC::ExecState
*);
89 OpaqueJSClassStaticFunctionsTable
* staticFunctions(JSC::ExecState
*);
90 JSC::JSObject
* prototype(JSC::ExecState
*);
92 OpaqueJSClass
* parentClass
;
93 OpaqueJSClass
* prototypeClass
;
95 JSObjectInitializeCallback initialize
;
96 JSObjectFinalizeCallback finalize
;
97 JSObjectHasPropertyCallback hasProperty
;
98 JSObjectGetPropertyCallback getProperty
;
99 JSObjectSetPropertyCallback setProperty
;
100 JSObjectDeletePropertyCallback deleteProperty
;
101 JSObjectGetPropertyNamesCallback getPropertyNames
;
102 JSObjectCallAsFunctionCallback callAsFunction
;
103 JSObjectCallAsConstructorCallback callAsConstructor
;
104 JSObjectHasInstanceCallback hasInstance
;
105 JSObjectConvertToTypeCallback convertToType
;
108 friend struct OpaqueJSClassContextData
;
111 OpaqueJSClass(const OpaqueJSClass
&);
112 OpaqueJSClass(const JSClassDefinition
*, OpaqueJSClass
* protoClass
);
114 OpaqueJSClassContextData
& contextData(JSC::ExecState
*);
116 // UStrings in these data members should not be put into any IdentifierTable.
117 JSC::UString m_className
;
118 OpaqueJSClassStaticValuesTable
* m_staticValues
;
119 OpaqueJSClassStaticFunctionsTable
* m_staticFunctions
;
122 #endif // JSClassRef_h