1 /*
2 * Copyright (C) 2005 Apple Computer, Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14 * its contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include "config.h"
30 #include "JSObject.h"
31
32 #include "UserObjectImp.h"
33
JSUserObject(JSObjectCallBacksPtr callBacks,JSObjectMarkProcPtr markProc,void * data,int dataType)34 JSUserObject::JSUserObject(JSObjectCallBacksPtr callBacks, JSObjectMarkProcPtr markProc, void *data, int dataType)
35 : JSBase(kJSObjectTypeID), fCallBacks(*callBacks), fMarkProc(markProc), fData(data), fDataType(dataType)
36 {
37 }
38
~JSUserObject()39 JSUserObject::~JSUserObject()
40 {
41 if (fCallBacks.dispose)
42 {
43 fCallBacks.dispose(fData);
44 }
45 }
46
CopyPropertyNames(void)47 CFArrayRef JSUserObject::CopyPropertyNames(void)
48 {
49 CFArrayRef result = 0;
50 if (fCallBacks.copyPropertyNames)
51 {
52 result = fCallBacks.copyPropertyNames(fData);
53 }
54 return result;
55 }
56
CopyProperty(CFStringRef propertyName)57 JSUserObject* JSUserObject::CopyProperty(CFStringRef propertyName)
58 {
59 JSUserObject* result = 0;
60 if (fCallBacks.copyProperty)
61 {
62 result = (JSUserObject*)fCallBacks.copyProperty(fData, propertyName);
63 }
64 return result;
65 }
66
SetProperty(CFStringRef propertyName,JSUserObject * value)67 void JSUserObject::SetProperty(CFStringRef propertyName, JSUserObject* value)
68 {
69 if (fCallBacks.setProperty)
70 {
71 fCallBacks.setProperty(fData, propertyName, (JSObjectRef)value);
72 }
73
74 }
75
76 static JSValue JSC_HOST_CALL nativeCallFunction(ExecState* exec, JSObject* functionObject, JSValue thisValue, const ArgList& args);
nativeCallFunction(ExecState * exec,JSObject * functionObject,JSValue thisValue,const ArgList & args)77 static JSValue nativeCallFunction(ExecState* exec, JSObject* functionObject, JSValue thisValue, const ArgList& args)
78 {
79 return static_cast<UserObjectImp*>(functionObject)->callAsFunction(exec, asObject(thisValue), args);
80 }
81
getCallData(CallData & callData)82 CallType JSUserObject::getCallData(CallData& callData)
83 {
84 if (!fCallBacks.callFunction)
85 return CallTypeNone;
86
87 callData.native.function = nativeCallFunction;
88 return CallTypeHost;
89 }
90
CallFunction(JSUserObject * thisObj,CFArrayRef args)91 JSUserObject* JSUserObject::CallFunction(JSUserObject* thisObj, CFArrayRef args)
92 {
93 JSUserObject* result = 0;
94 if (fCallBacks.callFunction)
95 {
96 result = (JSUserObject*)fCallBacks.callFunction(fData, (JSObjectRef)thisObj, args);
97 }
98 return result;
99
100 }
101
CopyCFValue() const102 CFTypeRef JSUserObject::CopyCFValue() const
103 {
104 CFTypeRef result = 0;
105 if (fCallBacks.copyCFValue)
106 {
107 result = (JSUserObject*)fCallBacks.copyCFValue(fData);
108 }
109 return result;
110 }
111
Equal(JSBase * other)112 UInt8 JSUserObject::Equal(JSBase* other)
113 {
114 UInt8 result = false;
115 JSUserObject* obj = (JSUserObject*)other;
116 if (obj->GetTypeID() == kJSObjectTypeID)
117 {
118 if (fCallBacks.equal)
119 {
120 result = fCallBacks.equal(GetData(), obj->GetData());
121 }
122 else
123 {
124 CFTypeRef cf1 = CopyCFValue();
125 CFTypeRef cf2 = obj->CopyCFValue();
126 if (cf1 && cf2)
127 {
128 result = CFEqual(cf1, cf2);
129 }
130 ReleaseCFType(cf2);
131 ReleaseCFType(cf1);
132 }
133 }
134 return result;
135 }
136
Mark()137 void JSUserObject::Mark()
138 {
139 if (fMarkProc)
140 {
141 fMarkProc(fData);
142 }
143 }
144
GetData()145 void *JSUserObject::GetData()
146 {
147 return fData;
148 }
149
150
151