• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2005, 2009 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 "JSValueWrapper.h"
31 #include "JSRun.h"
32 #include <JavaScriptCore/JSArray.h>
33 #include <JavaScriptCore/PropertyNameArray.h>
34 #include <pthread.h>
35 
JSValueWrapper(JSValue inValue)36 JSValueWrapper::JSValueWrapper(JSValue inValue)
37     : fValue(getThreadGlobalExecState()->globalData(), inValue)
38 {
39 }
40 
~JSValueWrapper()41 JSValueWrapper::~JSValueWrapper()
42 {
43 }
44 
GetValue()45 JSValue JSValueWrapper::GetValue()
46 {
47     return fValue.get();
48 }
49 
GetJSObectCallBacks(JSObjectCallBacks & callBacks)50 void JSValueWrapper::GetJSObectCallBacks(JSObjectCallBacks& callBacks)
51 {
52     callBacks.dispose = (JSObjectDisposeProcPtr)JSValueWrapper::JSObjectDispose;
53     callBacks.equal = (JSObjectEqualProcPtr)0;
54     callBacks.copyPropertyNames = (JSObjectCopyPropertyNamesProcPtr)JSValueWrapper::JSObjectCopyPropertyNames;
55     callBacks.copyCFValue = (JSObjectCopyCFValueProcPtr)JSValueWrapper::JSObjectCopyCFValue;
56     callBacks.copyProperty = (JSObjectCopyPropertyProcPtr)JSValueWrapper::JSObjectCopyProperty;
57     callBacks.setProperty = (JSObjectSetPropertyProcPtr)JSValueWrapper::JSObjectSetProperty;
58     callBacks.callFunction = (JSObjectCallFunctionProcPtr)JSValueWrapper::JSObjectCallFunction;
59 }
60 
JSObjectDispose(void * data)61 void JSValueWrapper::JSObjectDispose(void *data)
62 {
63     JSValueWrapper* ptr = (JSValueWrapper*)data;
64     delete ptr;
65 }
66 
67 
JSObjectCopyPropertyNames(void * data)68 CFArrayRef JSValueWrapper::JSObjectCopyPropertyNames(void *data)
69 {
70     JSGlueAPIEntry entry;
71 
72     CFMutableArrayRef result = 0;
73     JSValueWrapper* ptr = (JSValueWrapper*)data;
74     if (ptr)
75     {
76         ExecState* exec = getThreadGlobalExecState();
77         JSObject* object = ptr->GetValue().toObject(exec);
78         PropertyNameArray propNames(exec);
79         object->getPropertyNames(exec, propNames);
80         PropertyNameArray::const_iterator iterator = propNames.begin();
81 
82         while (iterator != propNames.end()) {
83             Identifier name = *iterator;
84             CFStringRef nameStr = IdentifierToCFString(name);
85 
86             if (!result)
87             {
88                 result = CFArrayCreateMutable(0, 0, &kCFTypeArrayCallBacks);
89             }
90             if (result && nameStr)
91             {
92                 CFArrayAppendValue(result, nameStr);
93             }
94             ReleaseCFType(nameStr);
95             iterator++;
96         }
97 
98     }
99     return result;
100 }
101 
102 
JSObjectCopyProperty(void * data,CFStringRef propertyName)103 JSObjectRef JSValueWrapper::JSObjectCopyProperty(void *data, CFStringRef propertyName)
104 {
105     JSGlueAPIEntry entry;
106 
107     JSObjectRef result = 0;
108     JSValueWrapper* ptr = (JSValueWrapper*)data;
109     if (ptr)
110     {
111         ExecState* exec = getThreadGlobalExecState();
112         JSValue propValue = ptr->GetValue().toObject(exec)->get(exec, CFStringToIdentifier(propertyName, exec));
113         JSValueWrapper* wrapperValue = new JSValueWrapper(propValue);
114 
115         JSObjectCallBacks callBacks;
116         GetJSObectCallBacks(callBacks);
117         result = JSObjectCreateInternal(wrapperValue, &callBacks, JSValueWrapper::JSObjectMark, kJSUserObjectDataTypeJSValueWrapper);
118 
119         if (!result)
120         {
121             delete wrapperValue;
122         }
123     }
124     return result;
125 }
126 
JSObjectSetProperty(void * data,CFStringRef propertyName,JSObjectRef jsValue)127 void JSValueWrapper::JSObjectSetProperty(void *data, CFStringRef propertyName, JSObjectRef jsValue)
128 {
129     JSGlueAPIEntry entry;
130 
131     JSValueWrapper* ptr = (JSValueWrapper*)data;
132     if (ptr)
133     {
134         ExecState* exec = getThreadGlobalExecState();
135         JSValue value = JSObjectKJSValue((JSUserObject*)jsValue);
136         JSObject *objValue = ptr->GetValue().toObject(exec);
137         PutPropertySlot slot;
138         objValue->put(exec, CFStringToIdentifier(propertyName, exec), value, slot);
139     }
140 }
141 
JSObjectCallFunction(void * data,JSObjectRef thisObj,CFArrayRef args)142 JSObjectRef JSValueWrapper::JSObjectCallFunction(void *data, JSObjectRef thisObj, CFArrayRef args)
143 {
144     JSGlueAPIEntry entry;
145 
146     JSObjectRef result = 0;
147     JSValueWrapper* ptr = (JSValueWrapper*)data;
148     if (ptr)
149     {
150         ExecState* exec = getThreadGlobalExecState();
151 
152         JSValue value = JSObjectKJSValue((JSUserObject*)thisObj);
153         JSObject* ksjThisObj = value.toObject(exec);
154         JSObject* objValue = ptr->GetValue().toObject(exec);
155 
156         MarkedArgumentBuffer listArgs;
157         CFIndex argCount = args ? CFArrayGetCount(args) : 0;
158         for (CFIndex i = 0; i < argCount; i++)
159         {
160             JSObjectRef jsArg = (JSObjectRef)CFArrayGetValueAtIndex(args, i);
161             JSValue kgsArg = JSObjectKJSValue((JSUserObject*)jsArg);
162             listArgs.append(kgsArg);
163         }
164 
165         CallData callData;
166         CallType callType = objValue->getCallData(callData);
167         if (callType == CallTypeNone)
168             return 0;
169         JSValue  resultValue = call(exec, objValue, callType, callData, ksjThisObj, listArgs);
170         JSValueWrapper* wrapperValue = new JSValueWrapper(resultValue);
171         JSObjectCallBacks callBacks;
172         GetJSObectCallBacks(callBacks);
173         result = JSObjectCreate(wrapperValue, &callBacks);
174         if (!result)
175         {
176             delete wrapperValue;
177         }
178     }
179     return result;
180 }
181 
JSObjectCopyCFValue(void * data)182 CFTypeRef JSValueWrapper::JSObjectCopyCFValue(void *data)
183 {
184     JSGlueAPIEntry entry;
185 
186     CFTypeRef result = 0;
187     JSValueWrapper* ptr = (JSValueWrapper*)data;
188     if (ptr)
189     {
190         result = KJSValueToCFType(ptr->GetValue(), getThreadGlobalExecState());
191     }
192     return result;
193 }
194 
JSObjectMark(void * data)195 void JSValueWrapper::JSObjectMark(void *data)
196 {
197 }
198