ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 1 | // -*- mode: c++; c-basic-offset: 4 -*- |
| 2 | /* |
darin@apple.com | e25e04e | 2008-02-24 05:01:27 +0000 | [diff] [blame] | 3 | * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 4 | * |
| 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.com | 7f98487 | 2007-11-12 23:04:41 +0000 | [diff] [blame] | 27 | #include "config.h" |
| 28 | #include "JSObjectRef.h" |
| 29 | |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 30 | #include "APICast.h" |
ggaren | 08d9eec | 2006-07-02 04:06:07 +0000 | [diff] [blame] | 31 | #include "JSCallbackConstructor.h" |
| 32 | #include "JSCallbackFunction.h" |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 33 | #include "JSCallbackObject.h" |
ggaren | 855855b | 2006-07-16 01:28:25 +0000 | [diff] [blame] | 34 | #include "JSClassRef.h" |
eseidel | 5417cd5 | 2007-10-25 06:38:35 +0000 | [diff] [blame] | 35 | #include "JSGlobalObject.h" |
darin@apple.com | e25e04e | 2008-02-24 05:01:27 +0000 | [diff] [blame] | 36 | #include "JSValueRef.h" |
ggaren@apple.com | 1b4d90b | 2007-12-06 02:31:41 +0000 | [diff] [blame] | 37 | #include "PropertyNameArray.h" |
ggaren | a98f001 | 2006-07-05 17:46:00 +0000 | [diff] [blame] | 38 | #include "function.h" |
ggaren@apple.com | 1b4d90b | 2007-12-06 02:31:41 +0000 | [diff] [blame] | 39 | #include "function_object.h" |
| 40 | #include "identifier.h" |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 41 | #include "internal.h" |
| 42 | #include "object.h" |
ggaren@apple.com | 1b4d90b | 2007-12-06 02:31:41 +0000 | [diff] [blame] | 43 | #include "object_object.h" |
darin@apple.com | e25e04e | 2008-02-24 05:01:27 +0000 | [diff] [blame] | 44 | #include <wtf/Platform.h> |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 45 | |
| 46 | using namespace KJS; |
| 47 | |
darin | 3372da3 | 2007-08-02 00:30:08 +0000 | [diff] [blame] | 48 | JSClassRef JSClassCreate(const JSClassDefinition* definition) |
ggaren | 855855b | 2006-07-16 01:28:25 +0000 | [diff] [blame] | 49 | { |
ggaren | 76727c5 | 2007-01-28 02:58:47 +0000 | [diff] [blame] | 50 | JSLock lock; |
andersca@apple.com | a292f5d | 2008-02-19 22:09:48 +0000 | [diff] [blame] | 51 | RefPtr<OpaqueJSClass> jsClass = (definition->attributes & kJSClassAttributeNoAutomaticPrototype) |
ggaren | 20b23b1 | 2006-10-12 20:42:56 +0000 | [diff] [blame] | 52 | ? OpaqueJSClass::createNoAutomaticPrototype(definition) |
ggaren | 0503a4b | 2006-07-18 04:33:46 +0000 | [diff] [blame] | 53 | : OpaqueJSClass::create(definition); |
| 54 | |
andersca@apple.com | a292f5d | 2008-02-19 22:09:48 +0000 | [diff] [blame] | 55 | return jsClass.release().releaseRef(); |
ggaren | 855855b | 2006-07-16 01:28:25 +0000 | [diff] [blame] | 56 | } |
| 57 | |
| 58 | JSClassRef JSClassRetain(JSClassRef jsClass) |
| 59 | { |
ggaren | 76727c5 | 2007-01-28 02:58:47 +0000 | [diff] [blame] | 60 | JSLock lock; |
ggaren@apple.com | 7911af2 | 2007-11-14 00:30:19 +0000 | [diff] [blame] | 61 | jsClass->ref(); |
ggaren | 855855b | 2006-07-16 01:28:25 +0000 | [diff] [blame] | 62 | return jsClass; |
| 63 | } |
| 64 | |
| 65 | void JSClassRelease(JSClassRef jsClass) |
| 66 | { |
ggaren | 76727c5 | 2007-01-28 02:58:47 +0000 | [diff] [blame] | 67 | JSLock lock; |
ggaren@apple.com | 7911af2 | 2007-11-14 00:30:19 +0000 | [diff] [blame] | 68 | jsClass->deref(); |
ggaren | 855855b | 2006-07-16 01:28:25 +0000 | [diff] [blame] | 69 | } |
| 70 | |
ggaren | 0503a4b | 2006-07-18 04:33:46 +0000 | [diff] [blame] | 71 | JSObjectRef JSObjectMake(JSContextRef ctx, JSClassRef jsClass, void* data) |
ggaren | 39f1904 | 2006-07-17 10:49:28 +0000 | [diff] [blame] | 72 | { |
ggaren | 0503a4b | 2006-07-18 04:33:46 +0000 | [diff] [blame] | 73 | JSLock lock; |
| 74 | ExecState* exec = toJS(ctx); |
| 75 | |
ggaren | 20b23b1 | 2006-10-12 20:42:56 +0000 | [diff] [blame] | 76 | if (!jsClass) |
ap@webkit.org | a46b000 | 2008-05-02 10:07:53 +0000 | [diff] [blame^] | 77 | return toRef(new (exec) JSObject(exec->lexicalGlobalObject()->objectPrototype())); // slightly more efficient |
ggaren | 0503a4b | 2006-07-18 04:33:46 +0000 | [diff] [blame] | 78 | |
ggaren | 20b23b1 | 2006-10-12 20:42:56 +0000 | [diff] [blame] | 79 | JSValue* jsPrototype = jsClass->prototype(ctx); |
| 80 | if (!jsPrototype) |
ggaren@apple.com | 1b4d90b | 2007-12-06 02:31:41 +0000 | [diff] [blame] | 81 | jsPrototype = exec->lexicalGlobalObject()->objectPrototype(); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 82 | |
ap@webkit.org | a46b000 | 2008-05-02 10:07:53 +0000 | [diff] [blame^] | 83 | return toRef(new (exec) JSCallbackObject<JSObject>(exec, jsClass, jsPrototype, data)); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 84 | } |
| 85 | |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 86 | JSObjectRef JSObjectMakeFunctionWithCallback(JSContextRef ctx, JSStringRef name, JSObjectCallAsFunctionCallback callAsFunction) |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 87 | { |
ggaren | 08d9eec | 2006-07-02 04:06:07 +0000 | [diff] [blame] | 88 | JSLock lock; |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 89 | ExecState* exec = toJS(ctx); |
ggaren | a2d061c | 2006-07-16 22:17:04 +0000 | [diff] [blame] | 90 | Identifier nameID = name ? Identifier(toJS(name)) : Identifier("anonymous"); |
| 91 | |
ap@webkit.org | a46b000 | 2008-05-02 10:07:53 +0000 | [diff] [blame^] | 92 | return toRef(new (exec) JSCallbackFunction(exec, callAsFunction, nameID)); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 93 | } |
| 94 | |
ggaren | 0503a4b | 2006-07-18 04:33:46 +0000 | [diff] [blame] | 95 | JSObjectRef JSObjectMakeConstructor(JSContextRef ctx, JSClassRef jsClass, JSObjectCallAsConstructorCallback callAsConstructor) |
ggaren | dcc6aea | 2006-06-26 03:12:18 +0000 | [diff] [blame] | 96 | { |
ggaren | 08d9eec | 2006-07-02 04:06:07 +0000 | [diff] [blame] | 97 | JSLock lock; |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 98 | ExecState* exec = toJS(ctx); |
ggaren | 55ae6eb | 2006-07-17 08:20:28 +0000 | [diff] [blame] | 99 | |
ggaren | 0503a4b | 2006-07-18 04:33:46 +0000 | [diff] [blame] | 100 | JSValue* jsPrototype = jsClass |
| 101 | ? jsClass->prototype(ctx) |
ggaren@apple.com | 1b4d90b | 2007-12-06 02:31:41 +0000 | [diff] [blame] | 102 | : exec->dynamicGlobalObject()->objectPrototype(); |
ggaren | 55ae6eb | 2006-07-17 08:20:28 +0000 | [diff] [blame] | 103 | |
ap@webkit.org | a46b000 | 2008-05-02 10:07:53 +0000 | [diff] [blame^] | 104 | JSCallbackConstructor* constructor = new (exec) JSCallbackConstructor(exec, jsClass, callAsConstructor); |
darin@apple.com | 8e21ef1 | 2008-02-06 17:33:07 +0000 | [diff] [blame] | 105 | constructor->putDirect(exec->propertyNames().prototype, jsPrototype, DontEnum | DontDelete | ReadOnly); |
ggaren | 55ae6eb | 2006-07-17 08:20:28 +0000 | [diff] [blame] | 106 | return toRef(constructor); |
ggaren | a98f001 | 2006-07-05 17:46:00 +0000 | [diff] [blame] | 107 | } |
| 108 | |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 109 | JSObjectRef JSObjectMakeFunction(JSContextRef ctx, JSStringRef name, unsigned parameterCount, const JSStringRef parameterNames[], JSStringRef body, JSStringRef sourceURL, int startingLineNumber, JSValueRef* exception) |
ggaren | a98f001 | 2006-07-05 17:46:00 +0000 | [diff] [blame] | 110 | { |
| 111 | JSLock lock; |
| 112 | |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 113 | ExecState* exec = toJS(ctx); |
ggaren | a98f001 | 2006-07-05 17:46:00 +0000 | [diff] [blame] | 114 | UString::Rep* bodyRep = toJS(body); |
ggaren | eafa7e7 | 2006-07-16 01:40:07 +0000 | [diff] [blame] | 115 | UString::Rep* sourceURLRep = sourceURL ? toJS(sourceURL) : &UString::Rep::null; |
ggaren | 554ad6f | 2006-07-08 02:02:47 +0000 | [diff] [blame] | 116 | |
ggaren | a2d061c | 2006-07-16 22:17:04 +0000 | [diff] [blame] | 117 | Identifier nameID = name ? Identifier(toJS(name)) : Identifier("anonymous"); |
ggaren | eafa7e7 | 2006-07-16 01:40:07 +0000 | [diff] [blame] | 118 | |
| 119 | List args; |
| 120 | for (unsigned i = 0; i < parameterCount; i++) |
ap@webkit.org | a46b000 | 2008-05-02 10:07:53 +0000 | [diff] [blame^] | 121 | args.append(jsString(exec, UString(toJS(parameterNames[i])))); |
| 122 | args.append(jsString(exec, UString(bodyRep))); |
ggaren | a98f001 | 2006-07-05 17:46:00 +0000 | [diff] [blame] | 123 | |
ggaren@apple.com | 1b4d90b | 2007-12-06 02:31:41 +0000 | [diff] [blame] | 124 | JSObject* result = exec->dynamicGlobalObject()->functionConstructor()->construct(exec, args, nameID, UString(sourceURLRep), startingLineNumber); |
ggaren | eafa7e7 | 2006-07-16 01:40:07 +0000 | [diff] [blame] | 125 | if (exec->hadException()) { |
| 126 | if (exception) |
| 127 | *exception = toRef(exec->exception()); |
| 128 | exec->clearException(); |
| 129 | result = 0; |
| 130 | } |
| 131 | return toRef(result); |
ggaren | dcc6aea | 2006-06-26 03:12:18 +0000 | [diff] [blame] | 132 | } |
| 133 | |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 134 | JSValueRef JSObjectGetPrototype(JSContextRef, JSObjectRef object) |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 135 | { |
| 136 | JSObject* jsObject = toJS(object); |
| 137 | return toRef(jsObject->prototype()); |
| 138 | } |
| 139 | |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 140 | void JSObjectSetPrototype(JSContextRef, JSObjectRef object, JSValueRef value) |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 141 | { |
| 142 | JSObject* jsObject = toJS(object); |
| 143 | JSValue* jsValue = toJS(value); |
| 144 | |
| 145 | jsObject->setPrototype(jsValue); |
| 146 | } |
| 147 | |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 148 | bool JSObjectHasProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName) |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 149 | { |
| 150 | JSLock lock; |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 151 | ExecState* exec = toJS(ctx); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 152 | JSObject* jsObject = toJS(object); |
| 153 | UString::Rep* nameRep = toJS(propertyName); |
| 154 | |
| 155 | return jsObject->hasProperty(exec, Identifier(nameRep)); |
| 156 | } |
| 157 | |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 158 | JSValueRef JSObjectGetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception) |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 159 | { |
| 160 | JSLock lock; |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 161 | ExecState* exec = toJS(ctx); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 162 | JSObject* jsObject = toJS(object); |
| 163 | UString::Rep* nameRep = toJS(propertyName); |
| 164 | |
ggaren | 554ad6f | 2006-07-08 02:02:47 +0000 | [diff] [blame] | 165 | JSValue* jsValue = jsObject->get(exec, Identifier(nameRep)); |
ggaren | 292e70e | 2006-07-15 04:10:31 +0000 | [diff] [blame] | 166 | if (exec->hadException()) { |
| 167 | if (exception) |
| 168 | *exception = toRef(exec->exception()); |
| 169 | exec->clearException(); |
| 170 | } |
ggaren | 20c233d | 2006-07-10 21:17:26 +0000 | [diff] [blame] | 171 | return toRef(jsValue); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 172 | } |
| 173 | |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 174 | void JSObjectSetProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef value, JSPropertyAttributes attributes, JSValueRef* exception) |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 175 | { |
| 176 | JSLock lock; |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 177 | ExecState* exec = toJS(ctx); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 178 | JSObject* jsObject = toJS(object); |
darin@apple.com | e25e04e | 2008-02-24 05:01:27 +0000 | [diff] [blame] | 179 | Identifier name(toJS(propertyName)); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 180 | JSValue* jsValue = toJS(value); |
darin@apple.com | e25e04e | 2008-02-24 05:01:27 +0000 | [diff] [blame] | 181 | |
weinig@apple.com | 6ae58b3 | 2008-04-16 20:58:46 +0000 | [diff] [blame] | 182 | if (attributes && !jsObject->hasProperty(exec, name)) |
| 183 | jsObject->putWithAttributes(exec, name, jsValue, attributes); |
| 184 | else |
| 185 | jsObject->put(exec, name, jsValue); |
darin@apple.com | e25e04e | 2008-02-24 05:01:27 +0000 | [diff] [blame] | 186 | |
ggaren | 292e70e | 2006-07-15 04:10:31 +0000 | [diff] [blame] | 187 | if (exec->hadException()) { |
| 188 | if (exception) |
| 189 | *exception = toRef(exec->exception()); |
| 190 | exec->clearException(); |
| 191 | } |
mjs | 57c2ec1 | 2006-07-14 20:53:38 +0000 | [diff] [blame] | 192 | } |
| 193 | |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 194 | JSValueRef JSObjectGetPropertyAtIndex(JSContextRef ctx, JSObjectRef object, unsigned propertyIndex, JSValueRef* exception) |
mjs | 57c2ec1 | 2006-07-14 20:53:38 +0000 | [diff] [blame] | 195 | { |
| 196 | JSLock lock; |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 197 | ExecState* exec = toJS(ctx); |
mjs | 57c2ec1 | 2006-07-14 20:53:38 +0000 | [diff] [blame] | 198 | JSObject* jsObject = toJS(object); |
| 199 | |
| 200 | JSValue* jsValue = jsObject->get(exec, propertyIndex); |
ggaren | 747b08b | 2006-07-17 02:00:40 +0000 | [diff] [blame] | 201 | if (exec->hadException()) { |
| 202 | if (exception) |
| 203 | *exception = toRef(exec->exception()); |
| 204 | exec->clearException(); |
| 205 | } |
mjs | 57c2ec1 | 2006-07-14 20:53:38 +0000 | [diff] [blame] | 206 | return toRef(jsValue); |
| 207 | } |
| 208 | |
| 209 | |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 210 | void JSObjectSetPropertyAtIndex(JSContextRef ctx, JSObjectRef object, unsigned propertyIndex, JSValueRef value, JSValueRef* exception) |
mjs | 57c2ec1 | 2006-07-14 20:53:38 +0000 | [diff] [blame] | 211 | { |
| 212 | JSLock lock; |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 213 | ExecState* exec = toJS(ctx); |
mjs | 57c2ec1 | 2006-07-14 20:53:38 +0000 | [diff] [blame] | 214 | JSObject* jsObject = toJS(object); |
| 215 | JSValue* jsValue = toJS(value); |
| 216 | |
| 217 | jsObject->put(exec, propertyIndex, jsValue); |
ggaren | 747b08b | 2006-07-17 02:00:40 +0000 | [diff] [blame] | 218 | if (exec->hadException()) { |
| 219 | if (exception) |
| 220 | *exception = toRef(exec->exception()); |
| 221 | exec->clearException(); |
| 222 | } |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 223 | } |
| 224 | |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 225 | bool JSObjectDeleteProperty(JSContextRef ctx, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception) |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 226 | { |
| 227 | JSLock lock; |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 228 | ExecState* exec = toJS(ctx); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 229 | JSObject* jsObject = toJS(object); |
| 230 | UString::Rep* nameRep = toJS(propertyName); |
| 231 | |
ggaren | 292e70e | 2006-07-15 04:10:31 +0000 | [diff] [blame] | 232 | 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; |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 239 | } |
| 240 | |
| 241 | void* JSObjectGetPrivate(JSObjectRef object) |
| 242 | { |
| 243 | JSObject* jsObject = toJS(object); |
| 244 | |
eseidel | 5417cd5 | 2007-10-25 06:38:35 +0000 | [diff] [blame] | 245 | 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(); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 249 | |
ggaren | 554ad6f | 2006-07-08 02:02:47 +0000 | [diff] [blame] | 250 | return 0; |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 251 | } |
| 252 | |
| 253 | bool JSObjectSetPrivate(JSObjectRef object, void* data) |
| 254 | { |
| 255 | JSObject* jsObject = toJS(object); |
| 256 | |
eseidel | 5417cd5 | 2007-10-25 06:38:35 +0000 | [diff] [blame] | 257 | 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); |
ggaren | 554ad6f | 2006-07-08 02:02:47 +0000 | [diff] [blame] | 262 | return true; |
| 263 | } |
| 264 | |
ggaren | 554ad6f | 2006-07-08 02:02:47 +0000 | [diff] [blame] | 265 | return false; |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 266 | } |
| 267 | |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 268 | bool JSObjectIsFunction(JSContextRef, JSObjectRef object) |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 269 | { |
| 270 | JSObject* jsObject = toJS(object); |
| 271 | return jsObject->implementsCall(); |
| 272 | } |
| 273 | |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 274 | JSValueRef JSObjectCallAsFunction(JSContextRef ctx, JSObjectRef object, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 275 | { |
| 276 | JSLock lock; |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 277 | ExecState* exec = toJS(ctx); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 278 | JSObject* jsObject = toJS(object); |
| 279 | JSObject* jsThisObject = toJS(thisObject); |
| 280 | |
ggaren | 9c67b7a | 2006-07-08 17:42:39 +0000 | [diff] [blame] | 281 | if (!jsThisObject) |
weinig@apple.com | 41dbaab | 2008-04-09 02:17:49 +0000 | [diff] [blame] | 282 | jsThisObject = exec->globalThisValue(); |
| 283 | |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 284 | List argList; |
ggaren | e806fb8 | 2006-07-15 04:16:30 +0000 | [diff] [blame] | 285 | for (size_t i = 0; i < argumentCount; i++) |
| 286 | argList.append(toJS(arguments[i])); |
ggaren | 554ad6f | 2006-07-08 02:02:47 +0000 | [diff] [blame] | 287 | |
| 288 | JSValueRef result = toRef(jsObject->call(exec, jsThisObject, argList)); // returns NULL if object->implementsCall() is false |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 289 | if (exec->hadException()) { |
ggaren | 84f78e5 | 2006-07-04 02:35:09 +0000 | [diff] [blame] | 290 | if (exception) |
ggaren | 20c233d | 2006-07-10 21:17:26 +0000 | [diff] [blame] | 291 | *exception = toRef(exec->exception()); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 292 | exec->clearException(); |
ggaren | 7944ca3 | 2006-07-08 17:53:08 +0000 | [diff] [blame] | 293 | result = 0; |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 294 | } |
ggaren | 84f78e5 | 2006-07-04 02:35:09 +0000 | [diff] [blame] | 295 | return result; |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 296 | } |
| 297 | |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 298 | bool JSObjectIsConstructor(JSContextRef, JSObjectRef object) |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 299 | { |
| 300 | JSObject* jsObject = toJS(object); |
| 301 | return jsObject->implementsConstruct(); |
| 302 | } |
| 303 | |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 304 | JSObjectRef JSObjectCallAsConstructor(JSContextRef ctx, JSObjectRef object, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 305 | { |
| 306 | JSLock lock; |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 307 | ExecState* exec = toJS(ctx); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 308 | JSObject* jsObject = toJS(object); |
| 309 | |
| 310 | List argList; |
ggaren | e806fb8 | 2006-07-15 04:16:30 +0000 | [diff] [blame] | 311 | for (size_t i = 0; i < argumentCount; i++) |
| 312 | argList.append(toJS(arguments[i])); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 313 | |
ggaren | 554ad6f | 2006-07-08 02:02:47 +0000 | [diff] [blame] | 314 | JSObjectRef result = toRef(jsObject->construct(exec, argList)); // returns NULL if object->implementsCall() is false |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 315 | if (exec->hadException()) { |
ggaren | 84f78e5 | 2006-07-04 02:35:09 +0000 | [diff] [blame] | 316 | if (exception) |
ggaren | 20c233d | 2006-07-10 21:17:26 +0000 | [diff] [blame] | 317 | *exception = toRef(exec->exception()); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 318 | exec->clearException(); |
ggaren | 7944ca3 | 2006-07-08 17:53:08 +0000 | [diff] [blame] | 319 | result = 0; |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 320 | } |
ggaren | 84f78e5 | 2006-07-04 02:35:09 +0000 | [diff] [blame] | 321 | return result; |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 322 | } |
| 323 | |
ggaren | dd0d0e1 | 2006-07-17 04:41:01 +0000 | [diff] [blame] | 324 | struct OpaqueJSPropertyNameArray |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 325 | { |
ggaren | dd0d0e1 | 2006-07-17 04:41:01 +0000 | [diff] [blame] | 326 | OpaqueJSPropertyNameArray() : refCount(0) |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 327 | { |
| 328 | } |
| 329 | |
| 330 | unsigned refCount; |
mjs | b3598b8 | 2006-07-16 21:06:28 +0000 | [diff] [blame] | 331 | PropertyNameArray array; |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 332 | }; |
| 333 | |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 334 | JSPropertyNameArrayRef JSObjectCopyPropertyNames(JSContextRef ctx, JSObjectRef object) |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 335 | { |
| 336 | JSLock lock; |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 337 | JSObject* jsObject = toJS(object); |
mjs | 127f859 | 2006-07-17 08:14:39 +0000 | [diff] [blame] | 338 | ExecState* exec = toJS(ctx); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 339 | |
ggaren | dd0d0e1 | 2006-07-17 04:41:01 +0000 | [diff] [blame] | 340 | JSPropertyNameArrayRef propertyNames = new OpaqueJSPropertyNameArray(); |
mjs | b3598b8 | 2006-07-16 21:06:28 +0000 | [diff] [blame] | 341 | jsObject->getPropertyNames(exec, propertyNames->array); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 342 | |
mjs | b3598b8 | 2006-07-16 21:06:28 +0000 | [diff] [blame] | 343 | return JSPropertyNameArrayRetain(propertyNames); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 344 | } |
| 345 | |
mjs | b3598b8 | 2006-07-16 21:06:28 +0000 | [diff] [blame] | 346 | JSPropertyNameArrayRef JSPropertyNameArrayRetain(JSPropertyNameArrayRef array) |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 347 | { |
ggaren | 76727c5 | 2007-01-28 02:58:47 +0000 | [diff] [blame] | 348 | JSLock lock; |
mjs | b3598b8 | 2006-07-16 21:06:28 +0000 | [diff] [blame] | 349 | ++array->refCount; |
| 350 | return array; |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 351 | } |
| 352 | |
mjs | b3598b8 | 2006-07-16 21:06:28 +0000 | [diff] [blame] | 353 | void JSPropertyNameArrayRelease(JSPropertyNameArrayRef array) |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 354 | { |
ggaren | 76727c5 | 2007-01-28 02:58:47 +0000 | [diff] [blame] | 355 | JSLock lock; |
mjs | b3598b8 | 2006-07-16 21:06:28 +0000 | [diff] [blame] | 356 | if (--array->refCount == 0) |
| 357 | delete array; |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 358 | } |
| 359 | |
mjs | b3598b8 | 2006-07-16 21:06:28 +0000 | [diff] [blame] | 360 | size_t JSPropertyNameArrayGetCount(JSPropertyNameArrayRef array) |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 361 | { |
mjs | b3598b8 | 2006-07-16 21:06:28 +0000 | [diff] [blame] | 362 | return array->array.size(); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 363 | } |
| 364 | |
mjs | b3598b8 | 2006-07-16 21:06:28 +0000 | [diff] [blame] | 365 | JSStringRef JSPropertyNameArrayGetNameAtIndex(JSPropertyNameArrayRef array, size_t index) |
| 366 | { |
darin | b847b44 | 2006-10-27 16:48:28 +0000 | [diff] [blame] | 367 | return toRef(array->array[static_cast<unsigned>(index)].ustring().rep()); |
mjs | b3598b8 | 2006-07-16 21:06:28 +0000 | [diff] [blame] | 368 | } |
| 369 | |
| 370 | void JSPropertyNameAccumulatorAddName(JSPropertyNameAccumulatorRef array, JSStringRef propertyName) |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 371 | { |
| 372 | JSLock lock; |
mjs | b3598b8 | 2006-07-16 21:06:28 +0000 | [diff] [blame] | 373 | PropertyNameArray* propertyNames = toJS(array); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 374 | UString::Rep* rep = toJS(propertyName); |
darin@apple.com | 3beb300 | 2008-04-28 05:59:07 +0000 | [diff] [blame] | 375 | propertyNames->add(rep); |
ggaren | 2593cdc | 2006-06-21 21:09:19 +0000 | [diff] [blame] | 376 | } |