diff options
Diffstat (limited to 'WebCore/bridge/objc/objc_utility.mm')
| -rw-r--r-- | WebCore/bridge/objc/objc_utility.mm | 373 |
1 files changed, 0 insertions, 373 deletions
diff --git a/WebCore/bridge/objc/objc_utility.mm b/WebCore/bridge/objc/objc_utility.mm deleted file mode 100644 index daab4fe..0000000 --- a/WebCore/bridge/objc/objc_utility.mm +++ /dev/null @@ -1,373 +0,0 @@ -/* - * Copyright (C) 2004 Apple Computer, 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_utility.h" - -#include "objc_instance.h" -#include "runtime_array.h" -#include "runtime_object.h" -#include "WebScriptObject.h" -#include <runtime/JSGlobalObject.h> -#include <runtime/JSLock.h> -#include <wtf/Assertions.h> - -#if !defined(_C_LNG_LNG) -#define _C_LNG_LNG 'q' -#endif - -#if !defined(_C_ULNG_LNG) -#define _C_ULNG_LNG 'Q' -#endif - -#if !defined(_C_CONST) -#define _C_CONST 'r' -#endif - -#if !defined(_C_BYCOPY) -#define _C_BYCOPY 'O' -#endif - -#if !defined(_C_BYREF) -#define _C_BYREF 'R' -#endif - -#if !defined(_C_ONEWAY) -#define _C_ONEWAY 'V' -#endif - -#if !defined(_C_GCINVISIBLE) -#define _C_GCINVISIBLE '!' -#endif - -namespace JSC { -namespace Bindings { - -/* - By default, a JavaScript method name is produced by concatenating the - components of an ObjectiveC method name, replacing ':' with '_', and - escaping '_' and '$' with a leading '$', such that '_' becomes "$_" and - '$' becomes "$$". For example: - - ObjectiveC name Default JavaScript name - moveTo:: moveTo__ - moveTo_ moveTo$_ - moveTo$_ moveTo$$$_ - - This function performs the inverse of that operation. - - @result Fills 'buffer' with the ObjectiveC method name that corresponds to 'JSName'. - Returns true for success, false for failure. (Failure occurs when 'buffer' - is not big enough to hold the result.) -*/ -bool convertJSMethodNameToObjc(const char *JSName, char *buffer, size_t bufferSize) -{ - ASSERT(JSName && buffer); - - const char *sp = JSName; // source pointer - char *dp = buffer; // destination pointer - - char *end = buffer + bufferSize; - while (dp < end) { - if (*sp == '$') { - ++sp; - *dp = *sp; - } else if (*sp == '_') - *dp = ':'; - else - *dp = *sp; - - // If a future coder puts funny ++ operators above, we might write off the end - // of the buffer in the middle of this loop. Let's make sure to check for that. - ASSERT(dp < end); - - if (*sp == 0) { // We finished converting JSName - ASSERT(strlen(JSName) < bufferSize); - return true; - } - - ++sp; - ++dp; - } - - return false; // We ran out of buffer before converting JSName -} - -/* - - JavaScript to ObjC - Number coerced to char, short, int, long, float, double, or NSNumber, as appropriate - String NSString - wrapper id - Object WebScriptObject - null NSNull - [], other exception - -*/ -ObjcValue convertValueToObjcValue(ExecState* exec, JSValue* value, ObjcValueType type) -{ - ObjcValue result; - double d = 0; - - if (value->isNumber() || value->isString() || value->isBoolean()) - d = value->toNumber(exec); - - switch (type) { - case ObjcObjectType: { - JSLock lock(false); - - JSGlobalObject *originGlobalObject = exec->dynamicGlobalObject(); - RootObject* originRootObject = findRootObject(originGlobalObject); - - JSGlobalObject* globalObject = 0; - if (value->isObject() && asObject(value)->isGlobalObject()) - globalObject = static_cast<JSGlobalObject*>(asObject(value)); - - if (!globalObject) - globalObject = originGlobalObject; - - RootObject* rootObject = findRootObject(globalObject); - result.objectValue = rootObject - ? [webScriptObjectClass() _convertValueToObjcValue:value originRootObject:originRootObject rootObject:rootObject] - : nil; - } - break; - - case ObjcCharType: - case ObjcUnsignedCharType: - result.charValue = (char)d; - break; - case ObjcShortType: - case ObjcUnsignedShortType: - result.shortValue = (short)d; - break; - case ObjcIntType: - case ObjcUnsignedIntType: - result.intValue = (int)d; - break; - case ObjcLongType: - case ObjcUnsignedLongType: - result.longValue = (long)d; - break; - case ObjcLongLongType: - case ObjcUnsignedLongLongType: - result.longLongValue = (long long)d; - break; - case ObjcFloatType: - result.floatValue = (float)d; - break; - case ObjcDoubleType: - result.doubleValue = (double)d; - break; - case ObjcVoidType: - bzero(&result, sizeof(ObjcValue)); - break; - - case ObjcInvalidType: - default: - // FIXME: throw an exception? - break; - } - - return result; -} - -JSValue* convertNSStringToString(ExecState* exec, NSString *nsstring) -{ - JSLock lock(false); - - unichar *chars; - unsigned int length = [nsstring length]; - chars = (unichar *)malloc(sizeof(unichar)*length); - [nsstring getCharacters:chars]; - UString u((const UChar*)chars, length); - JSValue* aValue = jsString(exec, u); - free((void *)chars); - return aValue; -} - -/* - ObjC to JavaScript - ---- ---------- - char number - short number - int number - long number - float number - double number - NSNumber boolean or number - NSString string - NSArray array - NSNull null - WebScriptObject underlying JavaScript object - WebUndefined undefined - id object wrapper - other should not happen -*/ -JSValue* convertObjcValueToValue(ExecState* exec, void* buffer, ObjcValueType type, RootObject* rootObject) -{ - JSLock lock(false); - - switch (type) { - case ObjcObjectType: { - id obj = *(id*)buffer; - if ([obj isKindOfClass:[NSString class]]) - return convertNSStringToString(exec, (NSString *)obj); - if ([obj isKindOfClass:webUndefinedClass()]) - return jsUndefined(); - if ((CFBooleanRef)obj == kCFBooleanTrue) - return jsBoolean(true); - if ((CFBooleanRef)obj == kCFBooleanFalse) - return jsBoolean(false); - if ([obj isKindOfClass:[NSNumber class]]) - return jsNumber(exec, [obj doubleValue]); - if ([obj isKindOfClass:[NSArray class]]) - return new (exec) RuntimeArray(exec, new ObjcArray(obj, rootObject)); - if ([obj isKindOfClass:webScriptObjectClass()]) { - JSObject* imp = [obj _imp]; - return imp ? imp : jsUndefined(); - } - if ([obj isKindOfClass:[NSNull class]]) - return jsNull(); - if (obj == 0) - return jsUndefined(); - return Instance::createRuntimeObject(exec, ObjcInstance::create(obj, rootObject)); - } - case ObjcCharType: - return jsNumber(exec, *(char*)buffer); - case ObjcUnsignedCharType: - return jsNumber(exec, *(unsigned char*)buffer); - case ObjcShortType: - return jsNumber(exec, *(short*)buffer); - case ObjcUnsignedShortType: - return jsNumber(exec, *(unsigned short*)buffer); - case ObjcIntType: - return jsNumber(exec, *(int*)buffer); - case ObjcUnsignedIntType: - return jsNumber(exec, *(unsigned int*)buffer); - case ObjcLongType: - return jsNumber(exec, *(long*)buffer); - case ObjcUnsignedLongType: - return jsNumber(exec, *(unsigned long*)buffer); - case ObjcLongLongType: - return jsNumber(exec, *(long long*)buffer); - case ObjcUnsignedLongLongType: - return jsNumber(exec, *(unsigned long long*)buffer); - case ObjcFloatType: - return jsNumber(exec, *(float*)buffer); - case ObjcDoubleType: - return jsNumber(exec, *(double*)buffer); - default: - // Should never get here. Argument types are filtered. - fprintf(stderr, "%s: invalid type (%d)\n", __PRETTY_FUNCTION__, (int)type); - ASSERT(false); - } - - return jsUndefined(); -} - -ObjcValueType objcValueTypeForType(const char *type) -{ - int typeLength = strlen(type); - ObjcValueType objcValueType = ObjcInvalidType; - - for (int i = 0; i < typeLength; ++i) { - char typeChar = type[i]; - switch (typeChar) { - case _C_CONST: - case _C_BYCOPY: - case _C_BYREF: - case _C_ONEWAY: - case _C_GCINVISIBLE: - // skip these type modifiers - break; - case _C_ID: - objcValueType = ObjcObjectType; - break; - case _C_CHR: - objcValueType = ObjcCharType; - break; - case _C_UCHR: - objcValueType = ObjcUnsignedCharType; - break; - case _C_SHT: - objcValueType = ObjcShortType; - break; - case _C_USHT: - objcValueType = ObjcUnsignedShortType; - break; - case _C_INT: - objcValueType = ObjcIntType; - break; - case _C_UINT: - objcValueType = ObjcUnsignedIntType; - break; - case _C_LNG: - objcValueType = ObjcLongType; - break; - case _C_ULNG: - objcValueType = ObjcUnsignedLongType; - break; - case _C_LNG_LNG: - objcValueType = ObjcLongLongType; - break; - case _C_ULNG_LNG: - objcValueType = ObjcUnsignedLongLongType; - break; - case _C_FLT: - objcValueType = ObjcFloatType; - break; - case _C_DBL: - objcValueType = ObjcDoubleType; - break; - case _C_VOID: - objcValueType = ObjcVoidType; - break; - default: - // Unhandled type. We don't handle C structs, unions, etc. - // FIXME: throw an exception? - ASSERT(false); - } - - if (objcValueType != ObjcInvalidType) - break; - } - - return objcValueType; -} - -JSObject *throwError(ExecState *exec, ErrorType type, NSString *message) -{ - ASSERT(message); - size_t length = [message length]; - unichar *buffer = new unichar[length]; - [message getCharacters:buffer]; - JSObject *error = throwError(exec, type, UString(buffer, length)); - delete [] buffer; - return error; -} - -} -} |
