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,
347 jsd_DebuggerOn(void);
350 jsd_DebuggerOff(JSDContext* jsdc);
353 jsd_DebuggerPause(JSDContext* jsdc, JSBool forceAllHooksOff);
356 jsd_DebuggerUnpause(JSDContext* jsdc);
359 jsd_SetUserCallbacks(JSRuntime* jsrt, JSD_UserCallbacks* callbacks, void* user);
362 jsd_JSDContextForJSContext(JSContext* context);
365 jsd_SetContextPrivate(JSDContext* jsdc, void *data);
368 jsd_GetContextPrivate(JSDContext* jsdc);
371 jsd_ClearAllProfileData(JSDContext* jsdc);
374 jsd_SetErrorReporter(JSDContext* jsdc,
375 JSD_ErrorReporter reporter,
379 jsd_GetErrorReporter(JSDContext* jsdc,
380 JSD_ErrorReporter* reporter,
384 jsd_DebugErrorHook(JSContext *cx, const char *message,
385 JSErrorReport *report, void *closure);
387 /***************************************************************************/
388 /* Script functions */
391 jsd_InitScriptManager(JSDContext *jsdc);
394 jsd_DestroyScriptManager(JSDContext* jsdc);
397 jsd_FindJSDScript(JSDContext* jsdc,
401 jsd_FindOrCreateJSDScript(JSDContext *jsdc,
406 extern JSDProfileData*
407 jsd_GetScriptProfileData(JSDContext* jsdc, JSDScript *script);
410 jsd_GetScriptFlags(JSDContext *jsdc, JSDScript *script);
413 jsd_SetScriptFlags(JSDContext *jsdc, JSDScript *script, uint32 flags);
416 jsd_GetScriptCallCount(JSDContext* jsdc, JSDScript *script);
419 jsd_GetScriptMaxRecurseDepth(JSDContext* jsdc, JSDScript *script);
422 jsd_GetScriptMinExecutionTime(JSDContext* jsdc, JSDScript *script);
425 jsd_GetScriptMaxExecutionTime(JSDContext* jsdc, JSDScript *script);
428 jsd_GetScriptTotalExecutionTime(JSDContext* jsdc, JSDScript *script);
431 jsd_GetScriptMinOwnExecutionTime(JSDContext* jsdc, JSDScript *script);
434 jsd_GetScriptMaxOwnExecutionTime(JSDContext* jsdc, JSDScript *script);
437 jsd_GetScriptTotalOwnExecutionTime(JSDContext* jsdc, JSDScript *script);
440 jsd_ClearScriptProfileData(JSDContext* jsdc, JSDScript *script);
443 jsd_GetJSScript (JSDContext *jsdc, JSDScript *script);
446 jsd_GetJSFunction (JSDContext *jsdc, JSDScript *script);
449 jsd_IterateScripts(JSDContext* jsdc, JSDScript **iterp);
452 jsd_SetScriptPrivate (JSDScript *jsdscript, void *data);
455 jsd_GetScriptPrivate (JSDScript *jsdscript);
458 jsd_IsActiveScript(JSDContext* jsdc, JSDScript *jsdscript);
461 jsd_GetScriptFilename(JSDContext* jsdc, JSDScript *jsdscript);
464 jsd_GetScriptFunctionId(JSDContext* jsdc, JSDScript *jsdscript);
467 jsd_GetScriptBaseLineNumber(JSDContext* jsdc, JSDScript *jsdscript);
470 jsd_GetScriptLineExtent(JSDContext* jsdc, JSDScript *jsdscript);
473 jsd_SetScriptHook(JSDContext* jsdc, JSD_ScriptHookProc hook, void* callerdata);
476 jsd_GetScriptHook(JSDContext* jsdc, JSD_ScriptHookProc* hook, void** callerdata);
479 jsd_GetClosestPC(JSDContext* jsdc, JSDScript* jsdscript, uintN line);
482 jsd_GetClosestLine(JSDContext* jsdc, JSDScript* jsdscript, jsuword pc);
485 jsd_NewScriptHookProc(
487 const char *filename, /* URL this script loads from */
488 uintN lineno, /* line where this script starts */
494 jsd_DestroyScriptHookProc(
499 /* Script execution hook functions */
502 jsd_SetExecutionHook(JSDContext* jsdc,
503 JSDScript* jsdscript,
505 JSD_ExecutionHookProc hook,
509 jsd_ClearExecutionHook(JSDContext* jsdc,
510 JSDScript* jsdscript,
514 jsd_ClearAllExecutionHooksForScript(JSDContext* jsdc, JSDScript* jsdscript);
517 jsd_ClearAllExecutionHooks(JSDContext* jsdc);
520 jsd_ScriptCreated(JSDContext* jsdc,
522 const char *filename, /* URL this script loads from */
523 uintN lineno, /* line where this script starts */
528 jsd_ScriptDestroyed(JSDContext* jsdc,
532 /***************************************************************************/
533 /* Source Text functions */
535 extern JSDSourceText*
536 jsd_IterateSources(JSDContext* jsdc, JSDSourceText **iterp);
538 extern JSDSourceText*
539 jsd_FindSourceForURL(JSDContext* jsdc, const char* url);
542 jsd_GetSourceURL(JSDContext* jsdc, JSDSourceText* jsdsrc);
545 jsd_GetSourceText(JSDContext* jsdc, JSDSourceText* jsdsrc,
546 const char** ppBuf, intN* pLen);
549 jsd_ClearSourceText(JSDContext* jsdc, JSDSourceText* jsdsrc);
551 extern JSDSourceStatus
552 jsd_GetSourceStatus(JSDContext* jsdc, JSDSourceText* jsdsrc);
555 jsd_IsSourceDirty(JSDContext* jsdc, JSDSourceText* jsdsrc);
558 jsd_SetSourceDirty(JSDContext* jsdc, JSDSourceText* jsdsrc, JSBool dirty);
561 jsd_GetSourceAlterCount(JSDContext* jsdc, JSDSourceText* jsdsrc);
564 jsd_IncrementSourceAlterCount(JSDContext* jsdc, JSDSourceText* jsdsrc);
566 extern JSDSourceText*
567 jsd_NewSourceText(JSDContext* jsdc, const char* url);
569 extern JSDSourceText*
570 jsd_AppendSourceText(JSDContext* jsdc,
571 JSDSourceText* jsdsrc,
572 const char* text, /* *not* zero terminated */
574 JSDSourceStatus status);
576 extern JSDSourceText*
577 jsd_AppendUCSourceText(JSDContext* jsdc,
578 JSDSourceText* jsdsrc,
579 const jschar* text, /* *not* zero terminated */
581 JSDSourceStatus status);
583 /* convienence function for adding complete source of url in one call */
585 jsd_AddFullSourceText(JSDContext* jsdc,
586 const char* text, /* *not* zero terminated */
591 jsd_DestroyAllSources(JSDContext* jsdc);
594 jsd_BuildNormalizedURL(const char* url_string);
597 jsd_StartingEvalUsingFilename(JSDContext* jsdc, const char* url);
600 jsd_FinishedEvalUsingFilename(JSDContext* jsdc, const char* url);
602 /***************************************************************************/
603 /* Interrupt Hook functions */
606 jsd_SetInterruptHook(JSDContext* jsdc,
607 JSD_ExecutionHookProc hook,
611 jsd_ClearInterruptHook(JSDContext* jsdc);
614 jsd_EnableSingleStepInterrupts(JSDContext* jsdc,
615 JSDScript* jsdscript,
619 jsd_SetDebugBreakHook(JSDContext* jsdc,
620 JSD_ExecutionHookProc hook,
624 jsd_ClearDebugBreakHook(JSDContext* jsdc);
627 jsd_SetDebuggerHook(JSDContext* jsdc,
628 JSD_ExecutionHookProc hook,
632 jsd_ClearDebuggerHook(JSDContext* jsdc);
635 jsd_CallExecutionHook(JSDContext* jsdc,
638 JSD_ExecutionHookProc hook,
643 jsd_CallCallHook (JSDContext* jsdc,
646 JSD_CallHookProc hook,
650 jsd_SetThrowHook(JSDContext* jsdc,
651 JSD_ExecutionHookProc hook,
654 jsd_ClearThrowHook(JSDContext* jsdc);
657 jsd_DebuggerHandler(JSContext *cx, JSScript *script, jsbytecode *pc,
658 jsval *rval, void *closure);
661 jsd_ThrowHandler(JSContext *cx, JSScript *script, jsbytecode *pc,
662 jsval *rval, void *closure);
665 jsd_SetFunctionHook(JSDContext* jsdc,
666 JSD_CallHookProc hook,
670 jsd_ClearFunctionHook(JSDContext* jsdc);
673 jsd_SetTopLevelHook(JSDContext* jsdc,
674 JSD_CallHookProc hook,
678 jsd_ClearTopLevelHook(JSDContext* jsdc);
680 /***************************************************************************/
681 /* Stack Frame functions */
684 jsd_GetCountOfStackFrames(JSDContext* jsdc, JSDThreadState* jsdthreadstate);
686 extern JSDStackFrameInfo*
687 jsd_GetStackFrame(JSDContext* jsdc, JSDThreadState* jsdthreadstate);
690 jsd_GetJSContext(JSDContext* jsdc, JSDThreadState* jsdthreadstate);
692 extern JSDStackFrameInfo*
693 jsd_GetCallingStackFrame(JSDContext* jsdc,
694 JSDThreadState* jsdthreadstate,
695 JSDStackFrameInfo* jsdframe);
698 jsd_GetScriptForStackFrame(JSDContext* jsdc,
699 JSDThreadState* jsdthreadstate,
700 JSDStackFrameInfo* jsdframe);
703 jsd_GetPCForStackFrame(JSDContext* jsdc,
704 JSDThreadState* jsdthreadstate,
705 JSDStackFrameInfo* jsdframe);
708 jsd_GetCallObjectForStackFrame(JSDContext* jsdc,
709 JSDThreadState* jsdthreadstate,
710 JSDStackFrameInfo* jsdframe);
713 jsd_GetScopeChainForStackFrame(JSDContext* jsdc,
714 JSDThreadState* jsdthreadstate,
715 JSDStackFrameInfo* jsdframe);
718 jsd_IsStackFrameDebugger(JSDContext* jsdc,
719 JSDThreadState* jsdthreadstate,
720 JSDStackFrameInfo* jsdframe);
723 jsd_IsStackFrameConstructing(JSDContext* jsdc,
724 JSDThreadState* jsdthreadstate,
725 JSDStackFrameInfo* jsdframe);
728 jsd_GetThisForStackFrame(JSDContext* jsdc,
729 JSDThreadState* jsdthreadstate,
730 JSDStackFrameInfo* jsdframe);
733 jsd_GetIdForStackFrame(JSDContext* jsdc,
734 JSDThreadState* jsdthreadstate,
735 JSDStackFrameInfo* jsdframe);
737 extern JSDThreadState*
738 jsd_NewThreadState(JSDContext* jsdc, JSContext *cx);
741 jsd_DestroyThreadState(JSDContext* jsdc, JSDThreadState* jsdthreadstate);
744 jsd_EvaluateUCScriptInStackFrame(JSDContext* jsdc,
745 JSDThreadState* jsdthreadstate,
746 JSDStackFrameInfo* jsdframe,
747 const jschar *bytes, uintN length,
748 const char *filename, uintN lineno,
749 JSBool eatExceptions, jsval *rval);
752 jsd_EvaluateScriptInStackFrame(JSDContext* jsdc,
753 JSDThreadState* jsdthreadstate,
754 JSDStackFrameInfo* jsdframe,
755 const char *bytes, uintN length,
756 const char *filename, uintN lineno,
757 JSBool eatExceptions, jsval *rval);
760 jsd_ValToStringInStackFrame(JSDContext* jsdc,
761 JSDThreadState* jsdthreadstate,
762 JSDStackFrameInfo* jsdframe,
766 jsd_IsValidThreadState(JSDContext* jsdc,
767 JSDThreadState* jsdthreadstate);
770 jsd_IsValidFrameInThreadState(JSDContext* jsdc,
771 JSDThreadState* jsdthreadstate,
772 JSDStackFrameInfo* jsdframe);
775 jsd_GetException(JSDContext* jsdc, JSDThreadState* jsdthreadstate);
778 jsd_SetException(JSDContext* jsdc, JSDThreadState* jsdthreadstate,
781 /***************************************************************************/
782 /* Locking support */
784 /* protos are in js_lock.h for:
792 #ifdef JSD_THREADSAFE
794 /* the system-wide lock */
795 extern void* _jsd_global_lock;
798 if(!_jsd_global_lock) \
799 _jsd_global_lock = jsd_CreateLock(); \
800 JS_ASSERT(_jsd_global_lock); \
801 jsd_Lock(_jsd_global_lock); \
804 #define JSD_UNLOCK() \
806 JS_ASSERT(_jsd_global_lock); \
807 jsd_Unlock(_jsd_global_lock); \
810 /* locks for the subsystems of a given context */
811 #define JSD_INIT_LOCKS(jsdc) \
812 ( (NULL != (jsdc->scriptsLock = jsd_CreateLock())) && \
813 (NULL != (jsdc->sourceTextLock = jsd_CreateLock())) && \
814 (NULL != (jsdc->atomsLock = jsd_CreateLock())) && \
815 (NULL != (jsdc->objectsLock = jsd_CreateLock())) && \
816 (NULL != (jsdc->threadStatesLock = jsd_CreateLock())) )
818 #define JSD_LOCK_SCRIPTS(jsdc) jsd_Lock(jsdc->scriptsLock)
819 #define JSD_UNLOCK_SCRIPTS(jsdc) jsd_Unlock(jsdc->scriptsLock)
821 #define JSD_LOCK_SOURCE_TEXT(jsdc) jsd_Lock(jsdc->sourceTextLock)
822 #define JSD_UNLOCK_SOURCE_TEXT(jsdc) jsd_Unlock(jsdc->sourceTextLock)
824 #define JSD_LOCK_ATOMS(jsdc) jsd_Lock(jsdc->atomsLock)
825 #define JSD_UNLOCK_ATOMS(jsdc) jsd_Unlock(jsdc->atomsLock)
827 #define JSD_LOCK_OBJECTS(jsdc) jsd_Lock(jsdc->objectsLock)
828 #define JSD_UNLOCK_OBJECTS(jsdc) jsd_Unlock(jsdc->objectsLock)
830 #define JSD_LOCK_THREADSTATES(jsdc) jsd_Lock(jsdc->threadStatesLock)
831 #define JSD_UNLOCK_THREADSTATES(jsdc) jsd_Unlock(jsdc->threadStatesLock)
833 #else /* !JSD_THREADSAFE */
835 #define JSD_LOCK() ((void)0)
836 #define JSD_UNLOCK() ((void)0)
838 #define JSD_INIT_LOCKS(jsdc) 1
840 #define JSD_LOCK_SCRIPTS(jsdc) ((void)0)
841 #define JSD_UNLOCK_SCRIPTS(jsdc) ((void)0)
843 #define JSD_LOCK_SOURCE_TEXT(jsdc) ((void)0)
844 #define JSD_UNLOCK_SOURCE_TEXT(jsdc) ((void)0)
846 #define JSD_LOCK_ATOMS(jsdc) ((void)0)
847 #define JSD_UNLOCK_ATOMS(jsdc) ((void)0)
849 #define JSD_LOCK_OBJECTS(jsdc) ((void)0)
850 #define JSD_UNLOCK_OBJECTS(jsdc) ((void)0)
852 #define JSD_LOCK_THREADSTATES(jsdc) ((void)0)
853 #define JSD_UNLOCK_THREADSTATES(jsdc) ((void)0)
855 #endif /* JSD_THREADSAFE */
857 /* NOTE: These are intended for ASSERTs. Thus we supply checks for both
858 * LOCKED and UNLOCKED (rather that just LOCKED and !LOCKED) so that in
859 * the DEBUG non-Threadsafe case we can have an ASSERT that always succeeds
860 * without having to special case things in the code.
862 #if defined(JSD_THREADSAFE) && defined(DEBUG)
863 #define JSD_SCRIPTS_LOCKED(jsdc) (jsd_IsLocked(jsdc->scriptsLock))
864 #define JSD_SOURCE_TEXT_LOCKED(jsdc) (jsd_IsLocked(jsdc->sourceTextLock))
865 #define JSD_ATOMS_LOCKED(jsdc) (jsd_IsLocked(jsdc->atomsLock))
866 #define JSD_OBJECTS_LOCKED(jsdc) (jsd_IsLocked(jsdc->objectsLock))
867 #define JSD_THREADSTATES_LOCKED(jsdc) (jsd_IsLocked(jsdc->threadStatesLock))
868 #define JSD_SCRIPTS_UNLOCKED(jsdc) (!jsd_IsLocked(jsdc->scriptsLock))
869 #define JSD_SOURCE_TEXT_UNLOCKED(jsdc) (!jsd_IsLocked(jsdc->sourceTextLock))
870 #define JSD_ATOMS_UNLOCKED(jsdc) (!jsd_IsLocked(jsdc->atomsLock))
871 #define JSD_OBJECTS_UNLOCKED(jsdc) (!jsd_IsLocked(jsdc->objectsLock))
872 #define JSD_THREADSTATES_UNLOCKED(jsdc) (!jsd_IsLocked(jsdc->threadStatesLock))
874 #define JSD_SCRIPTS_LOCKED(jsdc) 1
875 #define JSD_SOURCE_TEXT_LOCKED(jsdc) 1
876 #define JSD_ATOMS_LOCKED(jsdc) 1
877 #define JSD_OBJECTS_LOCKED(jsdc) 1
878 #define JSD_THREADSTATES_LOCKED(jsdc) 1
879 #define JSD_SCRIPTS_UNLOCKED(jsdc) 1
880 #define JSD_SOURCE_TEXT_UNLOCKED(jsdc) 1
881 #define JSD_ATOMS_UNLOCKED(jsdc) 1
882 #define JSD_OBJECTS_UNLOCKED(jsdc) 1
883 #define JSD_THREADSTATES_UNLOCKED(jsdc) 1
884 #endif /* defined(JSD_THREADSAFE) && defined(DEBUG) */
886 /***************************************************************************/
887 /* Threading support */
889 #ifdef JSD_THREADSAFE
891 #define JSD_CURRENT_THREAD() jsd_CurrentThread()
893 #else /* !JSD_THREADSAFE */
895 #define JSD_CURRENT_THREAD() ((void*)0)
897 #endif /* JSD_THREADSAFE */
899 /***************************************************************************/
900 /* Dangerous thread support */
902 #ifdef JSD_HAS_DANGEROUS_THREAD
904 #define JSD_IS_DANGEROUS_THREAD(jsdc) \
905 (JSD_CURRENT_THREAD() == jsdc->dangerousThread)
907 #else /* !JSD_HAS_DANGEROUS_THREAD */
909 #define JSD_IS_DANGEROUS_THREAD(jsdc) 0
911 #endif /* JSD_HAS_DANGEROUS_THREAD */
913 /***************************************************************************/
914 /* Value and Property Functions */
917 jsd_NewValue(JSDContext* jsdc, jsval val);
920 jsd_DropValue(JSDContext* jsdc, JSDValue* jsdval);
923 jsd_GetValueWrappedJSVal(JSDContext* jsdc, JSDValue* jsdval);
926 jsd_RefreshValue(JSDContext* jsdc, JSDValue* jsdval);
928 /**************************************************/
931 jsd_IsValueObject(JSDContext* jsdc, JSDValue* jsdval);
934 jsd_IsValueNumber(JSDContext* jsdc, JSDValue* jsdval);
937 jsd_IsValueInt(JSDContext* jsdc, JSDValue* jsdval);
940 jsd_IsValueDouble(JSDContext* jsdc, JSDValue* jsdval);
943 jsd_IsValueString(JSDContext* jsdc, JSDValue* jsdval);
946 jsd_IsValueBoolean(JSDContext* jsdc, JSDValue* jsdval);
949 jsd_IsValueNull(JSDContext* jsdc, JSDValue* jsdval);
952 jsd_IsValueVoid(JSDContext* jsdc, JSDValue* jsdval);
955 jsd_IsValuePrimitive(JSDContext* jsdc, JSDValue* jsdval);
958 jsd_IsValueFunction(JSDContext* jsdc, JSDValue* jsdval);
961 jsd_IsValueNative(JSDContext* jsdc, JSDValue* jsdval);
963 /**************************************************/
966 jsd_GetValueBoolean(JSDContext* jsdc, JSDValue* jsdval);
969 jsd_GetValueInt(JSDContext* jsdc, JSDValue* jsdval);
972 jsd_GetValueDouble(JSDContext* jsdc, JSDValue* jsdval);
975 jsd_GetValueString(JSDContext* jsdc, JSDValue* jsdval);
978 jsd_GetValueFunctionId(JSDContext* jsdc, JSDValue* jsdval);
981 jsd_GetValueFunction(JSDContext* jsdc, JSDValue* jsdval);
983 /**************************************************/
986 jsd_GetCountOfProperties(JSDContext* jsdc, JSDValue* jsdval);
989 jsd_IterateProperties(JSDContext* jsdc, JSDValue* jsdval, JSDProperty **iterp);
992 jsd_GetValueProperty(JSDContext* jsdc, JSDValue* jsdval, JSString* name);
995 jsd_GetValuePrototype(JSDContext* jsdc, JSDValue* jsdval);
998 jsd_GetValueParent(JSDContext* jsdc, JSDValue* jsdval);
1001 jsd_GetValueConstructor(JSDContext* jsdc, JSDValue* jsdval);
1004 jsd_GetValueClassName(JSDContext* jsdc, JSDValue* jsdval);
1007 jsd_GetScriptForValue(JSDContext* jsdc, JSDValue* jsdval);
1009 /**************************************************/
1012 jsd_DropProperty(JSDContext* jsdc, JSDProperty* jsdprop);
1015 jsd_GetPropertyName(JSDContext* jsdc, JSDProperty* jsdprop);
1018 jsd_GetPropertyValue(JSDContext* jsdc, JSDProperty* jsdprop);
1021 jsd_GetPropertyAlias(JSDContext* jsdc, JSDProperty* jsdprop);
1024 jsd_GetPropertyFlags(JSDContext* jsdc, JSDProperty* jsdprop);
1027 jsd_GetPropertyVarArgSlot(JSDContext* jsdc, JSDProperty* jsdprop);
1029 /**************************************************/
1030 /* Stepping Functions */
1033 jsd_FunctionCallHook(JSContext *cx, JSStackFrame *fp, JSBool before,
1034 JSBool *ok, void *closure);
1037 jsd_TopLevelCallHook(JSContext *cx, JSStackFrame *fp, JSBool before,
1038 JSBool *ok, void *closure);
1040 /**************************************************/
1041 /* Object Functions */
1044 jsd_InitObjectManager(JSDContext* jsdc);
1047 jsd_DestroyObjectManager(JSDContext* jsdc);
1050 jsd_DestroyObjects(JSDContext* jsdc);
1053 jsd_Constructing(JSDContext* jsdc, JSContext *cx, JSObject *obj,
1057 jsd_IterateObjects(JSDContext* jsdc, JSDObject** iterp);
1060 jsd_GetWrappedObject(JSDContext* jsdc, JSDObject* jsdobj);
1063 jsd_GetObjectNewURL(JSDContext* jsdc, JSDObject* jsdobj);
1066 jsd_GetObjectNewLineNumber(JSDContext* jsdc, JSDObject* jsdobj);
1069 jsd_GetObjectConstructorURL(JSDContext* jsdc, JSDObject* jsdobj);
1072 jsd_GetObjectConstructorLineNumber(JSDContext* jsdc, JSDObject* jsdobj);
1075 jsd_GetObjectConstructorName(JSDContext* jsdc, JSDObject* jsdobj);
1078 jsd_GetJSDObjectForJSObject(JSDContext* jsdc, JSObject* jsobj);
1081 jsd_GetObjectForValue(JSDContext* jsdc, JSDValue* jsdval);
1084 * returns new refcounted JSDValue
1087 jsd_GetValueForObject(JSDContext* jsdc, JSDObject* jsdobj);
1089 /**************************************************/
1090 /* Atom Functions */
1093 jsd_CreateAtomTable(JSDContext* jsdc);
1096 jsd_DestroyAtomTable(JSDContext* jsdc);
1099 jsd_AddAtom(JSDContext* jsdc, const char* str);
1102 jsd_CloneAtom(JSDContext* jsdc, JSDAtom* atom);
1105 jsd_DropAtom(JSDContext* jsdc, JSDAtom* atom);
1107 #define JSD_ATOM_TO_STRING(a) ((const char*)((a)->str))
1109 /***************************************************************************/
1110 /* Livewire specific API */
1114 jsdlw_GetLWScript(JSDContext* jsdc, JSDScript* jsdscript);
1117 jsdlw_BuildAppRelativeFilename(LWDBGApp* app, const char* filename);
1119 extern JSDSourceText*
1120 jsdlw_PreLoadSource(JSDContext* jsdc, LWDBGApp* app,
1121 const char* filename, JSBool clear);
1123 extern JSDSourceText*
1124 jsdlw_ForceLoadSource(JSDContext* jsdc, JSDSourceText* jsdsrc);
1127 jsdlw_UserCodeAtPC(JSDContext* jsdc, JSDScript* jsdscript, jsuword pc);
1130 jsdlw_RawToProcessedLineNumber(JSDContext* jsdc, JSDScript* jsdscript,
1131 uintN lineIn, uintN* lineOut);
1134 jsdlw_ProcessedToRawLineNumber(JSDContext* jsdc, JSDScript* jsdscript,
1135 uintN lineIn, uintN* lineOut);
1139 /* our hook proc for LiveWire app start/stop */
1141 jsdlw_AppHookProc(LWDBGApp* app,
1148 /***************************************************************************/
1152 #endif /* jsd_h___ */