diff options
Diffstat (limited to 'WebCore/bridge/objc/objc_runtime.mm')
| -rw-r--r-- | WebCore/bridge/objc/objc_runtime.mm | 293 |
1 files changed, 0 insertions, 293 deletions
diff --git a/WebCore/bridge/objc/objc_runtime.mm b/WebCore/bridge/objc/objc_runtime.mm deleted file mode 100644 index e6729a8..0000000 --- a/WebCore/bridge/objc/objc_runtime.mm +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Copyright (C) 2004, 2008 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" -#include "objc_runtime.h" - -#include "JSDOMBinding.h" -#include "WebScriptObject.h" -#include "objc_instance.h" -#include "runtime_array.h" -#include "runtime_object.h" -#include <runtime/Error.h> -#include <runtime/JSGlobalObject.h> -#include <runtime/JSLock.h> -#include <runtime/ObjectPrototype.h> -#include <wtf/RetainPtr.h> - -using namespace WebCore; - -namespace JSC { -namespace Bindings { - -ClassStructPtr webScriptObjectClass() -{ - static ClassStructPtr<WebScriptObject> webScriptObjectClass = NSClassFromString(@"WebScriptObject"); - return webScriptObjectClass; -} - -ClassStructPtr webUndefinedClass() -{ - static ClassStructPtr<WebUndefined> webUndefinedClass = NSClassFromString(@"WebUndefined"); - return webUndefinedClass; -} - -// ---------------------- ObjcMethod ---------------------- - -ObjcMethod::ObjcMethod(ClassStructPtr aClass, const char* name) -{ - _objcClass = aClass; - _selector = name; // Assume ObjC runtime keeps these around forever. - _javaScriptName = 0; -} - -const char* ObjcMethod::name() const -{ - return _selector; -} - -int ObjcMethod::numParameters() const -{ - return [getMethodSignature() numberOfArguments] - 2; -} - -NSMethodSignature* ObjcMethod::getMethodSignature() const -{ -#if defined(OBJC_API_VERSION) && OBJC_API_VERSION >= 2 - return [_objcClass instanceMethodSignatureForSelector:sel_registerName(_selector)]; -#else - return [_objcClass instanceMethodSignatureForSelector:(SEL)_selector]; -#endif -} - -// ---------------------- ObjcField ---------------------- - -ObjcField::ObjcField(Ivar ivar) -{ - _ivar = ivar; // Assume ObjectiveC runtime will keep this alive forever - _name = 0; -} - -ObjcField::ObjcField(CFStringRef name) -{ - _ivar = 0; - _name = (CFStringRef)CFRetain(name); -} - -const char* ObjcField::name() const -{ -#if defined(OBJC_API_VERSION) && OBJC_API_VERSION >= 2 - if (_ivar) - return ivar_getName(_ivar); -#else - if (_ivar) - return _ivar->ivar_name; -#endif - return [(NSString*)_name.get() UTF8String]; -} - -JSValue* ObjcField::valueFromInstance(ExecState* exec, const Instance* instance) const -{ - JSValue* result = jsUndefined(); - - id targetObject = (static_cast<const ObjcInstance*>(instance))->getObject(); - - JSLock::DropAllLocks dropAllLocks(false); // Can't put this inside the @try scope because it unwinds incorrectly. - - @try { - NSString* key = [NSString stringWithCString:name() encoding:NSASCIIStringEncoding]; - if (id objcValue = [targetObject valueForKey:key]) - result = convertObjcValueToValue(exec, &objcValue, ObjcObjectType, instance->rootObject()); - } @catch(NSException* localException) { - JSLock::lock(false); - throwError(exec, GeneralError, [localException reason]); - JSLock::unlock(false); - } - - // Work around problem in some versions of GCC where result gets marked volatile and - // it can't handle copying from a volatile to non-volatile. - return const_cast<JSValue*&>(result); -} - -static id convertValueToObjcObject(ExecState* exec, JSValue* value) -{ - RefPtr<RootObject> rootObject = findRootObject(exec->dynamicGlobalObject()); - if (!rootObject) - return nil; - return [webScriptObjectClass() _convertValueToObjcValue:value originRootObject:rootObject.get() rootObject:rootObject.get()]; -} - -void ObjcField::setValueToInstance(ExecState* exec, const Instance* instance, JSValue* aValue) const -{ - id targetObject = (static_cast<const ObjcInstance*>(instance))->getObject(); - id value = convertValueToObjcObject(exec, aValue); - - JSLock::DropAllLocks dropAllLocks(false); // Can't put this inside the @try scope because it unwinds incorrectly. - - @try { - NSString* key = [NSString stringWithCString:name() encoding:NSASCIIStringEncoding]; - [targetObject setValue:value forKey:key]; - } @catch(NSException* localException) { - JSLock::lock(false); - throwError(exec, GeneralError, [localException reason]); - JSLock::unlock(false); - } -} - -// ---------------------- ObjcArray ---------------------- - -ObjcArray::ObjcArray(ObjectStructPtr a, PassRefPtr<RootObject> rootObject) - : Array(rootObject) - , _array(a) -{ -} - -void ObjcArray::setValueAt(ExecState* exec, unsigned int index, JSValue* aValue) const -{ - if (![_array.get() respondsToSelector:@selector(insertObject:atIndex:)]) { - throwError(exec, TypeError, "Array is not mutable."); - return; - } - - if (index > [_array.get() count]) { - throwError(exec, RangeError, "Index exceeds array size."); - return; - } - - // Always try to convert the value to an ObjC object, so it can be placed in the - // array. - ObjcValue oValue = convertValueToObjcValue (exec, aValue, ObjcObjectType); - - @try { - [_array.get() insertObject:oValue.objectValue atIndex:index]; - } @catch(NSException* localException) { - throwError(exec, GeneralError, "Objective-C exception."); - } -} - -JSValue* ObjcArray::valueAt(ExecState* exec, unsigned int index) const -{ - if (index > [_array.get() count]) - return throwError(exec, RangeError, "Index exceeds array size."); - @try { - id obj = [_array.get() objectAtIndex:index]; - if (obj) - return convertObjcValueToValue (exec, &obj, ObjcObjectType, _rootObject.get()); - } @catch(NSException* localException) { - return throwError(exec, GeneralError, "Objective-C exception."); - } - return jsUndefined(); -} - -unsigned int ObjcArray::getLength() const -{ - return [_array.get() count]; -} - -const ClassInfo ObjcFallbackObjectImp::s_info = { "ObjcFallbackObject", 0, 0, 0 }; - -ObjcFallbackObjectImp::ObjcFallbackObjectImp(ExecState* exec, ObjcInstance* i, const Identifier& propertyName) - : JSObject(getDOMStructure<ObjcFallbackObjectImp>(exec)) - , _instance(i) - , _item(propertyName) -{ -} - -bool ObjcFallbackObjectImp::getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot& slot) -{ - // keep the prototype from getting called instead of just returning false - slot.setUndefined(); - return true; -} - -void ObjcFallbackObjectImp::put(ExecState*, const Identifier&, JSValue*, PutPropertySlot&) -{ -} - -static JSValue* callObjCFallbackObject(ExecState* exec, JSObject* function, JSValue* thisValue, const ArgList& args) -{ - if (!thisValue->isObject(&RuntimeObjectImp::s_info)) - return throwError(exec, TypeError); - - JSValue* result = jsUndefined(); - - RuntimeObjectImp* imp = static_cast<RuntimeObjectImp*>(asObject(thisValue)); - Instance* instance = imp->getInternalInstance(); - - if (!instance) - return RuntimeObjectImp::throwInvalidAccessError(exec); - - instance->begin(); - - ObjcInstance* objcInstance = static_cast<ObjcInstance*>(instance); - id targetObject = objcInstance->getObject(); - - if ([targetObject respondsToSelector:@selector(invokeUndefinedMethodFromWebScript:withArguments:)]){ - ObjcClass* objcClass = static_cast<ObjcClass*>(instance->getClass()); - OwnPtr<ObjcMethod> fallbackMethod(new ObjcMethod(objcClass->isa(), sel_getName(@selector(invokeUndefinedMethodFromWebScript:withArguments:)))); - const Identifier& nameIdentifier = static_cast<ObjcFallbackObjectImp*>(function)->propertyName(); - RetainPtr<CFStringRef> name(AdoptCF, CFStringCreateWithCharacters(0, nameIdentifier.data(), nameIdentifier.size())); - fallbackMethod->setJavaScriptName(name.get()); - MethodList methodList; - methodList.append(fallbackMethod.get()); - result = instance->invokeMethod(exec, methodList, args); - } - - instance->end(); - - return result; -} - -CallType ObjcFallbackObjectImp::getCallData(CallData& callData) -{ - id targetObject = _instance->getObject(); - if (![targetObject respondsToSelector:@selector(invokeUndefinedMethodFromWebScript:withArguments:)]) - return CallTypeNone; - callData.native.function = callObjCFallbackObject; - return CallTypeHost; -} - -bool ObjcFallbackObjectImp::deleteProperty(ExecState*, const Identifier&) -{ - return false; -} - -JSValue* ObjcFallbackObjectImp::defaultValue(ExecState* exec, PreferredPrimitiveType) const -{ - return _instance->getValueOfUndefinedField(exec, _item); -} - -bool ObjcFallbackObjectImp::toBoolean(ExecState *) const -{ - id targetObject = _instance->getObject(); - - if ([targetObject respondsToSelector:@selector(invokeUndefinedMethodFromWebScript:withArguments:)]) - return true; - - return false; -} - -} -} |
