Move -_enterFrame and -_leaveFrame from WebCoreScriptDebugger to WebScriptDeb...
[WebKit-https.git] / WebKit / mac / WebView / WebCoreScriptDebugger.mm
index 431e0c68b7d4dcf70f9f952bda28d11bbeea6345..a77986daee7abb31b7bdeee330649f624961776d 100644 (file)
@@ -32,6 +32,7 @@
 
 #import "WebCoreScriptDebugger.h"
 
+#import "WebScriptDebugDelegate.h"
 #import <JavaScriptCore/ExecState.h>
 #import <JavaScriptCore/JSGlobalObject.h>
 #import <JavaScriptCore/debugger.h>
 using namespace KJS;
 using namespace WebCore;
 
-@interface WebCoreScriptDebugger (WebCoreScriptDebuggerInternal)
-
-- (WebCoreScriptCallFrame *)_enterFrame:(ExecState *)state;
-- (WebCoreScriptCallFrame *)_leaveFrame;
-
-@end
-
-@interface WebCoreScriptCallFrame (WebCoreScriptDebuggerInternal)
-
-- (WebCoreScriptCallFrame *)_initWithGlobalObject:(WebScriptObject *)globalObj caller:(WebCoreScriptCallFrame *)caller state:(ExecState *)state;
-- (void)_setWrapper:(id)wrapper;
-- (id)_convertValueToObjcValue:(JSValue *)value;
-
-@end
-
 // convert UString to NSString
 NSString *toNSString(const UString& s)
 {
@@ -84,13 +70,13 @@ class WebCoreScriptDebuggerImp : public KJS::Debugger {
   private:
     WebCoreScriptDebugger  *_objc;      // our ObjC half
     bool                    _nested;    // true => this is a nested call
-    WebCoreScriptCallFrame *_current;   // top stack frame (copy of same field from ObjC side)
+    WebScriptCallFrame *_current;   // top stack frame (copy of same field from ObjC side)
 
   public:
     // constructor
     WebCoreScriptDebuggerImp(WebCoreScriptDebugger *objc, JSGlobalObject* globalObject) : _objc(objc) {
         _nested = true;
-        _current = [_objc _enterFrame:globalObject->globalExec()];
+        _current = [[_objc delegate] enterFrame:globalObject->globalExec()];
         attach(globalObject);
         [[_objc delegate] enteredFrame:_current sourceId:-1 line:-1];
         _nested = false;
@@ -108,7 +94,7 @@ class WebCoreScriptDebuggerImp : public KJS::Debugger {
     virtual bool callEvent(ExecState *state, int sid, int lineno, JSObject *func, const List &args) {
         if (!_nested) {
             _nested = true;
-            _current = [_objc _enterFrame:state];
+            _current = [[_objc delegate] enterFrame:state];
             [[_objc delegate] enteredFrame:_current sourceId:sid line:lineno];
             _nested = false;
         }
@@ -126,7 +112,7 @@ class WebCoreScriptDebuggerImp : public KJS::Debugger {
         if (!_nested) {
             _nested = true;
             [[_objc delegate] leavingFrame:_current sourceId:sid line:lineno];
-            _current = [_objc _leaveFrame];
+            _current = [[_objc delegate] leaveFrame];
             _nested = false;
         }
         return true;
@@ -171,7 +157,6 @@ class WebCoreScriptDebuggerImp : public KJS::Debugger {
 
 - (void)dealloc
 {
-    [_current release];
     delete _debugger;
     [super dealloc];
 }
@@ -188,175 +173,3 @@ class WebCoreScriptDebuggerImp : public KJS::Debugger {
 }
 
 @end
-
-@implementation WebCoreScriptDebugger (WebCoreScriptDebuggerInternal)
-
-- (WebCoreScriptCallFrame *)_enterFrame:(ExecState *)state;
-{
-    WebCoreScriptCallFrame *callee = [[WebCoreScriptCallFrame alloc] _initWithGlobalObject:_globalObj caller:_current state:state];
-    [callee _setWrapper:[_delegate newWrapperForFrame:callee]];
-    return _current = callee;
-}
-
-- (WebCoreScriptCallFrame *)_leaveFrame;
-{
-    WebCoreScriptCallFrame *caller = [[_current caller] retain];
-    [_current release];
-    return _current = caller;
-}
-
-@end
-
-// WebCoreScriptCallFrame
-//
-// One of these is created to represent each stack frame.  Additionally, there is a "global"
-// frame to represent the outermost scope.  This global frame is always the last frame in
-// the chain of callers.
-//
-// The delegate can assign a "wrapper" to each frame object so it can relay calls through its
-// own exported interface.  This class is private to WebCore (and the delegate).
-
-@implementation WebCoreScriptCallFrame (WebCoreScriptDebuggerInternal)
-
-- (WebCoreScriptCallFrame *)_initWithGlobalObject:(WebScriptObject *)globalObj caller:(WebCoreScriptCallFrame *)caller state:(ExecState *)state
-{
-    if ((self = [super init])) {
-        _globalObj = globalObj;
-        _caller    = caller;    // (already retained)
-        _state     = state;
-    }
-    return self;
-}
-
-- (void)_setWrapper:(id)wrapper
-{
-    _wrapper = wrapper;     // (already retained)
-}
-
-- (id)_convertValueToObjcValue:(JSValue *)value
-{
-    if (!value)
-        return nil;
-
-    if (value == [_globalObj _imp])
-        return _globalObj;
-
-    Bindings::RootObject* root1 = [_globalObj _originRootObject];
-    if (!root1)
-        return nil;
-
-    Bindings::RootObject* root2 = [_globalObj _rootObject];
-    if (!root2)
-        return nil;
-
-    return [WebScriptObject _convertValueToObjcValue:value originRootObject:root1 rootObject:root2];
-}
-
-@end
-
-@implementation WebCoreScriptCallFrame
-
-- (void)dealloc
-{
-    [_wrapper release];
-    [_caller release];
-    [super dealloc];
-}
-
-- (id)wrapper
-{
-    return _wrapper;
-}
-
-- (WebCoreScriptCallFrame *)caller
-{
-    return _caller;
-}
-
-- (ExecState*)state
-{
-    return _state;
-}
-
-// Returns an array of scope objects (most local first).
-// The properties of each scope object are the variables for that scope.
-// Note that the last entry in the array will _always_ be the global object (windowScriptObject),
-// whose properties are the global variables.
-
-- (NSArray *)scopeChain
-{
-    if (!_state->scopeNode()) {  // global frame
-        return [NSArray arrayWithObject:_globalObj];
-    }
-
-    ScopeChain      chain  = _state->scopeChain();
-    NSMutableArray *scopes = [[NSMutableArray alloc] init];
-
-    while (!chain.isEmpty()) {
-        [scopes addObject:[self _convertValueToObjcValue:chain.top()]];
-        chain.pop();
-    }
-
-    NSArray *result = [NSArray arrayWithArray:scopes];
-    [scopes release];
-    return result;
-}
-
-// 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