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