1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* ***** BEGIN LICENSE BLOCK *****
3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5 * The contents of this file are subject to the Mozilla Public License Version
6 * 1.1 (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 * http://www.mozilla.org/MPL/
10 * Software distributed under the License is distributed on an "AS IS" basis,
11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 * for the specific language governing rights and limitations under the
15 * The Original Code is mozilla.org code.
17 * The Initial Developer of the Original Code is
18 * Netscape Communications Corporation.
19 * Portions created by the Initial Developer are Copyright (C) 1998
20 * the Initial Developer. All Rights Reserved.
24 * Alternatively, the contents of this file may be used under the terms of
25 * either the GNU General Public License Version 2 or later (the "GPL"), or
26 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27 * in which case the provisions of the GPL or the LGPL are applicable instead
28 * of those above. If you wish to allow use of your version of this file only
29 * under the terms of either the GPL or the LGPL, and not to allow others to
30 * use your version of this file under the terms of the MPL, indicate your
31 * decision by deleting the provisions above and replace them with the notice
32 * and other provisions required by the GPL or the LGPL. If you do not delete
33 * the provisions above, a recipient may use your version of this file under
34 * the terms of any one of the MPL, the GPL or the LGPL.
36 * ***** END LICENSE BLOCK ***** */
39 * Header for JavaScript Debugging support - Internal ONLY declarations
46 * NOTE: This is a *private* header file and should only be included by
47 * the sources in js/jsd. Defining EXPORT_JSD_API in an outside module
48 * using jsd would be bad.
50 #define EXPORT_JSD_API 1 /* if used, must be set before include of jsdebug.h */
53 * These can be controled by the makefile, but this allows a place to set
54 * the values always used in the mozilla client, but perhaps done differently
55 * in other embeddings.
58 #define JSD_THREADSAFE 1
59 /* define JSD_HAS_DANGEROUS_THREAD 1 */
60 #define JSD_USE_NSPR_LOCKS 1
61 #endif /* MOZILLA_CLIENT */
64 /* Get jstypes.h included first. After that we can use PR macros for doing
65 * this extern "C" stuff!
78 #include "jsutil.h" /* Added by JSIFY */
79 #include "jshash.h" /* Added by JSIFY */
91 #include <base/pblock.h>
92 #include <base/session.h>
93 #include <frame/log.h>
94 #include <frame/req.h>
100 #define JSD_MAJOR_VERSION 1
101 #define JSD_MINOR_VERSION 1
103 /***************************************************************************/
105 #undef CHECK_BIT_FLAG
106 #define CHECK_BIT_FLAG(f,b) ((f)&(b))
108 #define SET_BIT_FLAG(f,b) ((f)|=(b))
109 #undef CLEAR_BIT_FLAG
110 #define CLEAR_BIT_FLAG(f,b) ((f)&=(~(b)))
112 #define JSD_IS_DEBUG_ENABLED(jsdc,jsdscript) \
113 (!(((jsdc->flags & JSD_DEBUG_WHEN_SET) ? 1 : 0) ^ \
114 ((jsdscript->flags & JSD_SCRIPT_DEBUG_BIT) ? 1 : 0)))
115 #define JSD_IS_PROFILE_ENABLED(jsdc,jsdscript) \
116 ((jsdc->flags & JSD_COLLECT_PROFILE_DATA) && \
117 (!(((jsdc->flags & JSD_PROFILE_WHEN_SET) ? 1 : 0) ^ \
118 ((jsdscript->flags & JSD_SCRIPT_PROFILE_BIT) ? 1 : 0))))
121 /***************************************************************************/
122 /* These are not exposed in jsdebug.h - typedef here for consistency */
124 typedef struct JSDExecHook JSDExecHook
;
125 typedef struct JSDAtom JSDAtom
;
126 typedef struct JSDProfileData JSDProfileData
;
127 /***************************************************************************/
131 * XXX What I'm calling a JSDContext is really more of a JSDTaskState.
136 JSCList links
; /* we are part of a JSCList */
140 JSD_ScriptHookProc scriptHook
;
141 void* scriptHookData
;
142 JSD_ExecutionHookProc interruptHook
;
143 void* interruptHookData
;
145 JSD_ErrorReporter errorReporter
;
146 void* errorReporterData
;
147 JSCList threadsStates
;
148 JSD_ExecutionHookProc debugBreakHook
;
149 void* debugBreakHookData
;
150 JSD_ExecutionHookProc debuggerHook
;
151 void* debuggerHookData
;
152 JSD_ExecutionHookProc throwHook
;
154 JSD_CallHookProc functionHook
;
155 void* functionHookData
;
156 JSD_CallHookProc toplevelHook
;
157 void* toplevelHookData
;
158 JSContext
* dumbContext
;
160 JSD_UserCallbacks userCallbacks
;
163 JSHashTable
* scriptsTable
;
165 JSCList removedSources
;
166 uintN sourceAlterCount
;
169 JSHashTable
* objectsTable
;
170 JSDProfileData
* callingFunctionPData
;
171 int64 lastReturnTime
;
172 #ifdef JSD_THREADSAFE
174 void* sourceTextLock
;
177 void* threadStatesLock
;
178 #endif /* JSD_THREADSAFE */
179 #ifdef JSD_HAS_DANGEROUS_THREAD
180 void* dangerousThread
;
181 #endif /* JSD_HAS_DANGEROUS_THREAD */
187 JSCList links
; /* we are part of a JSCList */
188 JSDContext
* jsdc
; /* JSDContext for this jsdscript */
189 JSScript
* script
; /* script we are wrapping */
190 JSFunction
* function
; /* back pointer to owning function (can be NULL) */
191 uintN lineBase
; /* we cache this */
192 uintN lineExtent
; /* we cache this */
193 JSCList hooks
; /* JSCList of JSDExecHooks for this script */
198 JSDProfileData
*profileData
;
202 LWDBGScript
* lwscript
;
206 struct JSDProfileData
208 JSDProfileData
* caller
;
213 uintN maxRecurseDepth
;
214 jsdouble minExecutionTime
;
215 jsdouble maxExecutionTime
;
216 jsdouble totalExecutionTime
;
217 jsdouble minOwnExecutionTime
;
218 jsdouble maxOwnExecutionTime
;
219 jsdouble totalOwnExecutionTime
;
224 JSCList links
; /* we are part of a JSCList */
230 JSDSourceStatus status
;
237 JSCList links
; /* we are part of a JSCList */
238 JSDScript
* jsdscript
;
240 JSD_ExecutionHookProc hook
;
244 #define TS_HAS_DISABLED_FRAME 0x01
246 struct JSDThreadState
248 JSCList links
; /* we are part of a JSCList */
256 struct JSDStackFrameInfo
258 JSCList links
; /* we are part of a JSCList */
259 JSDThreadState
* jsdthreadstate
;
260 JSDScript
* jsdscript
;
265 #define GOT_PROTO ((short) (1 << 0))
266 #define GOT_PROPS ((short) (1 << 1))
267 #define GOT_PARENT ((short) (1 << 2))
268 #define GOT_CTOR ((short) (1 << 3))
277 const char* className
;
286 JSCList links
; /* we are part of a JSCList */
297 char* str
; /* must be first element in struct for compare */
303 JSCList links
; /* we are part of a JSCList */
312 /***************************************************************************/
313 /* Code validation support */
316 extern void JSD_ASSERT_VALID_CONTEXT(JSDContext
* jsdc
);
317 extern void JSD_ASSERT_VALID_SCRIPT(JSDScript
* jsdscript
);
318 extern void JSD_ASSERT_VALID_SOURCE_TEXT(JSDSourceText
* jsdsrc
);
319 extern void JSD_ASSERT_VALID_THREAD_STATE(JSDThreadState
* jsdthreadstate
);
320 extern void JSD_ASSERT_VALID_STACK_FRAME(JSDStackFrameInfo
* jsdframe
);
321 extern void JSD_ASSERT_VALID_EXEC_HOOK(JSDExecHook
* jsdhook
);
322 extern void JSD_ASSERT_VALID_VALUE(JSDValue
* jsdval
);
323 extern void JSD_ASSERT_VALID_PROPERTY(JSDProperty
* jsdprop
);
324 extern void JSD_ASSERT_VALID_OBJECT(JSDObject
* jsdobj
);
326 #define JSD_ASSERT_VALID_CONTEXT(x) ((void)0)
327 #define JSD_ASSERT_VALID_SCRIPT(x) ((void)0)
328 #define JSD_ASSERT_VALID_SOURCE_TEXT(x) ((void)0)
329 #define JSD_ASSERT_VALID_THREAD_STATE(x)((void)0)
330 #define JSD_ASSERT_VALID_STACK_FRAME(x) ((void)0)
331 #define JSD_ASSERT_VALID_EXEC_HOOK(x) ((void)0)
332 #define JSD_ASSERT_VALID_VALUE(x) ((void)0)
333 #define JSD_ASSERT_VALID_PROPERTY(x) ((void)0)
334 #define JSD_ASSERT_VALID_OBJECT(x) ((void)0)
337 /***************************************************************************/
338 /* higher level functions */
341 jsd_DebuggerOnForUser(JSRuntime
* jsrt
,
342 JSD_UserCallbacks
* callbacks
,
345 jsd_DebuggerOn(void);
348 jsd_DebuggerOff(JSDContext
* jsdc
);
351 jsd_DebuggerPause(JSDContext
* jsdc
, JSBool forceAllHooksOff
);
354 jsd_DebuggerUnpause(JSDContext
* jsdc
);
357 jsd_SetUserCallbacks(JSRuntime
* jsrt
, JSD_UserCallbacks
* callbacks
, void* user
);
360 jsd_JSDContextForJSContext(JSContext
* context
);
363 jsd_SetContextPrivate(JSDContext
* jsdc
, void *data
);
366 jsd_GetContextPrivate(JSDContext
* jsdc
);
369 jsd_ClearAllProfileData(JSDContext
* jsdc
);
372 jsd_SetErrorReporter(JSDContext
* jsdc
,
373 JSD_ErrorReporter reporter
,
377 jsd_GetErrorReporter(JSDContext
* jsdc
,
378 JSD_ErrorReporter
* reporter
,
382 jsd_DebugErrorHook(JSContext
*cx
, const char *message
,
383 JSErrorReport
*report
, void *closure
);
385 /***************************************************************************/
386 /* Script functions */
389 jsd_InitScriptManager(JSDContext
*jsdc
);
392 jsd_DestroyScriptManager(JSDContext
* jsdc
);
395 jsd_FindJSDScript(JSDContext
* jsdc
,
399 jsd_FindOrCreateJSDScript(JSDContext
*jsdc
,
404 extern JSDProfileData
*
405 jsd_GetScriptProfileData(JSDContext
* jsdc
, JSDScript
*script
);
408 jsd_GetScriptFlags(JSDContext
*jsdc
, JSDScript
*script
);
411 jsd_SetScriptFlags(JSDContext
*jsdc
, JSDScript
*script
, uint32 flags
);
414 jsd_GetScriptCallCount(JSDContext
* jsdc
, JSDScript
*script
);
417 jsd_GetScriptMaxRecurseDepth(JSDContext
* jsdc
, JSDScript
*script
);
420 jsd_GetScriptMinExecutionTime(JSDContext
* jsdc
, JSDScript
*script
);
423 jsd_GetScriptMaxExecutionTime(JSDContext
* jsdc
, JSDScript
*script
);
426 jsd_GetScriptTotalExecutionTime(JSDContext
* jsdc
, JSDScript
*script
);
429 jsd_GetScriptMinOwnExecutionTime(JSDContext
* jsdc
, JSDScript
*script
);
432 jsd_GetScriptMaxOwnExecutionTime(JSDContext
* jsdc
, JSDScript
*script
);
435 jsd_GetScriptTotalOwnExecutionTime(JSDContext
* jsdc
, JSDScript
*script
);
438 jsd_ClearScriptProfileData(JSDContext
* jsdc
, JSDScript
*script
);
441 jsd_GetJSScript (JSDContext
*jsdc
, JSDScript
*script
);
444 jsd_GetJSFunction (JSDContext
*jsdc
, JSDScript
*script
);
447 jsd_IterateScripts(JSDContext
* jsdc
, JSDScript
**iterp
);
450 jsd_SetScriptPrivate (JSDScript
*jsdscript
, void *data
);
453 jsd_GetScriptPrivate (JSDScript
*jsdscript
);
456 jsd_IsActiveScript(JSDContext
* jsdc
, JSDScript
*jsdscript
);
459 jsd_GetScriptFilename(JSDContext
* jsdc
, JSDScript
*jsdscript
);
462 jsd_GetScriptFunctionName(JSDContext
* jsdc
, JSDScript
*jsdscript
);
465 jsd_GetScriptBaseLineNumber(JSDContext
* jsdc
, JSDScript
*jsdscript
);
468 jsd_GetScriptLineExtent(JSDContext
* jsdc
, JSDScript
*jsdscript
);
471 jsd_SetScriptHook(JSDContext
* jsdc
, JSD_ScriptHookProc hook
, void* callerdata
);
474 jsd_GetScriptHook(JSDContext
* jsdc
, JSD_ScriptHookProc
* hook
, void** callerdata
);
477 jsd_GetClosestPC(JSDContext
* jsdc
, JSDScript
* jsdscript
, uintN line
);
480 jsd_GetClosestLine(JSDContext
* jsdc
, JSDScript
* jsdscript
, jsuword pc
);
483 jsd_NewScriptHookProc(
485 const char *filename
, /* URL this script loads from */
486 uintN lineno
, /* line where this script starts */
492 jsd_DestroyScriptHookProc(
497 /* Script execution hook functions */
500 jsd_SetExecutionHook(JSDContext
* jsdc
,
501 JSDScript
* jsdscript
,
503 JSD_ExecutionHookProc hook
,
507 jsd_ClearExecutionHook(JSDContext
* jsdc
,
508 JSDScript
* jsdscript
,
512 jsd_ClearAllExecutionHooksForScript(JSDContext
* jsdc
, JSDScript
* jsdscript
);
515 jsd_ClearAllExecutionHooks(JSDContext
* jsdc
);
518 jsd_ScriptCreated(JSDContext
* jsdc
,
520 const char *filename
, /* URL this script loads from */
521 uintN lineno
, /* line where this script starts */
526 jsd_ScriptDestroyed(JSDContext
* jsdc
,
530 /***************************************************************************/
531 /* Source Text functions */
533 extern JSDSourceText
*
534 jsd_IterateSources(JSDContext
* jsdc
, JSDSourceText
**iterp
);
536 extern JSDSourceText
*
537 jsd_FindSourceForURL(JSDContext
* jsdc
, const char* url
);
540 jsd_GetSourceURL(JSDContext
* jsdc
, JSDSourceText
* jsdsrc
);
543 jsd_GetSourceText(JSDContext
* jsdc
, JSDSourceText
* jsdsrc
,
544 const char** ppBuf
, intN
* pLen
);
547 jsd_ClearSourceText(JSDContext
* jsdc
, JSDSourceText
* jsdsrc
);
549 extern JSDSourceStatus
550 jsd_GetSourceStatus(JSDContext
* jsdc
, JSDSourceText
* jsdsrc
);
553 jsd_IsSourceDirty(JSDContext
* jsdc
, JSDSourceText
* jsdsrc
);
556 jsd_SetSourceDirty(JSDContext
* jsdc
, JSDSourceText
* jsdsrc
, JSBool dirty
);
559 jsd_GetSourceAlterCount(JSDContext
* jsdc
, JSDSourceText
* jsdsrc
);
562 jsd_IncrementSourceAlterCount(JSDContext
* jsdc
, JSDSourceText
* jsdsrc
);
564 extern JSDSourceText
*
565 jsd_NewSourceText(JSDContext
* jsdc
, const char* url
);
567 extern JSDSourceText
*
568 jsd_AppendSourceText(JSDContext
* jsdc
,
569 JSDSourceText
* jsdsrc
,
570 const char* text
, /* *not* zero terminated */
572 JSDSourceStatus status
);
574 extern JSDSourceText
*
575 jsd_AppendUCSourceText(JSDContext
* jsdc
,
576 JSDSourceText
* jsdsrc
,
577 const jschar
* text
, /* *not* zero terminated */
579 JSDSourceStatus status
);
581 /* convienence function for adding complete source of url in one call */
583 jsd_AddFullSourceText(JSDContext
* jsdc
,
584 const char* text
, /* *not* zero terminated */
589 jsd_DestroyAllSources(JSDContext
* jsdc
);
592 jsd_BuildNormalizedURL(const char* url_string
);
595 jsd_StartingEvalUsingFilename(JSDContext
* jsdc
, const char* url
);
598 jsd_FinishedEvalUsingFilename(JSDContext
* jsdc
, const char* url
);
600 /***************************************************************************/
601 /* Interrupt Hook functions */
604 jsd_SetInterruptHook(JSDContext
* jsdc
,
605 JSD_ExecutionHookProc hook
,
609 jsd_ClearInterruptHook(JSDContext
* jsdc
);
612 jsd_SetDebugBreakHook(JSDContext
* jsdc
,
613 JSD_ExecutionHookProc hook
,
617 jsd_ClearDebugBreakHook(JSDContext
* jsdc
);
620 jsd_SetDebuggerHook(JSDContext
* jsdc
,
621 JSD_ExecutionHookProc hook
,
625 jsd_ClearDebuggerHook(JSDContext
* jsdc
);
628 jsd_CallExecutionHook(JSDContext
* jsdc
,
631 JSD_ExecutionHookProc hook
,
636 jsd_CallCallHook (JSDContext
* jsdc
,
639 JSD_CallHookProc hook
,
643 jsd_SetThrowHook(JSDContext
* jsdc
,
644 JSD_ExecutionHookProc hook
,
647 jsd_ClearThrowHook(JSDContext
* jsdc
);
650 jsd_DebuggerHandler(JSContext
*cx
, JSScript
*script
, jsbytecode
*pc
,
651 jsval
*rval
, void *closure
);
654 jsd_ThrowHandler(JSContext
*cx
, JSScript
*script
, jsbytecode
*pc
,
655 jsval
*rval
, void *closure
);
658 jsd_SetFunctionHook(JSDContext
* jsdc
,
659 JSD_CallHookProc hook
,
663 jsd_ClearFunctionHook(JSDContext
* jsdc
);
666 jsd_SetTopLevelHook(JSDContext
* jsdc
,
667 JSD_CallHookProc hook
,
671 jsd_ClearTopLevelHook(JSDContext
* jsdc
);
673 /***************************************************************************/
674 /* Stack Frame functions */
677 jsd_GetCountOfStackFrames(JSDContext
* jsdc
, JSDThreadState
* jsdthreadstate
);
679 extern JSDStackFrameInfo
*
680 jsd_GetStackFrame(JSDContext
* jsdc
, JSDThreadState
* jsdthreadstate
);
683 jsd_GetJSContext(JSDContext
* jsdc
, JSDThreadState
* jsdthreadstate
);
685 extern JSDStackFrameInfo
*
686 jsd_GetCallingStackFrame(JSDContext
* jsdc
,
687 JSDThreadState
* jsdthreadstate
,
688 JSDStackFrameInfo
* jsdframe
);
691 jsd_GetScriptForStackFrame(JSDContext
* jsdc
,
692 JSDThreadState
* jsdthreadstate
,
693 JSDStackFrameInfo
* jsdframe
);
696 jsd_GetPCForStackFrame(JSDContext
* jsdc
,
697 JSDThreadState
* jsdthreadstate
,
698 JSDStackFrameInfo
* jsdframe
);
701 jsd_GetCallObjectForStackFrame(JSDContext
* jsdc
,
702 JSDThreadState
* jsdthreadstate
,
703 JSDStackFrameInfo
* jsdframe
);
706 jsd_GetScopeChainForStackFrame(JSDContext
* jsdc
,
707 JSDThreadState
* jsdthreadstate
,
708 JSDStackFrameInfo
* jsdframe
);
711 jsd_IsStackFrameNative(JSDContext
* jsdc
,
712 JSDThreadState
* jsdthreadstate
,
713 JSDStackFrameInfo
* jsdframe
);
716 jsd_IsStackFrameDebugger(JSDContext
* jsdc
,
717 JSDThreadState
* jsdthreadstate
,
718 JSDStackFrameInfo
* jsdframe
);
721 jsd_IsStackFrameConstructing(JSDContext
* jsdc
,
722 JSDThreadState
* jsdthreadstate
,
723 JSDStackFrameInfo
* jsdframe
);
726 jsd_GetThisForStackFrame(JSDContext
* jsdc
,
727 JSDThreadState
* jsdthreadstate
,
728 JSDStackFrameInfo
* jsdframe
);
731 jsd_GetNameForStackFrame(JSDContext
* jsdc
,
732 JSDThreadState
* jsdthreadstate
,
733 JSDStackFrameInfo
* jsdframe
);
735 extern JSDThreadState
*
736 jsd_NewThreadState(JSDContext
* jsdc
, JSContext
*cx
);
739 jsd_DestroyThreadState(JSDContext
* jsdc
, JSDThreadState
* jsdthreadstate
);
742 jsd_EvaluateUCScriptInStackFrame(JSDContext
* jsdc
,
743 JSDThreadState
* jsdthreadstate
,
744 JSDStackFrameInfo
* jsdframe
,
745 const jschar
*bytes
, uintN length
,
746 const char *filename
, uintN lineno
,
747 JSBool eatExceptions
, jsval
*rval
);
750 jsd_EvaluateScriptInStackFrame(JSDContext
* jsdc
,
751 JSDThreadState
* jsdthreadstate
,
752 JSDStackFrameInfo
* jsdframe
,
753 const char *bytes
, uintN length
,
754 const char *filename
, uintN lineno
,
755 JSBool eatExceptions
, jsval
*rval
);
758 jsd_ValToStringInStackFrame(JSDContext
* jsdc
,
759 JSDThreadState
* jsdthreadstate
,
760 JSDStackFrameInfo
* jsdframe
,
764 jsd_IsValidThreadState(JSDContext
* jsdc
,
765 JSDThreadState
* jsdthreadstate
);
768 jsd_IsValidFrameInThreadState(JSDContext
* jsdc
,
769 JSDThreadState
* jsdthreadstate
,
770 JSDStackFrameInfo
* jsdframe
);
773 jsd_GetException(JSDContext
* jsdc
, JSDThreadState
* jsdthreadstate
);
776 jsd_SetException(JSDContext
* jsdc
, JSDThreadState
* jsdthreadstate
,
779 /***************************************************************************/
780 /* Locking support */
782 /* protos are in js_lock.h for:
790 #ifdef JSD_THREADSAFE
792 /* the system-wide lock */
793 extern void* _jsd_global_lock
;
796 if(!_jsd_global_lock) \
797 _jsd_global_lock = jsd_CreateLock(); \
798 JS_ASSERT(_jsd_global_lock); \
799 jsd_Lock(_jsd_global_lock); \
802 #define JSD_UNLOCK() \
804 JS_ASSERT(_jsd_global_lock); \
805 jsd_Unlock(_jsd_global_lock); \
808 /* locks for the subsystems of a given context */
809 #define JSD_INIT_LOCKS(jsdc) \
810 ( (NULL != (jsdc->scriptsLock = jsd_CreateLock())) && \
811 (NULL != (jsdc->sourceTextLock = jsd_CreateLock())) && \
812 (NULL != (jsdc->atomsLock = jsd_CreateLock())) && \
813 (NULL != (jsdc->objectsLock = jsd_CreateLock())) && \
814 (NULL != (jsdc->threadStatesLock = jsd_CreateLock())) )
816 #define JSD_LOCK_SCRIPTS(jsdc) jsd_Lock(jsdc->scriptsLock)
817 #define JSD_UNLOCK_SCRIPTS(jsdc) jsd_Unlock(jsdc->scriptsLock)
819 #define JSD_LOCK_SOURCE_TEXT(jsdc) jsd_Lock(jsdc->sourceTextLock)
820 #define JSD_UNLOCK_SOURCE_TEXT(jsdc) jsd_Unlock(jsdc->sourceTextLock)
822 #define JSD_LOCK_ATOMS(jsdc) jsd_Lock(jsdc->atomsLock)
823 #define JSD_UNLOCK_ATOMS(jsdc) jsd_Unlock(jsdc->atomsLock)
825 #define JSD_LOCK_OBJECTS(jsdc) jsd_Lock(jsdc->objectsLock)
826 #define JSD_UNLOCK_OBJECTS(jsdc) jsd_Unlock(jsdc->objectsLock)
828 #define JSD_LOCK_THREADSTATES(jsdc) jsd_Lock(jsdc->threadStatesLock)
829 #define JSD_UNLOCK_THREADSTATES(jsdc) jsd_Unlock(jsdc->threadStatesLock)
831 #else /* !JSD_THREADSAFE */
833 #define JSD_LOCK() ((void)0)
834 #define JSD_UNLOCK() ((void)0)
836 #define JSD_INIT_LOCKS(jsdc) 1
838 #define JSD_LOCK_SCRIPTS(jsdc) ((void)0)
839 #define JSD_UNLOCK_SCRIPTS(jsdc) ((void)0)
841 #define JSD_LOCK_SOURCE_TEXT(jsdc) ((void)0)
842 #define JSD_UNLOCK_SOURCE_TEXT(jsdc) ((void)0)
844 #define JSD_LOCK_ATOMS(jsdc) ((void)0)
845 #define JSD_UNLOCK_ATOMS(jsdc) ((void)0)
847 #define JSD_LOCK_OBJECTS(jsdc) ((void)0)
848 #define JSD_UNLOCK_OBJECTS(jsdc) ((void)0)
850 #define JSD_LOCK_THREADSTATES(jsdc) ((void)0)
851 #define JSD_UNLOCK_THREADSTATES(jsdc) ((void)0)
853 #endif /* JSD_THREADSAFE */
855 /* NOTE: These are intended for ASSERTs. Thus we supply checks for both
856 * LOCKED and UNLOCKED (rather that just LOCKED and !LOCKED) so that in
857 * the DEBUG non-Threadsafe case we can have an ASSERT that always succeeds
858 * without having to special case things in the code.
860 #if defined(JSD_THREADSAFE) && defined(DEBUG)
861 #define JSD_SCRIPTS_LOCKED(jsdc) (jsd_IsLocked(jsdc->scriptsLock))
862 #define JSD_SOURCE_TEXT_LOCKED(jsdc) (jsd_IsLocked(jsdc->sourceTextLock))
863 #define JSD_ATOMS_LOCKED(jsdc) (jsd_IsLocked(jsdc->atomsLock))
864 #define JSD_OBJECTS_LOCKED(jsdc) (jsd_IsLocked(jsdc->objectsLock))
865 #define JSD_THREADSTATES_LOCKED(jsdc) (jsd_IsLocked(jsdc->threadStatesLock))
866 #define JSD_SCRIPTS_UNLOCKED(jsdc) (!jsd_IsLocked(jsdc->scriptsLock))
867 #define JSD_SOURCE_TEXT_UNLOCKED(jsdc) (!jsd_IsLocked(jsdc->sourceTextLock))
868 #define JSD_ATOMS_UNLOCKED(jsdc) (!jsd_IsLocked(jsdc->atomsLock))
869 #define JSD_OBJECTS_UNLOCKED(jsdc) (!jsd_IsLocked(jsdc->objectsLock))
870 #define JSD_THREADSTATES_UNLOCKED(jsdc) (!jsd_IsLocked(jsdc->threadStatesLock))
872 #define JSD_SCRIPTS_LOCKED(jsdc) 1
873 #define JSD_SOURCE_TEXT_LOCKED(jsdc) 1
874 #define JSD_ATOMS_LOCKED(jsdc) 1
875 #define JSD_OBJECTS_LOCKED(jsdc) 1
876 #define JSD_THREADSTATES_LOCKED(jsdc) 1
877 #define JSD_SCRIPTS_UNLOCKED(jsdc) 1
878 #define JSD_SOURCE_TEXT_UNLOCKED(jsdc) 1
879 #define JSD_ATOMS_UNLOCKED(jsdc) 1
880 #define JSD_OBJECTS_UNLOCKED(jsdc) 1
881 #define JSD_THREADSTATES_UNLOCKED(jsdc) 1
882 #endif /* defined(JSD_THREADSAFE) && defined(DEBUG) */
884 /***************************************************************************/
885 /* Threading support */
887 #ifdef JSD_THREADSAFE
889 #define JSD_CURRENT_THREAD() jsd_CurrentThread()
891 #else /* !JSD_THREADSAFE */
893 #define JSD_CURRENT_THREAD() ((void*)0)
895 #endif /* JSD_THREADSAFE */
897 /***************************************************************************/
898 /* Dangerous thread support */
900 #ifdef JSD_HAS_DANGEROUS_THREAD
902 #define JSD_IS_DANGEROUS_THREAD(jsdc) \
903 (JSD_CURRENT_THREAD() == jsdc->dangerousThread)
905 #else /* !JSD_HAS_DANGEROUS_THREAD */
907 #define JSD_IS_DANGEROUS_THREAD(jsdc) 0
909 #endif /* JSD_HAS_DANGEROUS_THREAD */
911 /***************************************************************************/
912 /* Value and Property Functions */
915 jsd_NewValue(JSDContext
* jsdc
, jsval val
);
918 jsd_DropValue(JSDContext
* jsdc
, JSDValue
* jsdval
);
921 jsd_GetValueWrappedJSVal(JSDContext
* jsdc
, JSDValue
* jsdval
);
924 jsd_RefreshValue(JSDContext
* jsdc
, JSDValue
* jsdval
);
926 /**************************************************/
929 jsd_IsValueObject(JSDContext
* jsdc
, JSDValue
* jsdval
);
932 jsd_IsValueNumber(JSDContext
* jsdc
, JSDValue
* jsdval
);
935 jsd_IsValueInt(JSDContext
* jsdc
, JSDValue
* jsdval
);
938 jsd_IsValueDouble(JSDContext
* jsdc
, JSDValue
* jsdval
);
941 jsd_IsValueString(JSDContext
* jsdc
, JSDValue
* jsdval
);
944 jsd_IsValueBoolean(JSDContext
* jsdc
, JSDValue
* jsdval
);
947 jsd_IsValueNull(JSDContext
* jsdc
, JSDValue
* jsdval
);
950 jsd_IsValueVoid(JSDContext
* jsdc
, JSDValue
* jsdval
);
953 jsd_IsValuePrimitive(JSDContext
* jsdc
, JSDValue
* jsdval
);
956 jsd_IsValueFunction(JSDContext
* jsdc
, JSDValue
* jsdval
);
959 jsd_IsValueNative(JSDContext
* jsdc
, JSDValue
* jsdval
);
961 /**************************************************/
964 jsd_GetValueBoolean(JSDContext
* jsdc
, JSDValue
* jsdval
);
967 jsd_GetValueInt(JSDContext
* jsdc
, JSDValue
* jsdval
);
970 jsd_GetValueDouble(JSDContext
* jsdc
, JSDValue
* jsdval
);
973 jsd_GetValueString(JSDContext
* jsdc
, JSDValue
* jsdval
);
976 jsd_GetValueFunctionName(JSDContext
* jsdc
, JSDValue
* jsdval
);
978 /**************************************************/
981 jsd_GetCountOfProperties(JSDContext
* jsdc
, JSDValue
* jsdval
);
984 jsd_IterateProperties(JSDContext
* jsdc
, JSDValue
* jsdval
, JSDProperty
**iterp
);
987 jsd_GetValueProperty(JSDContext
* jsdc
, JSDValue
* jsdval
, JSString
* name
);
990 jsd_GetValuePrototype(JSDContext
* jsdc
, JSDValue
* jsdval
);
993 jsd_GetValueParent(JSDContext
* jsdc
, JSDValue
* jsdval
);
996 jsd_GetValueConstructor(JSDContext
* jsdc
, JSDValue
* jsdval
);
999 jsd_GetValueClassName(JSDContext
* jsdc
, JSDValue
* jsdval
);
1002 jsd_GetScriptForValue(JSDContext
* jsdc
, JSDValue
* jsdval
);
1004 /**************************************************/
1007 jsd_DropProperty(JSDContext
* jsdc
, JSDProperty
* jsdprop
);
1010 jsd_GetPropertyName(JSDContext
* jsdc
, JSDProperty
* jsdprop
);
1013 jsd_GetPropertyValue(JSDContext
* jsdc
, JSDProperty
* jsdprop
);
1016 jsd_GetPropertyAlias(JSDContext
* jsdc
, JSDProperty
* jsdprop
);
1019 jsd_GetPropertyFlags(JSDContext
* jsdc
, JSDProperty
* jsdprop
);
1022 jsd_GetPropertyVarArgSlot(JSDContext
* jsdc
, JSDProperty
* jsdprop
);
1024 /**************************************************/
1025 /* Stepping Functions */
1028 jsd_FunctionCallHook(JSContext
*cx
, JSStackFrame
*fp
, JSBool before
,
1029 JSBool
*ok
, void *closure
);
1032 jsd_TopLevelCallHook(JSContext
*cx
, JSStackFrame
*fp
, JSBool before
,
1033 JSBool
*ok
, void *closure
);
1035 /**************************************************/
1036 /* Object Functions */
1039 jsd_InitObjectManager(JSDContext
* jsdc
);
1042 jsd_DestroyObjectManager(JSDContext
* jsdc
);
1045 jsd_DestroyObjects(JSDContext
* jsdc
);
1048 jsd_ObjectHook(JSContext
*cx
, JSObject
*obj
, JSBool isNew
, void *closure
);
1051 jsd_Constructing(JSDContext
* jsdc
, JSContext
*cx
, JSObject
*obj
,
1055 jsd_IterateObjects(JSDContext
* jsdc
, JSDObject
** iterp
);
1058 jsd_GetWrappedObject(JSDContext
* jsdc
, JSDObject
* jsdobj
);
1061 jsd_GetObjectNewURL(JSDContext
* jsdc
, JSDObject
* jsdobj
);
1064 jsd_GetObjectNewLineNumber(JSDContext
* jsdc
, JSDObject
* jsdobj
);
1067 jsd_GetObjectConstructorURL(JSDContext
* jsdc
, JSDObject
* jsdobj
);
1070 jsd_GetObjectConstructorLineNumber(JSDContext
* jsdc
, JSDObject
* jsdobj
);
1073 jsd_GetObjectConstructorName(JSDContext
* jsdc
, JSDObject
* jsdobj
);
1076 jsd_GetJSDObjectForJSObject(JSDContext
* jsdc
, JSObject
* jsobj
);
1079 jsd_GetObjectForValue(JSDContext
* jsdc
, JSDValue
* jsdval
);
1082 * returns new refcounted JSDValue
1085 jsd_GetValueForObject(JSDContext
* jsdc
, JSDObject
* jsdobj
);
1087 /**************************************************/
1088 /* Atom Functions */
1091 jsd_CreateAtomTable(JSDContext
* jsdc
);
1094 jsd_DestroyAtomTable(JSDContext
* jsdc
);
1097 jsd_AddAtom(JSDContext
* jsdc
, const char* str
);
1100 jsd_CloneAtom(JSDContext
* jsdc
, JSDAtom
* atom
);
1103 jsd_DropAtom(JSDContext
* jsdc
, JSDAtom
* atom
);
1105 #define JSD_ATOM_TO_STRING(a) ((const char*)((a)->str))
1107 /***************************************************************************/
1108 /* Livewire specific API */
1112 jsdlw_GetLWScript(JSDContext
* jsdc
, JSDScript
* jsdscript
);
1115 jsdlw_BuildAppRelativeFilename(LWDBGApp
* app
, const char* filename
);
1117 extern JSDSourceText
*
1118 jsdlw_PreLoadSource(JSDContext
* jsdc
, LWDBGApp
* app
,
1119 const char* filename
, JSBool clear
);
1121 extern JSDSourceText
*
1122 jsdlw_ForceLoadSource(JSDContext
* jsdc
, JSDSourceText
* jsdsrc
);
1125 jsdlw_UserCodeAtPC(JSDContext
* jsdc
, JSDScript
* jsdscript
, jsuword pc
);
1128 jsdlw_RawToProcessedLineNumber(JSDContext
* jsdc
, JSDScript
* jsdscript
,
1129 uintN lineIn
, uintN
* lineOut
);
1132 jsdlw_ProcessedToRawLineNumber(JSDContext
* jsdc
, JSDScript
* jsdscript
,
1133 uintN lineIn
, uintN
* lineOut
);
1137 /* our hook proc for LiveWire app start/stop */
1139 jsdlw_AppHookProc(LWDBGApp
* app
,
1146 /***************************************************************************/
1150 #endif /* jsd_h___ */