Move -exception and -evaluateWebScript: to WebScriptCallFrame
authoraroben@apple.com <aroben@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 5 Mar 2008 19:34:44 +0000 (19:34 +0000)
committeraroben@apple.com <aroben@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 5 Mar 2008 19:34:44 +0000 (19:34 +0000)
         Reviewed by Darin.

         * WebView/WebCoreScriptDebugger.h: Removed declarations of -exception
         and -evaluateWebScript:.
         * WebView/WebCoreScriptDebugger.mm: Removed -exception and
         -evaluateWebScript:.
         * WebView/WebScriptDebugDelegate.mm:
         (-[WebScriptCallFrame exception]): Added. Code came from
         -[WebCoreScriptCallFrame exception].
         (-[WebScriptCallFrame evaluateWebScript:]): Added. Code came from
         -[WebCoreScriptCallFrame evaluateWebScript:].

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@30804 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/mac/ChangeLog
WebKit/mac/WebView/WebCoreScriptDebugger.h
WebKit/mac/WebView/WebCoreScriptDebugger.mm
WebKit/mac/WebView/WebScriptDebugDelegate.mm

index e4c81705498b8bfb66f7c401c8993b02b8695be5..db36de4c43a4fcf074fce7d0ef484842eb03b427 100644 (file)
@@ -1,3 +1,19 @@
+2008-03-05  Adam Roben  <aroben@apple.com>
+
+        Move -exception and -evaluateWebScript: to WebScriptCallFrame
+
+        Reviewed by Darin.
+
+        * WebView/WebCoreScriptDebugger.h: Removed declarations of -exception
+        and -evaluateWebScript:.
+        * WebView/WebCoreScriptDebugger.mm: Removed -exception and
+        -evaluateWebScript:.
+        * WebView/WebScriptDebugDelegate.mm:
+        (-[WebScriptCallFrame exception]): Added. Code came from
+        -[WebCoreScriptCallFrame exception].
+        (-[WebScriptCallFrame evaluateWebScript:]): Added. Code came from
+        -[WebCoreScriptCallFrame evaluateWebScript:].
+
 2008-03-05  Adam Roben  <aroben@apple.com>
 
         Move -scopeChain to WebScriptCallFrame
index 16125705abac4b0ef17314ea991fec11a5544d78..41eaed2d218986de939d6c8c21e73a525357b11f 100644 (file)
@@ -90,8 +90,6 @@ NSString *toNSString(const KJS::UString&);
 - (WebCoreScriptCallFrame *)caller;
 - (KJS::ExecState*)state;
 
-- (id)exception;
-- (id)evaluateWebScript:(NSString *)script;
 - (id)_convertValueToObjcValue:(KJS::JSValue*)value;
 
 @end
index 3410d13f4b80dcc33408b0800b6fc7e2e9dee852..a96277c62474e86c5ad1032377054c13ec2be1e7 100644 (file)
@@ -282,61 +282,4 @@ class WebCoreScriptDebuggerImp : public KJS::Debugger {
     return _state;
 }
 
-// Returns the pending exception for this frame (nil if none).
-
-- (id)exception
-{
-    if (!_state->hadException()) return nil;
-    return [self _convertValueToObjcValue:_state->exception()];
-}
-
-// Evaluate some JavaScript code in the context of this frame.
-// The code is evaluated as if by "eval", and the result is returned.
-// If there is an (uncaught) exception, it is returned as though _it_ were the result.
-// Calling this method on the global frame is not quite the same as calling the WebScriptObject
-// method of the same name, due to the treatment of exceptions.
-
-// FIXME: If "script" contains var declarations, the machinery to handle local variables
-// efficiently in JavaScriptCore will not work properly. This could lead to crashes or
-// incorrect variable values. So this is not appropriate for evaluating arbitrary script.
-- (id)evaluateWebScript:(NSString *)script
-{
-    JSLock lock;
-
-    UString code = String(script);
-
-    ExecState* state = _state;
-    JSGlobalObject* globalObject = state->dynamicGlobalObject();
-
-    // find "eval"
-    JSObject *eval = NULL;
-    if (state->scopeNode()) {  // "eval" won't work without context (i.e. at global scope)
-        JSValue *v = globalObject->get(state, "eval");
-        if (v->isObject() && static_cast<JSObject *>(v)->implementsCall())
-            eval = static_cast<JSObject *>(v);
-        else
-            // no "eval" - fallback operates on global exec state
-            state = globalObject->globalExec();
-    }
-
-    JSValue *savedException = state->exception();
-    state->clearException();
-
-    // evaluate
-    JSValue *result;
-    if (eval) {
-        List args;
-        args.append(jsString(code));
-        result = eval->call(state, NULL, args);
-    } else
-        // no "eval", or no context (i.e. global scope) - use global fallback
-        result = Interpreter::evaluate(state, UString(), 0, code.data(), code.size(), globalObject).value();
-
-    if (state->hadException())
-        result = state->exception();    // (may be redundant depending on which eval path was used)
-    state->setException(savedException);
-
-    return [self _convertValueToObjcValue:result];
-}
-
 @end
index 0af559cc73c5a1d9b09e51f11d3aac55ba135c5c..1df28afb387de494940d825a4827be6441c617aa 100644 (file)
@@ -36,7 +36,9 @@
 #import "WebScriptDebugServerPrivate.h"
 #import "WebViewInternal.h"
 #import <JavaScriptCore/ExecState.h>
+#import <JavaScriptCore/JSGlobalObject.h>
 #import <JavaScriptCore/function.h>
+#import <JavaScriptCore/interpreter.h>
 #import <WebCore/Frame.h>
 
 using namespace KJS;
@@ -216,14 +218,63 @@ NSString * const WebScriptErrorLineNumberKey = @"WebScriptErrorLineNumber";
     return toNSString(fn.ustring());
 }
 
+// Returns the pending exception for this frame (nil if none).
+
 - (id)exception
 {
-    return [_private exception];
+    ExecState* state = [_private state];
+    if (!state->hadException())
+        return nil;
+    return [_private _convertValueToObjcValue:state->exception()];
 }
 
+// Evaluate some JavaScript code in the context of this frame.
+// The code is evaluated as if by "eval", and the result is returned.
+// If there is an (uncaught) exception, it is returned as though _it_ were the result.
+// Calling this method on the global frame is not quite the same as calling the WebScriptObject
+// method of the same name, due to the treatment of exceptions.
+
+// FIXME: If "script" contains var declarations, the machinery to handle local variables
+// efficiently in JavaScriptCore will not work properly. This could lead to crashes or
+// incorrect variable values. So this is not appropriate for evaluating arbitrary script.
 - (id)evaluateWebScript:(NSString *)script
 {
-    return [_private evaluateWebScript:script];
+    JSLock lock;
+
+    UString code = String(script);
+
+    ExecState* state = [_private state];
+    JSGlobalObject* globalObject = state->dynamicGlobalObject();
+
+    // find "eval"
+    JSObject* eval = NULL;
+    if (state->scopeNode()) {  // "eval" won't work without context (i.e. at global scope)
+        JSValue* v = globalObject->get(state, "eval");
+        if (v->isObject() && static_cast<JSObject*>(v)->implementsCall())
+            eval = static_cast<JSObject*>(v);
+        else
+            // no "eval" - fallback operates on global exec state
+            state = globalObject->globalExec();
+    }
+
+    JSValue* savedException = state->exception();
+    state->clearException();
+
+    // evaluate
+    JSValue* result;
+    if (eval) {
+        List args;
+        args.append(jsString(code));
+        result = eval->call(state, 0, args);
+    } else
+        // no "eval", or no context (i.e. global scope) - use global fallback
+        result = Interpreter::evaluate(state, UString(), 0, code.data(), code.size(), globalObject).value();
+
+    if (state->hadException())
+        result = state->exception();    // (may be redundant depending on which eval path was used)
+    state->setException(savedException);
+
+    return [_private _convertValueToObjcValue:result];
 }
 
 @end