blob: 80dcf579751504613ca0de7d5de254089597fae5 [file] [log] [blame]
ggaren2593cdc2006-06-21 21:09:19 +00001// -*- mode: c++; c-basic-offset: 4 -*-
2/*
darin@apple.come25e04e2008-02-24 05:01:27 +00003 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
ggaren2593cdc2006-06-21 21:09:19 +00004 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
darin@apple.com7f984872007-11-12 23:04:41 +000027#include "config.h"
28#include "JSObjectRef.h"
29
ggaren2593cdc2006-06-21 21:09:19 +000030#include "APICast.h"
ggaren08d9eec2006-07-02 04:06:07 +000031#include "JSCallbackConstructor.h"
32#include "JSCallbackFunction.h"
ggaren2593cdc2006-06-21 21:09:19 +000033#include "JSCallbackObject.h"
ggaren855855b2006-07-16 01:28:25 +000034#include "JSClassRef.h"
eseidel5417cd52007-10-25 06:38:35 +000035#include "JSGlobalObject.h"
darin@apple.come25e04e2008-02-24 05:01:27 +000036#include "JSValueRef.h"
ggaren@apple.com1b4d90b2007-12-06 02:31:41 +000037#include "PropertyNameArray.h"
ggarena98f0012006-07-05 17:46:00 +000038#include "function.h"
ggaren@apple.com1b4d90b2007-12-06 02:31:41 +000039#include "function_object.h"
40#include "identifier.h"
ggaren2593cdc2006-06-21 21:09:19 +000041#include "internal.h"
42#include "object.h"
ggaren@apple.com1b4d90b2007-12-06 02:31:41 +000043#include "object_object.h"
darin@apple.come25e04e2008-02-24 05:01:27 +000044#include <wtf/Platform.h>
ggaren2593cdc2006-06-21 21:09:19 +000045
46using namespace KJS;
47
darin3372da32007-08-02 00:30:08 +000048JSClassRef JSClassCreate(const JSClassDefinition* definition)
ggaren855855b2006-07-16 01:28:25 +000049{
ggaren76727c52007-01-28 02:58:47 +000050 JSLock lock;
andersca@apple.coma292f5d2008-02-19 22:09:48 +000051 RefPtr<OpaqueJSClass> jsClass = (definition->attributes & kJSClassAttributeNoAutomaticPrototype)
ggaren20b23b12006-10-12 20:42:56 +000052 ? OpaqueJSClass::createNoAutomaticPrototype(definition)
ggaren0503a4b2006-07-18 04:33:46 +000053 : OpaqueJSClass::create(definition);
54
andersca@apple.coma292f5d2008-02-19 22:09:48 +000055 return jsClass.release().releaseRef();
ggaren855855b2006-07-16 01:28:25 +000056}
57
58JSClassRef JSClassRetain(JSClassRef jsClass)
59{
ggaren76727c52007-01-28 02:58:47 +000060 JSLock lock;
ggaren@apple.com7911af22007-11-14 00:30:19 +000061 jsClass->ref();
ggaren855855b2006-07-16 01:28:25 +000062 return jsClass;
63}
64
65void JSClassRelease(JSClassRef jsClass)
66{
ggaren76727c52007-01-28 02:58:47 +000067 JSLock lock;
ggaren@apple.com7911af22007-11-14 00:30:19 +000068 jsClass->deref();
ggaren855855b2006-07-16 01:28:25 +000069}
70
ggaren0503a4b2006-07-18 04:33:46 +000071JSObjectRef JSObjectMake(JSContextRef ctx, JSClassRef jsClass, void* data)
ggaren39f19042006-07-17 10:49:28 +000072{
ggaren0503a4b2006-07-18 04:33:46 +000073 JSLock lock;
74 ExecState* exec = toJS(ctx);
75
ggaren20b23b12006-10-12 20:42:56 +000076 if (!jsClass)
ap@webkit.orga46b0002008-05-02 10:07:53 +000077 return toRef(new (exec) JSObject(exec->lexicalGlobalObject()->objectPrototype())); // slightly more efficient
ggaren0503a4b2006-07-18 04:33:46 +000078
ggaren20b23b12006-10-12 20:42:56 +000079 JSValue* jsPrototype = jsClass->prototype(ctx);
80 if (!jsPrototype)
ggaren@apple.com1b4d90b2007-12-06 02:31:41 +000081 jsPrototype = exec->lexicalGlobalObject()->objectPrototype();
ggaren2593cdc2006-06-21 21:09:19 +000082
ap@webkit.orga46b0002008-05-02 10:07:53 +000083 return toRef(new (exec) JSCallbackObject<JSObject>(exec, jsClass, jsPrototype, data));
ggaren2593cdc2006-06-21 21:09:19 +000084}
85
mjs127f8592006-07-17 08:14:39 +000086JSObjectRef JSObjectMakeFunctionWithCallback(JSContextRef ctx, JSStringRef name, JSObjectCallAsFunctionCallback callAsFunction)
ggaren2593cdc2006-06-21 21:09:19 +000087{
ggaren08d9eec2006-07-02 04:06:07 +000088 JSLock lock;
mjs127f8592006-07-17 08:14:39 +000089 ExecState* exec = toJS(ctx);
ggarena2d061c2006-07-16 22:17:04 +000090 Identifier nameID = name ? Identifier(toJS(name)) : Identifier("anonymous");
91
ap@webkit.orga46b0002008-05-02 10:07:53 +000092 return toRef(new (exec) JSCallbackFunction(exec, callAsFunction, nameID));
ggaren2593cdc2006-06-21 21:09:19 +000093}
94
ggaren0503a4b2006-07-18 04:33:46 +000095JSObjectRef JSObjectMakeConstructor(JSContextRef ctx, JSClassRef jsClass, JSObjectCallAsConstructorCallback callAsConstructor)
ggarendcc6aea2006-06-26 03:12:18 +000096{
ggaren08d9eec2006-07-02 04:06:07 +000097 JSLock lock;
mjs127f8592006-07-17 08:14:39 +000098 ExecState* exec = toJS(ctx);
ggaren55ae6eb2006-07-17 08:20:28 +000099
ggaren0503a4b2006-07-18 04:33:46 +0000100 JSValue* jsPrototype = jsClass
101 ? jsClass->prototype(ctx)
ggaren@apple.com1b4d90b2007-12-06 02:31:41 +0000102 : exec->dynamicGlobalObject()->objectPrototype();
ggaren55ae6eb2006-07-17 08:20:28 +0000103
ap@webkit.orga46b0002008-05-02 10:07:53 +0000104 JSCallbackConstructor* constructor = new (exec) JSCallbackConstructor(exec, jsClass, callAsConstructor);
darin@apple.com8e21ef12008-02-06 17:33:07 +0000105 constructor->putDirect(exec->propertyNames().prototype, jsPrototype, DontEnum | DontDelete | ReadOnly);
ggaren55ae6eb2006-07-17 08:20:28 +0000106 return toRef(constructor);
ggarena98f0012006-07-05 17:46:00 +0000107}
108
mjs127f8592006-07-17 08:14:39 +0000109JSObjectRef JSObjectMakeFunction(JSContextRef ctx, JSStringRef name, unsigned parameterCount, const JSStringRef parameterNames[], JSStringRef body, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception)
ggarena98f0012006-07-05 17:46:00 +0000110{
111 JSLock lock;
112
mjs127f8592006-07-17 08:14:39 +0000113 ExecState* exec = toJS(ctx);
ggarena98f0012006-07-05 17:46:00 +0000114 UString::Rep* bodyRep = toJS(body);
ggareneafa7e72006-07-16 01:40:07 +0000115 UString::Rep* sourceURLRep = sourceURL ? toJS(sourceURL) : &UString::Rep::null;
ggaren554ad6f2006-07-08 02:02:47 +0000116
ggarena2d061c2006-07-16 22:17:04 +0000117 Identifier nameID = name ? Identifier(toJS(name)) : Identifier("anonymous");
ggareneafa7e72006-07-16 01:40:07 +0000118
119 List args;
120 for (unsigned i = 0; i < parameterCount; i++)
ap@webkit.orga46b0002008-05-02 10:07:53 +0000121 args.append(jsString(exec, UString(toJS(parameterNames[i]))));
122 args.append(jsString(exec, UString(bodyRep)));
ggarena98f0012006-07-05 17:46:00 +0000123
ggaren@apple.com1b4d90b2007-12-06 02:31:41 +0000124 JSObject* result = exec->dynamicGlobalObject()->functionConstructor()->construct(exec, args, nameID, UString(sourceURLRep), startingLineNumber);
ggareneafa7e72006-07-16 01:40:07 +0000125 if (exec->hadException()) {
126 if (exception)
127 *exception = toRef(exec->exception());
128 exec->clearException();
129 result = 0;
130 }
131 return toRef(result);
ggarendcc6aea2006-06-26 03:12:18 +0000132}
133
mjs127f8592006-07-17 08:14:39 +0000134JSValueRef JSObjectGetPrototype(JSContextRef, JSObjectRef object)
ggaren2593cdc2006-06-21 21:09:19 +0000135{
136 JSObject* jsObject = toJS(object);
137 return toRef(jsObject->prototype());
138}
139
mjs127f8592006-07-17 08:14:39 +0000140void JSObjectSetPrototype(JSContextRef, JSObjectRef object, JSValueRef value)
ggaren2593cdc2006-06-21 21:09:19 +0000141{
142 JSObject* jsObject = toJS(object);
143 JSValue* jsValue = toJS(value);
144
145 jsObject->setPrototype(jsValue);
146}
147
mjs127f8592006-07-17 08:14:39 +0000148bool JSObjectHasProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName)
ggaren2593cdc2006-06-21 21:09:19 +0000149{
150 JSLock lock;
mjs127f8592006-07-17 08:14:39 +0000151 ExecState* exec = toJS(ctx);
ggaren2593cdc2006-06-21 21:09:19 +0000152 JSObject* jsObject = toJS(object);
153 UString::Rep* nameRep = toJS(propertyName);
154
155 return jsObject->hasProperty(exec, Identifier(nameRep));
156}
157
mjs127f8592006-07-17 08:14:39 +0000158JSValueRef JSObjectGetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception)
ggaren2593cdc2006-06-21 21:09:19 +0000159{
160 JSLock lock;
mjs127f8592006-07-17 08:14:39 +0000161 ExecState* exec = toJS(ctx);
ggaren2593cdc2006-06-21 21:09:19 +0000162 JSObject* jsObject = toJS(object);
163 UString::Rep* nameRep = toJS(propertyName);
164
ggaren554ad6f2006-07-08 02:02:47 +0000165 JSValue* jsValue = jsObject->get(exec, Identifier(nameRep));
ggaren292e70e2006-07-15 04:10:31 +0000166 if (exec->hadException()) {
167 if (exception)
168 *exception = toRef(exec->exception());
169 exec->clearException();
170 }
ggaren20c233d2006-07-10 21:17:26 +0000171 return toRef(jsValue);
ggaren2593cdc2006-06-21 21:09:19 +0000172}
173
mjs127f8592006-07-17 08:14:39 +0000174void JSObjectSetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef value, JSPropertyAttributes attributes, JSValueRef* exception)
ggaren2593cdc2006-06-21 21:09:19 +0000175{
176 JSLock lock;
mjs127f8592006-07-17 08:14:39 +0000177 ExecState* exec = toJS(ctx);
ggaren2593cdc2006-06-21 21:09:19 +0000178 JSObject* jsObject = toJS(object);
darin@apple.come25e04e2008-02-24 05:01:27 +0000179 Identifier name(toJS(propertyName));
ggaren2593cdc2006-06-21 21:09:19 +0000180 JSValue* jsValue = toJS(value);
darin@apple.come25e04e2008-02-24 05:01:27 +0000181
weinig@apple.com6ae58b32008-04-16 20:58:46 +0000182 if (attributes && !jsObject->hasProperty(exec, name))
183 jsObject->putWithAttributes(exec, name, jsValue, attributes);
184 else
185 jsObject->put(exec, name, jsValue);
darin@apple.come25e04e2008-02-24 05:01:27 +0000186
ggaren292e70e2006-07-15 04:10:31 +0000187 if (exec->hadException()) {
188 if (exception)
189 *exception = toRef(exec->exception());
190 exec->clearException();
191 }
mjs57c2ec12006-07-14 20:53:38 +0000192}
193
mjs127f8592006-07-17 08:14:39 +0000194JSValueRef JSObjectGetPropertyAtIndex(JSContextRef ctx, JSObjectRef object, unsigned propertyIndex, JSValueRef* exception)
mjs57c2ec12006-07-14 20:53:38 +0000195{
196 JSLock lock;
mjs127f8592006-07-17 08:14:39 +0000197 ExecState* exec = toJS(ctx);
mjs57c2ec12006-07-14 20:53:38 +0000198 JSObject* jsObject = toJS(object);
199
200 JSValue* jsValue = jsObject->get(exec, propertyIndex);
ggaren747b08b2006-07-17 02:00:40 +0000201 if (exec->hadException()) {
202 if (exception)
203 *exception = toRef(exec->exception());
204 exec->clearException();
205 }
mjs57c2ec12006-07-14 20:53:38 +0000206 return toRef(jsValue);
207}
208
209
mjs127f8592006-07-17 08:14:39 +0000210void JSObjectSetPropertyAtIndex(JSContextRef ctx, JSObjectRef object, unsigned propertyIndex, JSValueRef value, JSValueRef* exception)
mjs57c2ec12006-07-14 20:53:38 +0000211{
212 JSLock lock;
mjs127f8592006-07-17 08:14:39 +0000213 ExecState* exec = toJS(ctx);
mjs57c2ec12006-07-14 20:53:38 +0000214 JSObject* jsObject = toJS(object);
215 JSValue* jsValue = toJS(value);
216
217 jsObject->put(exec, propertyIndex, jsValue);
ggaren747b08b2006-07-17 02:00:40 +0000218 if (exec->hadException()) {
219 if (exception)
220 *exception = toRef(exec->exception());
221 exec->clearException();
222 }
ggaren2593cdc2006-06-21 21:09:19 +0000223}
224
mjs127f8592006-07-17 08:14:39 +0000225bool JSObjectDeleteProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception)
ggaren2593cdc2006-06-21 21:09:19 +0000226{
227 JSLock lock;
mjs127f8592006-07-17 08:14:39 +0000228 ExecState* exec = toJS(ctx);
ggaren2593cdc2006-06-21 21:09:19 +0000229 JSObject* jsObject = toJS(object);
230 UString::Rep* nameRep = toJS(propertyName);
231
ggaren292e70e2006-07-15 04:10:31 +0000232 bool result = jsObject->deleteProperty(exec, Identifier(nameRep));
233 if (exec->hadException()) {
234 if (exception)
235 *exception = toRef(exec->exception());
236 exec->clearException();
237 }
238 return result;
ggaren2593cdc2006-06-21 21:09:19 +0000239}
240
241void* JSObjectGetPrivate(JSObjectRef object)
242{
243 JSObject* jsObject = toJS(object);
244
eseidel5417cd52007-10-25 06:38:35 +0000245 if (jsObject->inherits(&JSCallbackObject<JSGlobalObject>::info))
246 return static_cast<JSCallbackObject<JSGlobalObject>*>(jsObject)->getPrivate();
247 else if (jsObject->inherits(&JSCallbackObject<JSObject>::info))
248 return static_cast<JSCallbackObject<JSObject>*>(jsObject)->getPrivate();
ggaren2593cdc2006-06-21 21:09:19 +0000249
ggaren554ad6f2006-07-08 02:02:47 +0000250 return 0;
ggaren2593cdc2006-06-21 21:09:19 +0000251}
252
253bool JSObjectSetPrivate(JSObjectRef object, void* data)
254{
255 JSObject* jsObject = toJS(object);
256
eseidel5417cd52007-10-25 06:38:35 +0000257 if (jsObject->inherits(&JSCallbackObject<JSGlobalObject>::info)) {
258 static_cast<JSCallbackObject<JSGlobalObject>*>(jsObject)->setPrivate(data);
259 return true;
260 } else if (jsObject->inherits(&JSCallbackObject<JSObject>::info)) {
261 static_cast<JSCallbackObject<JSObject>*>(jsObject)->setPrivate(data);
ggaren554ad6f2006-07-08 02:02:47 +0000262 return true;
263 }
264
ggaren554ad6f2006-07-08 02:02:47 +0000265 return false;
ggaren2593cdc2006-06-21 21:09:19 +0000266}
267
mjs127f8592006-07-17 08:14:39 +0000268bool JSObjectIsFunction(JSContextRef, JSObjectRef object)
ggaren2593cdc2006-06-21 21:09:19 +0000269{
270 JSObject* jsObject = toJS(object);
271 return jsObject->implementsCall();
272}
273
mjs127f8592006-07-17 08:14:39 +0000274JSValueRef JSObjectCallAsFunction(JSContextRef ctx, JSObjectRef object, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
ggaren2593cdc2006-06-21 21:09:19 +0000275{
276 JSLock lock;
mjs127f8592006-07-17 08:14:39 +0000277 ExecState* exec = toJS(ctx);
ggaren2593cdc2006-06-21 21:09:19 +0000278 JSObject* jsObject = toJS(object);
279 JSObject* jsThisObject = toJS(thisObject);
280
ggaren9c67b7a2006-07-08 17:42:39 +0000281 if (!jsThisObject)
weinig@apple.com41dbaab2008-04-09 02:17:49 +0000282 jsThisObject = exec->globalThisValue();
283
ggaren2593cdc2006-06-21 21:09:19 +0000284 List argList;
ggarene806fb82006-07-15 04:16:30 +0000285 for (size_t i = 0; i < argumentCount; i++)
286 argList.append(toJS(arguments[i]));
ggaren554ad6f2006-07-08 02:02:47 +0000287
288 JSValueRef result = toRef(jsObject->call(exec, jsThisObject, argList)); // returns NULL if object->implementsCall() is false
ggaren2593cdc2006-06-21 21:09:19 +0000289 if (exec->hadException()) {
ggaren84f78e52006-07-04 02:35:09 +0000290 if (exception)
ggaren20c233d2006-07-10 21:17:26 +0000291 *exception = toRef(exec->exception());
ggaren2593cdc2006-06-21 21:09:19 +0000292 exec->clearException();
ggaren7944ca32006-07-08 17:53:08 +0000293 result = 0;
ggaren2593cdc2006-06-21 21:09:19 +0000294 }
ggaren84f78e52006-07-04 02:35:09 +0000295 return result;
ggaren2593cdc2006-06-21 21:09:19 +0000296}
297
mjs127f8592006-07-17 08:14:39 +0000298bool JSObjectIsConstructor(JSContextRef, JSObjectRef object)
ggaren2593cdc2006-06-21 21:09:19 +0000299{
300 JSObject* jsObject = toJS(object);
301 return jsObject->implementsConstruct();
302}
303
mjs127f8592006-07-17 08:14:39 +0000304JSObjectRef JSObjectCallAsConstructor(JSContextRef ctx, JSObjectRef object, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
ggaren2593cdc2006-06-21 21:09:19 +0000305{
306 JSLock lock;
mjs127f8592006-07-17 08:14:39 +0000307 ExecState* exec = toJS(ctx);
ggaren2593cdc2006-06-21 21:09:19 +0000308 JSObject* jsObject = toJS(object);
309
310 List argList;
ggarene806fb82006-07-15 04:16:30 +0000311 for (size_t i = 0; i < argumentCount; i++)
312 argList.append(toJS(arguments[i]));
ggaren2593cdc2006-06-21 21:09:19 +0000313
ggaren554ad6f2006-07-08 02:02:47 +0000314 JSObjectRef result = toRef(jsObject->construct(exec, argList)); // returns NULL if object->implementsCall() is false
ggaren2593cdc2006-06-21 21:09:19 +0000315 if (exec->hadException()) {
ggaren84f78e52006-07-04 02:35:09 +0000316 if (exception)
ggaren20c233d2006-07-10 21:17:26 +0000317 *exception = toRef(exec->exception());
ggaren2593cdc2006-06-21 21:09:19 +0000318 exec->clearException();
ggaren7944ca32006-07-08 17:53:08 +0000319 result = 0;
ggaren2593cdc2006-06-21 21:09:19 +0000320 }
ggaren84f78e52006-07-04 02:35:09 +0000321 return result;
ggaren2593cdc2006-06-21 21:09:19 +0000322}
323
ggarendd0d0e12006-07-17 04:41:01 +0000324struct OpaqueJSPropertyNameArray
ggaren2593cdc2006-06-21 21:09:19 +0000325{
ggarendd0d0e12006-07-17 04:41:01 +0000326 OpaqueJSPropertyNameArray() : refCount(0)
ggaren2593cdc2006-06-21 21:09:19 +0000327 {
328 }
329
330 unsigned refCount;
mjsb3598b82006-07-16 21:06:28 +0000331 PropertyNameArray array;
ggaren2593cdc2006-06-21 21:09:19 +0000332};
333
mjs127f8592006-07-17 08:14:39 +0000334JSPropertyNameArrayRef JSObjectCopyPropertyNames(JSContextRef ctx, JSObjectRef object)
ggaren2593cdc2006-06-21 21:09:19 +0000335{
336 JSLock lock;
ggaren2593cdc2006-06-21 21:09:19 +0000337 JSObject* jsObject = toJS(object);
mjs127f8592006-07-17 08:14:39 +0000338 ExecState* exec = toJS(ctx);
ggaren2593cdc2006-06-21 21:09:19 +0000339
ggarendd0d0e12006-07-17 04:41:01 +0000340 JSPropertyNameArrayRef propertyNames = new OpaqueJSPropertyNameArray();
mjsb3598b82006-07-16 21:06:28 +0000341 jsObject->getPropertyNames(exec, propertyNames->array);
ggaren2593cdc2006-06-21 21:09:19 +0000342
mjsb3598b82006-07-16 21:06:28 +0000343 return JSPropertyNameArrayRetain(propertyNames);
ggaren2593cdc2006-06-21 21:09:19 +0000344}
345
mjsb3598b82006-07-16 21:06:28 +0000346JSPropertyNameArrayRef JSPropertyNameArrayRetain(JSPropertyNameArrayRef array)
ggaren2593cdc2006-06-21 21:09:19 +0000347{
ggaren76727c52007-01-28 02:58:47 +0000348 JSLock lock;
mjsb3598b82006-07-16 21:06:28 +0000349 ++array->refCount;
350 return array;
ggaren2593cdc2006-06-21 21:09:19 +0000351}
352
mjsb3598b82006-07-16 21:06:28 +0000353void JSPropertyNameArrayRelease(JSPropertyNameArrayRef array)
ggaren2593cdc2006-06-21 21:09:19 +0000354{
ggaren76727c52007-01-28 02:58:47 +0000355 JSLock lock;
mjsb3598b82006-07-16 21:06:28 +0000356 if (--array->refCount == 0)
357 delete array;
ggaren2593cdc2006-06-21 21:09:19 +0000358}
359
mjsb3598b82006-07-16 21:06:28 +0000360size_t JSPropertyNameArrayGetCount(JSPropertyNameArrayRef array)
ggaren2593cdc2006-06-21 21:09:19 +0000361{
mjsb3598b82006-07-16 21:06:28 +0000362 return array->array.size();
ggaren2593cdc2006-06-21 21:09:19 +0000363}
364
mjsb3598b82006-07-16 21:06:28 +0000365JSStringRef JSPropertyNameArrayGetNameAtIndex(JSPropertyNameArrayRef array, size_t index)
366{
darinb847b442006-10-27 16:48:28 +0000367 return toRef(array->array[static_cast<unsigned>(index)].ustring().rep());
mjsb3598b82006-07-16 21:06:28 +0000368}
369
370void JSPropertyNameAccumulatorAddName(JSPropertyNameAccumulatorRef array, JSStringRef propertyName)
ggaren2593cdc2006-06-21 21:09:19 +0000371{
372 JSLock lock;
mjsb3598b82006-07-16 21:06:28 +0000373 PropertyNameArray* propertyNames = toJS(array);
ggaren2593cdc2006-06-21 21:09:19 +0000374 UString::Rep* rep = toJS(propertyName);
darin@apple.com3beb3002008-04-28 05:59:07 +0000375 propertyNames->add(rep);
ggaren2593cdc2006-06-21 21:09:19 +0000376}