CFMutableArrayRef JSCreateJSArrayFromCFArray(CFArrayRef array) { CFIndex count = array ? CFArrayGetCount(array) : 0; CFArrayCallBacks arrayCallbacks; CFMutableArrayRef jsArray; CFIndex i; JSTypeGetCFArrayCallBacks(&arrayCallbacks); jsArray = CFArrayCreateMutable(0, 0, &arrayCallbacks); for (i = 0; array && i < count; i++) { CFTypeRef cfValue = (CFTypeRef)CFArrayGetValueAtIndex(array, i); JSObjectRef jsValue = JSObjectCreateWithCFType(cfValue); if (!jsValue) jsValue = JSObjectCreateWithCFType(GetCFNull()); if (jsValue) { CFArrayAppendValue(jsArray, jsValue); JSRelease(jsValue); } } return jsArray; }
JSValue *UserObjectImp::callAsFunction(ExecState *exec, JSObject *thisObj, const List &args) { JSValue *result = jsUndefined(); JSUserObject* jsThisObj = KJSValueToJSObject(thisObj, exec); if (jsThisObj) { CFIndex argCount = args.size(); CFArrayCallBacks arrayCallBacks; JSTypeGetCFArrayCallBacks(&arrayCallBacks); CFMutableArrayRef jsArgs = CFArrayCreateMutable(0, 0, &arrayCallBacks); if (jsArgs) { for (CFIndex i = 0; i < argCount; i++) { JSUserObject* jsArg = KJSValueToJSObject(args[i], exec); CFArrayAppendValue(jsArgs, (void*)jsArg); jsArg->Release(); } } JSUserObject* jsResult; { // scope JSLock::DropAllLocks dropLocks; // implementsCall should have guarded against a NULL fJSUserObject. assert(fJSUserObject); jsResult = fJSUserObject->CallFunction(jsThisObj, jsArgs); } if (jsResult) { result = JSObjectKJSValue(jsResult); jsResult->Release(); } ReleaseCFType(jsArgs); jsThisObj->Release(); } return result; }
JSValue UserObjectImp::callAsFunction(ExecState *exec) { JSValue result = jsUndefined(); JSUserObject* jsThisObj = KJSValueToJSObject(exec->hostThisValue().toThisObject(exec), exec); if (jsThisObj) { CFIndex argCount = exec->argumentCount(); CFArrayCallBacks arrayCallBacks; JSTypeGetCFArrayCallBacks(&arrayCallBacks); CFMutableArrayRef jsArgs = CFArrayCreateMutable(0, 0, &arrayCallBacks); if (jsArgs) { for (CFIndex i = 0; i < argCount; i++) { JSUserObject* jsArg = KJSValueToJSObject(exec->argument(i), exec); CFArrayAppendValue(jsArgs, (void*)jsArg); jsArg->Release(); } } JSUserObject* jsResult; { // scope JSGlueAPICallback apiCallback(exec); // getCallData should have guarded against a NULL fJSUserObject. assert(fJSUserObject); jsResult = fJSUserObject->CallFunction(jsThisObj, jsArgs); } if (jsResult) { result = JSObjectKJSValue(jsResult); jsResult->Release(); } ReleaseCFType(jsArgs); jsThisObj->Release(); } return result; }