diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2008-12-17 18:05:15 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2008-12-17 18:05:15 -0800 |
commit | 1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353 (patch) | |
tree | 4457a7306ea5acb43fe05bfe0973b1f7faf97ba2 /WebCore/bindings/objc/WebScriptObject.mm | |
parent | 9364f22aed35e1a1e9d07c121510f80be3ab0502 (diff) | |
download | external_webkit-1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353.zip external_webkit-1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353.tar.gz external_webkit-1cbdecfa9fc428ac2d8aca0fa91c9580b3d57353.tar.bz2 |
Code drop from //branches/cupcake/...@124589
Diffstat (limited to 'WebCore/bindings/objc/WebScriptObject.mm')
-rw-r--r-- | WebCore/bindings/objc/WebScriptObject.mm | 166 |
1 files changed, 78 insertions, 88 deletions
diff --git a/WebCore/bindings/objc/WebScriptObject.mm b/WebCore/bindings/objc/WebScriptObject.mm index 4f1168b..6262b97 100644 --- a/WebCore/bindings/objc/WebScriptObject.mm +++ b/WebCore/bindings/objc/WebScriptObject.mm @@ -26,30 +26,34 @@ #import "config.h" #import "WebScriptObjectPrivate.h" +#import "Console.h" #import "DOMInternal.h" +#import "DOMWindow.h" #import "Frame.h" +#import "JSDOMWindow.h" +#import "JSDOMWindowCustom.h" #import "PlatformString.h" +#import "StringSourceProvider.h" #import "WebCoreObjCExtras.h" -#import "WebCoreFrameBridge.h" -#import <JavaScriptCore/ExecState.h> -#import <JavaScriptCore/objc_instance.h> -#import <JavaScriptCore/runtime_object.h> +#import "objc_instance.h" +#import "runtime.h" +#import "runtime_object.h" +#import "runtime_root.h" #import <JavaScriptCore/APICast.h> -#import <JavaScriptCore/JSGlobalObject.h> -#import <JavaScriptCore/interpreter.h> +#import <runtime/ExecState.h> +#import <runtime/JSGlobalObject.h> +#import <runtime/JSLock.h> +#import <kjs/completion.h> +#import <kjs/interpreter.h> + +#ifdef BUILDING_ON_TIGER +typedef unsigned NSUInteger; +#endif -using namespace KJS; -using namespace KJS::Bindings; +using namespace JSC; +using namespace JSC::Bindings; using namespace WebCore; -#define LOG_EXCEPTION(exec) \ - if (Interpreter::shouldPrintExceptions()) \ - printf("%s:%d:[%d] JavaScript exception: %s\n", __FILE__, __LINE__, getpid(), exec->exception()->toObject(exec)->get(exec, exec->propertyNames().message)->toString(exec).ascii()); - -@interface WebFrame -- (WebCoreFrameBridge *)_bridge; // implemented in WebKit -@end - namespace WebCore { typedef HashMap<JSObject*, NSObject*> JSWrapperMap; @@ -76,13 +80,21 @@ void removeJSWrapper(JSObject* impl) JSWrapperCache->remove(impl); } -id createJSWrapper(KJS::JSObject* object, PassRefPtr<KJS::Bindings::RootObject> origin, PassRefPtr<KJS::Bindings::RootObject> root) +id createJSWrapper(JSC::JSObject* object, PassRefPtr<JSC::Bindings::RootObject> origin, PassRefPtr<JSC::Bindings::RootObject> root) { if (id wrapper = getJSWrapper(object)) return [[wrapper retain] autorelease]; return [[[WebScriptObject alloc] _initWithJSObject:object originRootObject:origin rootObject:root] autorelease]; } +static void addExceptionToConsole(ExecState* exec) +{ + JSDOMWindow* window = asJSDOMWindow(exec->dynamicGlobalObject()); + if (!window || !exec->hadException()) + return; + window->impl()->console()->reportCurrentException(exec); +} + } // namespace WebCore @implementation WebScriptObjectPrivate @@ -158,7 +170,7 @@ static void _didExecute(WebScriptObject *obj) _private->originRootObject = originRootObject.releaseRef(); } -- (id)_initWithJSObject:(KJS::JSObject*)imp originRootObject:(PassRefPtr<KJS::Bindings::RootObject>)originRootObject rootObject:(PassRefPtr<KJS::Bindings::RootObject>)rootObject +- (id)_initWithJSObject:(JSC::JSObject*)imp originRootObject:(PassRefPtr<JSC::Bindings::RootObject>)originRootObject rootObject:(PassRefPtr<JSC::Bindings::RootObject>)rootObject { ASSERT(imp); @@ -212,6 +224,9 @@ static void _didExecute(WebScriptObject *obj) - (void)dealloc { + if (WebCoreObjCScheduleDeallocateOnMainThread([WebScriptObject class], self)) + return; + if (_private->imp) WebCore::removeJSWrapper(_private->imp); @@ -248,22 +263,11 @@ static void _didExecute(WebScriptObject *obj) + (BOOL)throwException:(NSString *)exceptionMessage { - JSLock lock; - - // This code assumes that we only ever have one running interpreter. A - // good assumption for now, as we depend on that elsewhere. However, - // in the future we may have the ability to run multiple interpreters, - // in which case this will have to change. - - if (ExecState::activeExecStates().size()) { - throwError(ExecState::activeExecStates().last(), GeneralError, exceptionMessage); - return YES; - } - - return NO; + ObjcInstance::setGlobalException(exceptionMessage); + return YES; } -static void getListFromNSArray(ExecState *exec, NSArray *array, RootObject* rootObject, List& aList) +static void getListFromNSArray(ExecState *exec, NSArray *array, RootObject* rootObject, ArgList& aList) { int i, numObjects = array ? [array count] : 0; @@ -278,35 +282,30 @@ static void getListFromNSArray(ExecState *exec, NSArray *array, RootObject* root if (![self _isSafeScript]) return nil; + JSLock lock(false); + // Look up the function object. ExecState* exec = [self _rootObject]->globalObject()->globalExec(); ASSERT(!exec->hadException()); - JSLock lock; - - JSValue* func = [self _imp]->get(exec, String(name)); - - if (!func || !func->isObject()) - // Maybe throw an exception here? - return 0; - - // Call the function object. - JSObject *funcImp = static_cast<JSObject*>(func); - if (!funcImp->implementsCall()) - return 0; + JSValue* function = [self _imp]->get(exec, Identifier(exec, String(name))); + CallData callData; + CallType callType = function->getCallData(callData); + if (callType == CallTypeNone) + return nil; - List argList; + ArgList argList; getListFromNSArray(exec, args, [self _rootObject], argList); if (![self _isSafeScript]) return nil; [self _rootObject]->globalObject()->startTimeoutCheck(); - JSValue *result = funcImp->call(exec, [self _imp], argList); + JSValue* result = call(exec, function, callType, callData, [self _imp], argList); [self _rootObject]->globalObject()->stopTimeoutCheck(); if (exec->hadException()) { - LOG_EXCEPTION(exec); + addExceptionToConsole(exec); result = jsUndefined(); exec->clearException(); } @@ -327,11 +326,11 @@ static void getListFromNSArray(ExecState *exec, NSArray *array, RootObject* root ExecState* exec = [self _rootObject]->globalObject()->globalExec(); ASSERT(!exec->hadException()); - JSValue *result; - JSLock lock; + JSValue* result; + JSLock lock(false); [self _rootObject]->globalObject()->startTimeoutCheck(); - Completion completion = Interpreter::evaluate([self _rootObject]->globalObject()->globalExec(), UString(), 0, String(script)); + Completion completion = Interpreter::evaluate([self _rootObject]->globalObject()->globalExec(), [self _rootObject]->globalObject()->globalScopeChain(), makeSource(String(script))); [self _rootObject]->globalObject()->stopTimeoutCheck(); ComplType type = completion.complType(); @@ -343,7 +342,7 @@ static void getListFromNSArray(ExecState *exec, NSArray *array, RootObject* root result = jsUndefined(); if (exec->hadException()) { - LOG_EXCEPTION(exec); + addExceptionToConsole(exec); result = jsUndefined(); exec->clearException(); } @@ -363,11 +362,13 @@ static void getListFromNSArray(ExecState *exec, NSArray *array, RootObject* root ExecState* exec = [self _rootObject]->globalObject()->globalExec(); ASSERT(!exec->hadException()); - JSLock lock; - [self _imp]->put(exec, String(key), convertObjcValueToValue(exec, &value, ObjcObjectType, [self _rootObject])); + JSLock lock(false); + + PutPropertySlot slot; + [self _imp]->put(exec, Identifier(exec, String(key)), convertObjcValueToValue(exec, &value, ObjcObjectType, [self _rootObject]), slot); if (exec->hadException()) { - LOG_EXCEPTION(exec); + addExceptionToConsole(exec); exec->clearException(); } @@ -387,12 +388,12 @@ static void getListFromNSArray(ExecState *exec, NSArray *array, RootObject* root // Need to scope this lock to ensure that we release the lock before calling // [super valueForKey:key] which might throw an exception and bypass the JSLock destructor, // leaving the lock permanently held - JSLock lock; + JSLock lock(false); - JSValue *result = [self _imp]->get(exec, String(key)); + JSValue* result = [self _imp]->get(exec, Identifier(exec, String(key))); if (exec->hadException()) { - LOG_EXCEPTION(exec); + addExceptionToConsole(exec); result = jsUndefined(); exec->clearException(); } @@ -403,7 +404,7 @@ static void getListFromNSArray(ExecState *exec, NSArray *array, RootObject* root if ([resultObj isKindOfClass:[WebUndefined class]]) resultObj = [super valueForKey:key]; // defaults to throwing an exception - JSLock lock; + JSLock lock(false); _didExecute(self); return resultObj; @@ -417,11 +418,11 @@ static void getListFromNSArray(ExecState *exec, NSArray *array, RootObject* root ExecState* exec = [self _rootObject]->globalObject()->globalExec(); ASSERT(!exec->hadException()); - JSLock lock; - [self _imp]->deleteProperty(exec, String(key)); + JSLock lock(false); + [self _imp]->deleteProperty(exec, Identifier(exec, String(key))); if (exec->hadException()) { - LOG_EXCEPTION(exec); + addExceptionToConsole(exec); exec->clearException(); } @@ -434,7 +435,7 @@ static void getListFromNSArray(ExecState *exec, NSArray *array, RootObject* root // This is a workaround for a gcc 3.3 internal compiler error. return @"Undefined"; - JSLock lock; + JSLock lock(false); ExecState* exec = [self _rootObject]->globalObject()->globalExec(); id result = convertValueToObjcValue(exec, [self _imp], ObjcObjectType).objectValue; @@ -454,11 +455,11 @@ static void getListFromNSArray(ExecState *exec, NSArray *array, RootObject* root ExecState* exec = [self _rootObject]->globalObject()->globalExec(); ASSERT(!exec->hadException()); - JSLock lock; - JSValue *result = [self _imp]->get(exec, index); + JSLock lock(false); + JSValue* result = [self _imp]->get(exec, index); if (exec->hadException()) { - LOG_EXCEPTION(exec); + addExceptionToConsole(exec); result = jsUndefined(); exec->clearException(); } @@ -478,11 +479,11 @@ static void getListFromNSArray(ExecState *exec, NSArray *array, RootObject* root ExecState* exec = [self _rootObject]->globalObject()->globalExec(); ASSERT(!exec->hadException()); - JSLock lock; + JSLock lock(false); [self _imp]->put(exec, index, convertObjcValueToValue(exec, &value, ObjcObjectType, [self _rootObject])); if (exec->hadException()) { - LOG_EXCEPTION(exec); + addExceptionToConsole(exec); exec->clearException(); } @@ -493,18 +494,7 @@ static void getListFromNSArray(ExecState *exec, NSArray *array, RootObject* root { if (![self _rootObject]) return; - - JSLock lock; - - ExecState* exec = 0; - JSObject* globalObject = [self _rootObject]->globalObject(); - ExecStateStack::const_iterator end = ExecState::activeExecStates().end(); - for (ExecStateStack::const_iterator it = ExecState::activeExecStates().begin(); it != end; ++it) - if ((*it)->dynamicGlobalObject() == globalObject) - exec = *it; - - if (exec) - throwError(exec, GeneralError, description); + ObjcInstance::setGlobalException(description, [self _rootObject]->globalObject()); } - (JSObjectRef)JSObject @@ -518,17 +508,17 @@ static void getListFromNSArray(ExecState *exec, NSArray *array, RootObject* root + (id)_convertValueToObjcValue:(JSValue*)value originRootObject:(RootObject*)originRootObject rootObject:(RootObject*)rootObject { if (value->isObject()) { - JSObject* object = static_cast<JSObject*>(value); + JSObject* object = asObject(value); ExecState* exec = rootObject->globalObject()->globalExec(); - JSLock lock; + JSLock lock(false); - if (object->classInfo() != &RuntimeObjectImp::info) { - JSValue* runtimeObject = object->get(exec, "__apple_runtime_object"); + if (object->classInfo() != &RuntimeObjectImp::s_info) { + JSValue* runtimeObject = object->get(exec, Identifier(exec, "__apple_runtime_object")); if (runtimeObject && runtimeObject->isObject()) - object = static_cast<RuntimeObjectImp*>(runtimeObject); + object = asObject(runtimeObject); } - if (object->classInfo() == &RuntimeObjectImp::info) { + if (object->classInfo() == &RuntimeObjectImp::s_info) { RuntimeObjectImp* imp = static_cast<RuntimeObjectImp*>(object); ObjcInstance *instance = static_cast<ObjcInstance*>(imp->getInternalInstance()); if (instance) @@ -540,8 +530,8 @@ static void getListFromNSArray(ExecState *exec, NSArray *array, RootObject* root } if (value->isString()) { - UString u = value->getString(); - return [NSString stringWithCharacters:(const unichar*)u.data() length:u.size()]; + const UString& u = asString(value)->value(); + return [NSString stringWithCharacters:u.data() length:u.size()]; } if (value->isNumber()) @@ -629,7 +619,7 @@ static void getListFromNSArray(ExecState *exec, NSArray *array, RootObject* root { } -- (unsigned)retainCount +- (NSUInteger)retainCount { return UINT_MAX; } |