Fix regexp match pair end-index == -1 assumption. (r=dmandelin, a=blocker b=605754)
[mozilla-central.git] / js / jsd / jsd_xpc.h
blob06e5c2aeab831f9942d751b6d795904ee1c95ae6
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
3 * ***** BEGIN LICENSE BLOCK *****
4 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
6 * The contents of this file are subject to the Mozilla Public License Version
7 * 1.1 (the "License"); you may not use this file except in compliance with
8 * the License. You may obtain a copy of the License at
9 * http://www.mozilla.org/MPL/
11 * Software distributed under the License is distributed on an "AS IS" basis,
12 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13 * for the specific language governing rights and limitations under the
14 * License.
16 * The Original Code is mozilla.org code.
18 * The Initial Developer of the Original Code is
19 * Netscape Communications Corporation.
20 * Portions created by the Initial Developer are Copyright (C) 1998
21 * the Initial Developer. All Rights Reserved.
23 * Contributor(s):
24 * Robert Ginda, <rginda@netscape.com>
26 * Alternatively, the contents of this file may be used under the terms of
27 * either the GNU General Public License Version 2 or later (the "GPL"), or
28 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29 * in which case the provisions of the GPL or the LGPL are applicable instead
30 * of those above. If you wish to allow use of your version of this file only
31 * under the terms of either the GPL or the LGPL, and not to allow others to
32 * use your version of this file under the terms of the MPL, indicate your
33 * decision by deleting the provisions above and replace them with the notice
34 * and other provisions required by the GPL or the LGPL. If you do not delete
35 * the provisions above, a recipient may use your version of this file under
36 * the terms of any one of the MPL, the GPL or the LGPL.
38 * ***** END LICENSE BLOCK ***** */
40 #ifndef JSDSERVICE_H___
41 #define JSDSERVICE_H___
43 #include "jsdIDebuggerService.h"
44 #include "jsdebug.h"
45 #include "nsString.h"
46 #include "nsCOMPtr.h"
47 #include "nspr.h"
49 // #if defined(DEBUG_rginda_l)
50 // # define DEBUG_verbose
51 // #endif
53 struct LiveEphemeral {
54 /* link in a chain of live values list */
55 PRCList links;
56 jsdIEphemeral *value;
57 void *key;
60 struct PCMapEntry {
61 PRUint32 pc, line;
64 /*******************************************************************************
65 * reflected jsd data structures
66 *******************************************************************************/
68 class jsdObject : public jsdIObject
70 public:
71 NS_DECL_ISUPPORTS
72 NS_DECL_JSDIOBJECT
74 /* you'll normally use use FromPtr() instead of directly constructing one */
75 jsdObject (JSDContext *aCx, JSDObject *aObject) :
76 mCx(aCx), mObject(aObject)
80 static jsdIObject *FromPtr (JSDContext *aCx,
81 JSDObject *aObject)
83 if (!aObject)
84 return nsnull;
86 jsdIObject *rv = new jsdObject (aCx, aObject);
87 NS_IF_ADDREF(rv);
88 return rv;
91 private:
92 jsdObject(); /* no implementation */
93 jsdObject(const jsdObject&); /* no implementation */
95 JSDContext *mCx;
96 JSDObject *mObject;
100 class jsdProperty : public jsdIProperty
102 public:
103 NS_DECL_ISUPPORTS
104 NS_DECL_JSDIPROPERTY
105 NS_DECL_JSDIEPHEMERAL
107 jsdProperty (JSDContext *aCx, JSDProperty *aProperty);
108 virtual ~jsdProperty ();
110 static jsdIProperty *FromPtr (JSDContext *aCx,
111 JSDProperty *aProperty)
113 if (!aProperty)
114 return nsnull;
116 jsdIProperty *rv = new jsdProperty (aCx, aProperty);
117 NS_IF_ADDREF(rv);
118 return rv;
121 static void InvalidateAll();
123 private:
124 jsdProperty(); /* no implementation */
125 jsdProperty(const jsdProperty&); /* no implementation */
127 PRBool mValid;
128 LiveEphemeral mLiveListEntry;
129 JSDContext *mCx;
130 JSDProperty *mProperty;
133 class jsdScript : public jsdIScript
135 public:
136 NS_DECL_ISUPPORTS
137 NS_DECL_JSDISCRIPT
138 NS_DECL_JSDIEPHEMERAL
140 /* you'll normally use use FromPtr() instead of directly constructing one */
141 jsdScript (JSDContext *aCx, JSDScript *aScript);
142 virtual ~jsdScript();
144 static jsdIScript *FromPtr (JSDContext *aCx, JSDScript *aScript)
146 if (!aScript)
147 return nsnull;
149 void *data = JSD_GetScriptPrivate (aScript);
150 jsdIScript *rv;
152 if (data) {
153 rv = static_cast<jsdIScript *>(data);
154 } else {
155 rv = new jsdScript (aCx, aScript);
156 NS_IF_ADDREF(rv); /* addref for the SetScriptPrivate, released in
157 * Invalidate() */
158 JSD_SetScriptPrivate (aScript, static_cast<void *>(rv));
161 NS_IF_ADDREF(rv); /* addref for return value */
162 return rv;
165 static void InvalidateAll();
167 private:
168 static PRUint32 LastTag;
170 jsdScript(); /* no implementation */
171 jsdScript (const jsdScript&); /* no implementation */
172 PCMapEntry* CreatePPLineMap();
173 PRUint32 PPPcToLine(PRUint32 aPC);
174 PRUint32 PPLineToPc(PRUint32 aLine);
176 PRBool mValid;
177 PRUint32 mTag;
178 JSDContext *mCx;
179 JSDScript *mScript;
180 nsCString *mFileName;
181 nsCString *mFunctionName;
182 PRUint32 mBaseLineNumber, mLineExtent;
183 PCMapEntry *mPPLineMap;
184 PRUint32 mPCMapSize;
185 jsuword mFirstPC;
188 PRUint32 jsdScript::LastTag = 0;
190 class jsdContext : public jsdIContext
192 public:
193 NS_DECL_ISUPPORTS
194 NS_DECL_JSDICONTEXT
195 NS_DECL_JSDIEPHEMERAL
197 jsdContext (JSDContext *aJSDCx, JSContext *aJSCx, nsISupports *aISCx);
198 virtual ~jsdContext();
200 static void InvalidateAll();
201 static jsdIContext *FromPtr (JSDContext *aJSDCx, JSContext *aJSCx);
202 private:
203 static PRUint32 LastTag;
205 jsdContext (); /* no implementation */
206 jsdContext (const jsdContext&); /* no implementation */
208 PRBool mValid;
209 LiveEphemeral mLiveListEntry;
210 PRUint32 mTag;
211 JSDContext *mJSDCx;
212 JSContext *mJSCx;
213 nsCOMPtr<nsISupports> mISCx;
216 PRUint32 jsdContext::LastTag = 0;
218 class jsdStackFrame : public jsdIStackFrame
220 public:
221 NS_DECL_ISUPPORTS
222 NS_DECL_JSDISTACKFRAME
223 NS_DECL_JSDIEPHEMERAL
225 /* you'll normally use use FromPtr() instead of directly constructing one */
226 jsdStackFrame (JSDContext *aCx, JSDThreadState *aThreadState,
227 JSDStackFrameInfo *aStackFrameInfo);
228 virtual ~jsdStackFrame();
230 static void InvalidateAll();
231 static jsdIStackFrame* FromPtr (JSDContext *aCx,
232 JSDThreadState *aThreadState,
233 JSDStackFrameInfo *aStackFrameInfo);
235 private:
236 jsdStackFrame(); /* no implementation */
237 jsdStackFrame(const jsdStackFrame&); /* no implementation */
239 PRBool mValid;
240 LiveEphemeral mLiveListEntry;
241 JSDContext *mCx;
242 JSDThreadState *mThreadState;
243 JSDStackFrameInfo *mStackFrameInfo;
246 class jsdValue : public jsdIValue
248 public:
249 NS_DECL_ISUPPORTS
250 NS_DECL_JSDIVALUE
251 NS_DECL_JSDIEPHEMERAL
253 /* you'll normally use use FromPtr() instead of directly constructing one */
254 jsdValue (JSDContext *aCx, JSDValue *aValue);
255 virtual ~jsdValue();
257 static jsdIValue *FromPtr (JSDContext *aCx, JSDValue *aValue);
258 static void InvalidateAll();
260 private:
261 jsdValue(); /* no implementation */
262 jsdValue (const jsdScript&); /* no implementation */
264 PRBool mValid;
265 LiveEphemeral mLiveListEntry;
266 JSDContext *mCx;
267 JSDValue *mValue;
270 /******************************************************************************
271 * debugger service
272 ******************************************************************************/
274 class jsdService : public jsdIDebuggerService
276 public:
277 NS_DECL_ISUPPORTS
278 NS_DECL_JSDIDEBUGGERSERVICE
280 jsdService() : mOn(PR_FALSE), mPauseLevel(0),
281 mNestedLoopLevel(0), mCx(0), mRuntime(0), mErrorHook(0),
282 mBreakpointHook(0), mDebugHook(0), mDebuggerHook(0),
283 mInterruptHook(0), mScriptHook(0), mThrowHook(0),
284 mTopLevelHook(0), mFunctionHook(0)
288 virtual ~jsdService();
290 static jsdService *GetService ();
292 private:
293 PRBool mOn;
294 PRUint32 mPauseLevel;
295 PRUint32 mNestedLoopLevel;
296 JSDContext *mCx;
297 JSRuntime *mRuntime;
299 nsCOMPtr<jsdIErrorHook> mErrorHook;
300 nsCOMPtr<jsdIExecutionHook> mBreakpointHook;
301 nsCOMPtr<jsdIExecutionHook> mDebugHook;
302 nsCOMPtr<jsdIExecutionHook> mDebuggerHook;
303 nsCOMPtr<jsdIExecutionHook> mInterruptHook;
304 nsCOMPtr<jsdIScriptHook> mScriptHook;
305 nsCOMPtr<jsdIExecutionHook> mThrowHook;
306 nsCOMPtr<jsdICallHook> mTopLevelHook;
307 nsCOMPtr<jsdICallHook> mFunctionHook;
308 nsCOMPtr<jsdIActivationCallback> mActivationCallback;
311 #endif /* JSDSERVICE_H___ */
314 /* graveyard */
316 #if 0
318 class jsdContext : public jsdIContext
320 public:
321 NS_DECL_ISUPPORTS
322 NS_DECL_JSDICONTEXT
324 /* you'll normally use use FromPtr() instead of directly constructing one */
325 jsdContext (JSDContext *aCx) : mCx(aCx)
327 printf ("++++++ jsdContext\n");
330 static jsdIContext *FromPtr (JSDContext *aCx)
332 if (!aCx)
333 return nsnull;
335 void *data = JSD_GetContextPrivate (aCx);
336 jsdIContext *rv;
338 if (data) {
339 rv = static_cast<jsdIContext *>(data);
340 } else {
341 rv = new jsdContext (aCx);
342 NS_IF_ADDREF(rv); // addref for the SetContextPrivate
343 JSD_SetContextPrivate (aCx, static_cast<void *>(rv));
346 NS_IF_ADDREF(rv); // addref for the return value
347 return rv;
350 virtual ~jsdContext() { printf ("------ ~jsdContext\n"); }
351 private:
352 jsdContext(); /* no implementation */
353 jsdContext(const jsdContext&); /* no implementation */
355 JSDContext *mCx;
358 class jsdThreadState : public jsdIThreadState
360 public:
361 NS_DECL_ISUPPORTS
362 NS_DECL_JSDITHREADSTATE
364 /* you'll normally use use FromPtr() instead of directly constructing one */
365 jsdThreadState (JSDContext *aCx, JSDThreadState *aThreadState) :
366 mCx(aCx), mThreadState(aThreadState)
370 /* XXX These things are only valid for a short period of time, they reflect
371 * state in the js engine that will go away after stepping past wherever
372 * we were stopped at when this was created. We could keep a list of every
373 * instance of this we've created, and "invalidate" them before we let the
374 * engine continue. The next time we need a threadstate, we can search the
375 * list to find an invalidated one, and just reuse it.
377 static jsdIThreadState *FromPtr (JSDContext *aCx,
378 JSDThreadState *aThreadState)
380 if (!aThreadState)
381 return nsnull;
383 jsdIThreadState *rv = new jsdThreadState (aCx, aThreadState);
384 NS_IF_ADDREF(rv);
385 return rv;
388 private:
389 jsdThreadState(); /* no implementation */
390 jsdThreadState(const jsdThreadState&); /* no implementation */
392 JSDContext *mCx;
393 JSDThreadState *mThreadState;
396 #endif