18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2005 Apple Computer, Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JavaScriptGlue.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSUtils.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSBase.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSObject.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSRun.h" 35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <JavaScriptCore/Completion.h> 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <JavaScriptCore/InitializeThreading.h> 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic CFTypeRef sJSCFNullRef = 0; 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void CFJSObjectDispose(void *data); 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic JSObjectRef CFJSObjectCopyProperty(void *data, CFStringRef propertyName); 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void CFJSObjectSetProperty(void *data, CFStringRef propertyName, JSObjectRef jsValue); 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic CFTypeRef CFJSObjectCopyCFValue(void *data); 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic UInt8 CFJSObjectEqual(void *data1, void *data2); 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic CFArrayRef CFJSObjectCopyPropertyNames(void *data); 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid *JSCFRetain(CFAllocatorRef allocator, const void *value); 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid JSCFRelease(CFAllocatorRef allocator, const void *value); 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid JSSetCFNull(CFTypeRef nullRef) 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ReleaseCFType(sJSCFNullRef); 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sJSCFNullRef = RetainCFType(nullRef); 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCFTypeRef JSGetCFNull(void) 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return sJSCFNullRef; 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSRetain 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectJSTypeRef JSRetain(JSTypeRef ref) 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ref) 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSBase* ptr = (JSBase*)ref; 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ptr->Retain(); 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ref; 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSRelease 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid JSRelease(JSTypeRef ref) 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ref) 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSBase* ptr = (JSBase*)ref; 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ptr->Release(); 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSCopyDescription 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCFStringRef JSCopyDescription(JSTypeRef ref) 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFStringRef result = 0; 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ref) 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSBase* ptr = (JSBase*)ref; 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ptr->CopyDescription(); 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSEqual 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectUInt8 JSEqual(JSTypeRef ref1, JSTypeRef ref2) 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UInt8 result = false; 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ref1 && ref2) 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSBase* ptr = (JSBase*)ref1; 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = ptr->Equal((JSBase*)ref2); 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSGetTypeID 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectJSTypeID JSGetTypeID(JSTypeRef ref) 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSTypeID result = kJSInvalidTypeID; 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ref) 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSBase* ptr = (JSBase*)ref; 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = ptr->GetTypeID(); 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSGetRetainCount 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCFIndex JSGetRetainCount(JSTypeRef ref) 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFIndex result = -1; 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ref) 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSBase* ptr = (JSBase*)ref; 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = ptr->RetainCount(); 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectCreate 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectJSObjectRef JSObjectCreate(void *data, JSObjectCallBacksPtr callBacks) 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectRef result = JSObjectCreateInternal(data, callBacks, 0, kJSUserObjectDataTypeUnknown); 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectCreateInternal 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectJSObjectRef JSObjectCreateInternal(void *data, JSObjectCallBacksPtr callBacks, JSObjectMarkProcPtr markProc, int type) 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectRef result = 0; 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSUserObject* ptr = new JSUserObject(callBacks, markProc, data, type); 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = (JSObjectRef)ptr; 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectCopyCFValue 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCFTypeRef JSObjectCopyCFValue(JSObjectRef ref) 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFTypeRef result = 0; 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSUserObject* ptr = (JSUserObject*)ref; 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ptr && (ptr->GetTypeID() == kJSObjectTypeID)) 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = ptr->CopyCFValue(); 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectGetData 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid *JSObjectGetData(JSObjectRef ref) 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void *result = 0; 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSUserObject* ptr = (JSUserObject*)ref; 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ptr && (ptr->GetTypeID() == kJSObjectTypeID)) 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = ptr->GetData(); 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectCopyProperty 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectJSObjectRef JSObjectCopyProperty(JSObjectRef ref, CFStringRef propertyName) 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectRef result = 0; 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSUserObject* ptr = (JSUserObject*)ref; 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ptr && (ptr->GetTypeID() == kJSObjectTypeID)) 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = (JSObjectRef)ptr->CopyProperty(propertyName); 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectSetProperty 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid JSObjectSetProperty(JSObjectRef ref, CFStringRef propertyName, JSObjectRef value) 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSUserObject* ptr = (JSUserObject*)ref; 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ptr && (ptr->GetTypeID() == kJSObjectTypeID)) 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ptr->SetProperty(propertyName, (JSUserObject*)value); 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectCallFunction 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectJSObjectRef JSObjectCallFunction(JSObjectRef ref, JSObjectRef thisObj, CFArrayRef args) 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectRef result = 0; 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSUserObject* ptr = (JSUserObject*)ref; 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ptr && (ptr->GetTypeID() == kJSObjectTypeID)) 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = (JSObjectRef)ptr->CallFunction((JSUserObject*)thisObj, args); 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSRunCreate 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectJSRunRef JSRunCreate(CFStringRef jsSource, JSFlags inFlags) 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initializeThreading(); 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSRunRef result = 0; 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (jsSource) 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 249d0825bca7fe65beaee391d30da42e937db621564Steve Block JSGlueAPIEntry entry; 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = (JSRunRef) new JSRun(jsSource, inFlags); 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSRunCopySource 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCFStringRef JSRunCopySource(JSRunRef ref) 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFStringRef result = 0; 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSRun* ptr = (JSRun*)ref; 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ptr) 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = UStringToCFString(ptr->GetSource()); 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSRunCopyGlobalObject 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectJSObjectRef JSRunCopyGlobalObject(JSRunRef ref) 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectRef result = 0; 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSRun* ptr = (JSRun*)ref; 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ptr) 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSGlobalObject* globalObject = ptr->GlobalObject(); 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = (JSObjectRef)KJSValueToJSObject(globalObject, globalObject->globalExec()); 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSRunEvaluate 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectJSObjectRef JSRunEvaluate(JSRunRef ref) 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectRef result = 0; 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSRun* ptr = (JSRun*)ref; 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ptr) 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 294d0825bca7fe65beaee391d30da42e937db621564Steve Block JSGlueAPIEntry entry; 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Completion completion = ptr->Evaluate(); 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (completion.isValueCompletion()) 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = (JSObjectRef)KJSValueToJSObject(completion.value(), ptr->GlobalObject()->globalExec()); 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (completion.complType() == Throw) 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSFlags flags = ptr->Flags(); 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (flags & kJSFlagDebug) 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFTypeRef error = JSObjectCopyCFValue(result); 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (error) 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFShow(error); 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRelease(error); 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSRunCheckSyntax 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Return true if no syntax error 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool JSRunCheckSyntax(JSRunRef ref) 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool result = false; 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSRun* ptr = (JSRun*)ref; 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ptr) 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 328d0825bca7fe65beaee391d30da42e937db621564Steve Block JSGlueAPIEntry entry; 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = ptr->CheckSyntax(); 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSCollect - trigger garbage collection 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid JSCollect() 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initializeThreading(); 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 341d0825bca7fe65beaee391d30da42e937db621564Steve Block JSGlueAPIEntry entry; 342d0825bca7fe65beaee391d30da42e937db621564Steve Block Heap* heap = getThreadGlobalExecState()->heap(); 343d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!heap->isBusy()) 344d0825bca7fe65beaee391d30da42e937db621564Steve Block heap->collectAllGarbage(); 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSTypeGetCFArrayCallBacks 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid JSTypeGetCFArrayCallBacks(CFArrayCallBacks* outCallBacks) 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (outCallBacks) 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project outCallBacks->version = 1; 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project outCallBacks->retain = (CFArrayRetainCallBack)JSCFRetain; 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project outCallBacks->release = (CFArrayReleaseCallBack)JSCFRelease; 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project outCallBacks->copyDescription = (CFArrayCopyDescriptionCallBack)JSCopyDescription; 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project outCallBacks->equal = (CFArrayEqualCallBack)JSEqual; 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSCFRetain 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid *JSCFRetain(CFAllocatorRef allocator, const void *value) 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSRetain((JSTypeRef)value); 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return (void*)value; 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSCFRelease 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid JSCFRelease(CFAllocatorRef allocator, const void *value) 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSRelease((JSTypeRef)value); 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectCreateWithCFType 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectJSObjectRef JSObjectCreateWithCFType(CFTypeRef inRef) 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectCallBacks callBacks; 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectRef cfJSObject = nil; 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (inRef) 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project callBacks.dispose = CFJSObjectDispose; 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project callBacks.equal = CFJSObjectEqual; 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project callBacks.copyCFValue = CFJSObjectCopyCFValue; 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project callBacks.copyProperty = CFJSObjectCopyProperty; 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project callBacks.setProperty = CFJSObjectSetProperty; 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project callBacks.callFunction = 0; 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project callBacks.copyPropertyNames = CFJSObjectCopyPropertyNames; 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cfJSObject = JSObjectCreateInternal((void*)CFRetain(inRef), &callBacks, 0, kJSUserObjectDataTypeCFType ); 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return cfJSObject; 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFJSObjectDispose 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CFJSObjectDispose(void *data) 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (data) 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRelease((JSTypeRef)data); 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCFArrayRef JSObjectCopyPropertyNames(JSObjectRef ref) 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFArrayRef result = 0; 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSUserObject* ptr = (JSUserObject*)ref; 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ptr && (ptr->GetTypeID() == kJSObjectTypeID)) 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = ptr->CopyPropertyNames(); 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFJSObjectCopyProperty 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectJSObjectRef CFJSObjectCopyProperty(void *data, CFStringRef propertyName) 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectRef result = 0; 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (data && propertyName) 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFTypeRef cfResult = 0; 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (CFGetTypeID(data) == CFDictionaryGetTypeID()) 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (CFStringCompare(propertyName, CFSTR("length"), 0) == kCFCompareEqualTo) 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int len = CFDictionaryGetCount((CFDictionaryRef)data); 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cfResult = CFNumberCreate(0, kCFNumberIntType, &len); 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cfResult = RetainCFType(CFDictionaryGetValue((CFDictionaryRef)data, propertyName)); 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (CFGetTypeID(data) == CFArrayGetTypeID()) 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (CFStringCompare(propertyName, CFSTR("length"), 0) == kCFCompareEqualTo) 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int len = CFArrayGetCount((CFArrayRef)data); 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cfResult = CFNumberCreate(0, kCFNumberIntType, &len); 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SInt32 index = CFStringGetIntValue(propertyName); 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFIndex arrayCount = CFArrayGetCount((CFArrayRef)data); 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (index >= 0 && index < arrayCount) 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cfResult = RetainCFType(CFArrayGetValueAtIndex((CFArrayRef)data, index)); 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (CFGetTypeID(data) == CFStringGetTypeID()) 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (CFStringCompare(propertyName, CFSTR("length"), 0) == kCFCompareEqualTo) 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int len = CFStringGetLength((CFStringRef)data); 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cfResult = CFNumberCreate(0, kCFNumberIntType, &len); 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cfResult) 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = JSObjectCreateWithCFType(cfResult); 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRelease(cfResult); 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFJSObjectSetProperty 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CFJSObjectSetProperty(void *data, CFStringRef propertyName, JSObjectRef jsValue) 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (data && propertyName) 4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFTypeRef cfValue = JSObjectCopyCFValue(jsValue); 4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cfValue) 4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (CFGetTypeID(data) == CFDictionaryGetTypeID()) 4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFDictionarySetValue((CFMutableDictionaryRef)data, propertyName, cfValue); 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (CFGetTypeID(data) == CFArrayGetTypeID()) 4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SInt32 index = CFStringGetIntValue(propertyName); 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFIndex arrayCount = CFArrayGetCount((CFArrayRef)data); 4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (index >= 0) 4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (; arrayCount < index; arrayCount++) 5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFArrayAppendValue((CFMutableArrayRef)data, GetCFNull()); 5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFArraySetValueAtIndex((CFMutableArrayRef)data, index, cfValue); 5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRelease(cfValue); 5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (CFGetTypeID(data) == CFDictionaryGetTypeID()) 5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFDictionaryRemoveValue((CFMutableDictionaryRef)data, propertyName); 5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (CFGetTypeID(data) == CFArrayGetTypeID()) 5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SInt32 index = CFStringGetIntValue(propertyName); 5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFIndex arrayCount = CFArrayGetCount((CFArrayRef)data); 5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (index >= 0) 5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (; arrayCount < index; arrayCount++) 5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFArrayAppendValue((CFMutableArrayRef)data, GetCFNull()); 5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFArraySetValueAtIndex((CFMutableArrayRef)data, index, GetCFNull()); 5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFJSObjectCopyCFValue 5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCFTypeRef CFJSObjectCopyCFValue(void *data) 5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFTypeRef result = 0; 5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (data) 5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project result = (CFTypeRef)CFRetain(data); 5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFJSObjectCopyCFValue 5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectUInt8 CFJSObjectEqual(void *data1, void *data2) 5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UInt8 result = false; 5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (data1 && data2) 5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFEqual((CFTypeRef)data1, (CFTypeRef)data2); 5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFJSObjectCopyPropertyNames 5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCFArrayRef CFJSObjectCopyPropertyNames(void *data) 5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFMutableArrayRef result = 0; 5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (data) 5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFTypeID cfType = CFGetTypeID(data); 5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cfType == CFDictionaryGetTypeID()) 5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFIndex count = CFDictionaryGetCount((CFDictionaryRef)data); 5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (count) 5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFTypeRef* keys = (CFTypeRef*)malloc(sizeof(CFTypeRef)*count); 5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (keys) 5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int i; 5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFDictionaryGetKeysAndValues((CFDictionaryRef)data, (const void **)keys, 0); 5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (i = 0; i < count; i++) 5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFStringRef key = (CFStringRef)keys[i]; 5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (CFGetTypeID(key) != CFStringGetTypeID()) continue; 5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!result) result = CFArrayCreateMutable(0, 0, &kCFTypeArrayCallBacks); 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!result) continue; 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFArrayAppendValue(result, key); 5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project free(keys); 5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCFMutableArrayRef JSCreateCFArrayFromJSArray(CFArrayRef array) 6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFIndex count = array ? CFArrayGetCount(array) : 0; 6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFMutableArrayRef cfArray = CFArrayCreateMutable(0, 0, &kCFTypeArrayCallBacks); 6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFIndex i; 6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (i = 0; cfArray && i < count; i++) 6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectRef jsValue = (JSObjectRef)CFArrayGetValueAtIndex(array, i); 6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFTypeRef cfvalue = JSObjectCopyCFValue(jsValue); 6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cfvalue) 6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFArrayAppendValue(cfArray, cfvalue); 6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRelease(cfvalue); 6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFArrayAppendValue(cfArray, GetCFNull()); 6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return cfArray; 6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCFMutableArrayRef JSCreateJSArrayFromCFArray(CFArrayRef array) 6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initializeThreading(); 6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFIndex count = array ? CFArrayGetCount(array) : 0; 6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFArrayCallBacks arrayCallbacks; 6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFMutableArrayRef jsArray; 6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFIndex i; 6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSTypeGetCFArrayCallBacks(&arrayCallbacks); 6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project jsArray = CFArrayCreateMutable(0, 0, &arrayCallbacks); 6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (i = 0; array && i < count; i++) 6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFTypeRef cfValue = (CFTypeRef)CFArrayGetValueAtIndex(array, i); 6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSObjectRef jsValue = JSObjectCreateWithCFType(cfValue); 6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!jsValue) jsValue = JSObjectCreateWithCFType(GetCFNull()); 6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (jsValue) 6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFArrayAppendValue(jsArray, jsValue); 6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSRelease(jsValue); 6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return jsArray; 6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid JSLockInterpreter() 6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initializeThreading(); 6540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JSLock::lock(LockForReal); 6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid JSUnlockInterpreter() 6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 6600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JSLock::unlock(LockForReal); 6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 662