Name the WebKit build phase script that generates WebKit.LP64.exp.
[WebKit-https.git] / WebKit / mac / WebView / WebCoreScriptDebugger.mm
1 /*
2  * Copyright (C) 2005, 2008 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer. 
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution. 
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission. 
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 // FIXME: This file and the classes in it should have the prefix "Web" instead
30 // of "WebCore". The best way to fix this is to merge WebCoreScriptCallFrame
31 // with WebScriptCallFrame and WebCoreScriptDebugger with WebScriptDebugger.
32
33 #import "WebCoreScriptDebugger.h"
34
35 #import "WebScriptDebugDelegate.h"
36 #import <JavaScriptCore/ExecState.h>
37 #import <JavaScriptCore/JSGlobalObject.h>
38 #import <JavaScriptCore/debugger.h>
39 #import <JavaScriptCore/function.h>
40 #import <JavaScriptCore/interpreter.h>
41 #import <WebCore/KURL.h>
42 #import <WebCore/PlatformString.h>
43 #import <WebCore/WebCoreObjCExtras.h>
44 #import <WebCore/WebScriptObjectPrivate.h>
45 #import <WebCore/runtime_root.h>
46
47 using namespace KJS;
48 using namespace WebCore;
49
50 @interface WebCoreScriptDebugger (WebCoreScriptDebuggerInternal)
51
52 - (WebScriptCallFrame *)_enterFrame:(ExecState *)state;
53 - (WebScriptCallFrame *)_leaveFrame;
54
55 @end
56
57 // convert UString to NSString
58 NSString *toNSString(const UString& s)
59 {
60     if (s.isEmpty())
61         return nil;
62     return [NSString stringWithCharacters:reinterpret_cast<const unichar*>(s.data()) length:s.size()];
63 }
64
65 // convert UString to NSURL
66 static NSURL *toNSURL(const UString& s)
67 {
68     if (s.isEmpty())
69         return nil;
70     return KURL(s);
71 }
72
73 // C++ interface to KJS debugger callbacks
74
75 class WebCoreScriptDebuggerImp : public KJS::Debugger {
76
77   private:
78     WebCoreScriptDebugger  *_objc;      // our ObjC half
79     bool                    _nested;    // true => this is a nested call
80     WebScriptCallFrame *_current;   // top stack frame (copy of same field from ObjC side)
81
82   public:
83     // constructor
84     WebCoreScriptDebuggerImp(WebCoreScriptDebugger *objc, JSGlobalObject* globalObject) : _objc(objc) {
85         _nested = true;
86         _current = [_objc _enterFrame:globalObject->globalExec()];
87         attach(globalObject);
88         [[_objc delegate] enteredFrame:_current sourceId:-1 line:-1];
89         _nested = false;
90     }
91
92     // callbacks - relay to delegate
93     virtual bool sourceParsed(ExecState *state, int sid, const UString &url, const UString &source, int lineNumber, int errorLine, const UString &errorMsg) {
94         if (!_nested) {
95             _nested = true;
96             [[_objc delegate] parsedSource:toNSString(source) fromURL:toNSURL(url) sourceId:sid startLine:lineNumber errorLine:errorLine errorMessage:toNSString(errorMsg)];
97             _nested = false;
98         }
99         return true;
100     }
101     virtual bool callEvent(ExecState *state, int sid, int lineno, JSObject *func, const List &args) {
102         if (!_nested) {
103             _nested = true;
104             _current = [_objc _enterFrame:state];
105             [[_objc delegate] enteredFrame:_current sourceId:sid line:lineno];
106             _nested = false;
107         }
108         return true;
109     }
110     virtual bool atStatement(ExecState *state, int sid, int lineno, int lastLine) {
111         if (!_nested) {
112             _nested = true;
113             [[_objc delegate] hitStatement:_current sourceId:sid line:lineno];
114             _nested = false;
115         }
116         return true;
117     }
118     virtual bool returnEvent(ExecState *state, int sid, int lineno, JSObject *func) {
119         if (!_nested) {
120             _nested = true;
121             [[_objc delegate] leavingFrame:_current sourceId:sid line:lineno];
122             _current = [_objc _leaveFrame];
123             _nested = false;
124         }
125         return true;
126     }
127     virtual bool exception(ExecState *state, int sid, int lineno, JSValue *exception) {
128         if (!_nested) {
129             _nested = true;
130             [[_objc delegate] exceptionRaised:_current sourceId:sid line:lineno];
131             _nested = false;
132         }
133         return true;
134     }
135
136 };
137
138 // WebCoreScriptDebugger
139 //
140 // This is the main (behind-the-scenes) debugger class in WebCore.
141 //
142 // The WebCoreScriptDebugger has two faces, one for Objective-C (this class), and another (WebCoreScriptDebuggerImp)
143 // for C++.  The ObjC side creates the C++ side, which does the real work of attaching to the global object and
144 // forwarding the KJS debugger callbacks to the delegate.
145
146 @implementation WebCoreScriptDebugger
147
148 #ifndef BUILDING_ON_TIGER
149 + (void)initialize
150 {
151     WebCoreObjCFinalizeOnMainThread(self);
152 }
153 #endif
154
155 - (WebCoreScriptDebugger *)initWithDelegate:(id<WebScriptDebugger>)delegate
156 {
157     if ((self = [super init])) {
158         _delegate  = delegate;
159         _globalObj = [_delegate globalObject];
160         _debugger  = new WebCoreScriptDebuggerImp(self, [_globalObj _rootObject]->globalObject());
161     }
162     return self;
163 }
164
165 - (void)dealloc
166 {
167     [_current release];
168     delete _debugger;
169     [super dealloc];
170 }
171
172 - (void)finalize
173 {
174     delete _debugger;
175     [super finalize];
176 }
177
178 - (id<WebScriptDebugger>)delegate
179 {
180     return _delegate;
181 }
182
183 @end
184
185 @implementation WebCoreScriptDebugger (WebCoreScriptDebuggerInternal)
186
187 - (WebScriptCallFrame *)_enterFrame:(ExecState *)state;
188 {
189     _current = [_delegate newFrameWithGlobalObject:_globalObj caller:_current state:state];
190     return _current;
191 }
192
193 - (WebScriptCallFrame *)_leaveFrame;
194 {
195     WebScriptCallFrame *caller = [[_current caller] retain];
196     [_current release];
197     return _current = caller;
198 }
199
200 @end