forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			810 lines
		
	
	
	
		
			26 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			810 lines
		
	
	
	
		
			26 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | |
| /* ***** BEGIN LICENSE BLOCK *****
 | |
|  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 | |
|  *
 | |
|  * The contents of this file are subject to the Mozilla Public License Version
 | |
|  * 1.1 (the "License"); you may not use this file except in compliance with
 | |
|  * the License. You may obtain a copy of the License at
 | |
|  * http://www.mozilla.org/MPL/
 | |
|  *
 | |
|  * Software distributed under the License is distributed on an "AS IS" basis,
 | |
|  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 | |
|  * for the specific language governing rights and limitations under the
 | |
|  * License.
 | |
|  *
 | |
|  * The Original Code is mozilla.org code.
 | |
|  *
 | |
|  * The Initial Developer of the Original Code is
 | |
|  * Netscape Communications Corporation.
 | |
|  * Portions created by the Initial Developer are Copyright (C) 1998
 | |
|  * the Initial Developer. All Rights Reserved.
 | |
|  *
 | |
|  * Contributor(s):
 | |
|  *
 | |
|  * Alternatively, the contents of this file may be used under the terms of
 | |
|  * either the GNU General Public License Version 2 or later (the "GPL"), or
 | |
|  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 | |
|  * in which case the provisions of the GPL or the LGPL are applicable instead
 | |
|  * of those above. If you wish to allow use of your version of this file only
 | |
|  * under the terms of either the GPL or the LGPL, and not to allow others to
 | |
|  * use your version of this file under the terms of the MPL, indicate your
 | |
|  * decision by deleting the provisions above and replace them with the notice
 | |
|  * and other provisions required by the GPL or the LGPL. If you do not delete
 | |
|  * the provisions above, a recipient may use your version of this file under
 | |
|  * the terms of any one of the MPL, the GPL or the LGPL.
 | |
|  *
 | |
|  * ***** END LICENSE BLOCK ***** */
 | |
| 
 | |
| /* this is all going away... replaced by code in js/jsd/java */
 | |
| 
 | |
| #if 0
 | |
| 
 | |
| #include "native.h"
 | |
| #include "jsdebug.h"
 | |
| 
 | |
| #include "_gen/netscape_jsdebug_DebugController.h"
 | |
| #include "_gen/netscape_jsdebug_Script.h"
 | |
| #include "_gen/netscape_jsdebug_JSThreadState.h"
 | |
| #include "_gen/netscape_jsdebug_JSStackFrameInfo.h"
 | |
| #include "_gen/netscape_jsdebug_JSPC.h"
 | |
| #include "_gen/netscape_jsdebug_JSSourceTextProvider.h"
 | |
| #include "_gen/netscape_jsdebug_JSErrorReporter.h"
 | |
| 
 | |
| static JSDContext* context = 0;
 | |
| static struct Hnetscape_jsdebug_DebugController* controller = 0;
 | |
| 
 | |
| /***************************************************************************/
 | |
| /* helpers */
 | |
| 
 | |
| static JHandle*
 | |
| _constructInteger(ExecEnv *ee, long i)
 | |
| {
 | |
|     return (JHandle*) 
 | |
|         execute_java_constructor(ee, "java/lang/Integer", 0, "(I)", i);
 | |
| }
 | |
| 
 | |
| static JHandle*
 | |
| _putHash(ExecEnv *ee, JHandle* tbl, JHandle* key, JHandle* ob)
 | |
| {
 | |
|     return (JHandle*) 
 | |
|         execute_java_dynamic_method( 
 | |
|             ee, tbl, "put",
 | |
|             "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", 
 | |
|             key, ob );
 | |
| }
 | |
| 
 | |
| static JHandle*
 | |
| _getHash(ExecEnv *ee, JHandle* tbl, JHandle* key)
 | |
| {
 | |
|     return (JHandle*) 
 | |
|         execute_java_dynamic_method( 
 | |
|             ee, tbl, "get",
 | |
|             "(Ljava/lang/Object;)Ljava/lang/Object;", 
 | |
|             key );
 | |
| }
 | |
| 
 | |
| static JHandle*
 | |
| _removeHash(ExecEnv *ee, JHandle* tbl, JHandle* key)
 | |
| {
 | |
|     return (JHandle*) 
 | |
|         execute_java_dynamic_method( 
 | |
|             ee, tbl, "remove",
 | |
|             "(Ljava/lang/Object;)Ljava/lang/Object;", 
 | |
|             key );
 | |
| }
 | |
| 
 | |
| struct Hnetscape_jsdebug_JSStackFrameInfo*
 | |
| _constructJSStackFrameInfo( ExecEnv* ee, JSDStackFrameInfo* jsdframe, 
 | |
|                             struct Hnetscape_jsdebug_JSThreadState* threadState )
 | |
| {
 | |
|     struct Hnetscape_jsdebug_JSStackFrameInfo* frame;
 | |
| 
 | |
|     frame = (struct Hnetscape_jsdebug_JSStackFrameInfo*)
 | |
|         execute_java_constructor( ee, "netscape/jsdebug/JSStackFrameInfo", 0, 
 | |
|                                   "(Lnetscape/jsdebug/JSThreadState;)",
 | |
|                                   threadState );
 | |
|     if( ! frame )
 | |
|         return NULL;
 | |
| 
 | |
|     /* XXX fill in additional fields */
 | |
|     unhand(frame)->_nativePtr = (long) jsdframe;
 | |
| 
 | |
|     return frame;
 | |
| }
 | |
| 
 | |
| struct Hnetscape_jsdebug_JSPC*
 | |
| _constructJSPC( ExecEnv* ee, struct Hnetscape_jsdebug_Script* script, long pc )
 | |
| {
 | |
|     struct Hnetscape_jsdebug_JSPC * pcOb;
 | |
| 
 | |
|     pcOb = (struct Hnetscape_jsdebug_JSPC *)
 | |
|         execute_java_constructor( ee, "netscape/jsdebug/JSPC", 0, 
 | |
|                                   "(Lnetscape/jsdebug/Script;I)",
 | |
|                                   script, pc );
 | |
|     if( ! pcOb )
 | |
|         return NULL;
 | |
| 
 | |
|     /* XXX fill in additional fields */
 | |
| 
 | |
|     return pcOb;
 | |
| }
 | |
| 
 | |
| static Hnetscape_jsdebug_Script*
 | |
| _scriptObFromJSDScriptPtr( ExecEnv* ee, JSDScript* jsdscript )
 | |
| {
 | |
|     JHandle* tbl = (JHandle*) unhand(controller)->scriptTable;
 | |
|     JHandle* key = _constructInteger(ee,(long)jsdscript);
 | |
|     return (Hnetscape_jsdebug_Script*) _getHash( ee, tbl, key );
 | |
| }
 | |
| 
 | |
| /***************************************************************************/
 | |
| 
 | |
| void PR_CALLBACK
 | |
| _scriptHook( JSDContext* jsdc, 
 | |
|              JSDScript*  jsdscript,
 | |
|              JSBool      creating,
 | |
|              void*       callerdata )
 | |
| {
 | |
|     Hnetscape_jsdebug_Script* script;
 | |
|     ExecEnv* ee = EE();
 | |
| 
 | |
|     if( ! context || ! controller || ! ee )
 | |
|         return;
 | |
| 
 | |
|     if( creating )
 | |
|     {
 | |
|         char* url      = (char*)JSD_GetScriptFilename       (jsdc, jsdscript);
 | |
|         char* function = (char*)JSD_GetScriptFunctionName   (jsdc, jsdscript);
 | |
|         int base       =        JSD_GetScriptBaseLineNumber (jsdc, jsdscript);
 | |
|         int extent     =        JSD_GetScriptLineExtent     (jsdc, jsdscript);
 | |
| 
 | |
|         if( ! url )
 | |
|         {
 | |
|             return;
 | |
|             /* url = ""; */
 | |
|         }
 | |
| 
 | |
|         /* create Java Object for Script */
 | |
|         script = (Hnetscape_jsdebug_Script*)
 | |
|                 execute_java_constructor(ee, "netscape/jsdebug/Script", 0, "()");
 | |
| 
 | |
|         if( ! script )
 | |
|             return;
 | |
| 
 | |
|         /* set the members */
 | |
|         unhand(script)->_url = makeJavaString(url,strlen(url));
 | |
|         unhand(script)->_function = function ? makeJavaString(function,strlen(function)) : 0;
 | |
|         unhand(script)->_baseLineNumber = base;
 | |
|         unhand(script)->_lineExtent = extent;
 | |
|         unhand(script)->_nativePtr = (long)jsdscript;
 | |
| 
 | |
|         /* add it to the hash table */
 | |
|         _putHash( ee, (JHandle*) unhand(controller)->scriptTable,
 | |
|                   _constructInteger(ee, (long)jsdscript), (JHandle*)script );
 | |
| 
 | |
|         /* call the hook */
 | |
|         if( unhand(controller)->scriptHook )
 | |
|         {
 | |
|             execute_java_dynamic_method( ee,(JHandle*)unhand(controller)->scriptHook,
 | |
|                                          "justLoadedScript",
 | |
|                                          "(Lnetscape/jsdebug/Script;)V", 
 | |
|                                          script );
 | |
|         }
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         JHandle* tbl = (JHandle*) unhand(controller)->scriptTable;
 | |
|         JHandle* key = _constructInteger(ee,(long)jsdscript);
 | |
| 
 | |
|         /* find Java Object for Script    */
 | |
|         script = (Hnetscape_jsdebug_Script*) _getHash( ee, tbl, key );
 | |
| 
 | |
|         if( ! script )
 | |
|             return;
 | |
| 
 | |
|         /* remove it from the hash table  */
 | |
|         _removeHash( ee, tbl, key );
 | |
| 
 | |
|         /* call the hook */
 | |
|         if( unhand(controller)->scriptHook )
 | |
|         {
 | |
|             execute_java_dynamic_method( ee,(JHandle*)unhand(controller)->scriptHook,
 | |
|                                          "aboutToUnloadScript",
 | |
|                                          "(Lnetscape/jsdebug/Script;)V", 
 | |
|                                          script );
 | |
|         }
 | |
|         /* set the Script as invalid */
 | |
|         execute_java_dynamic_method( ee,(JHandle*)script,
 | |
|                                      "_setInvalid",
 | |
|                                      "()V" );
 | |
|     }
 | |
| }
 | |
| 
 | |
| /***************************************************************************/
 | |
| PRUintn PR_CALLBACK
 | |
| _executionHook( JSDContext*     jsdc, 
 | |
|                 JSDThreadState* jsdstate,
 | |
|                 PRUintn         type,
 | |
|                 void*           callerdata )
 | |
| {
 | |
|     Hnetscape_jsdebug_JSThreadState* threadState;
 | |
|     Hnetscape_jsdebug_Script* script;
 | |
|     JHandle* pcOb;
 | |
|     JSDStackFrameInfo* jsdframe;
 | |
|     JSDScript*  jsdscript;
 | |
|     int pc;
 | |
|     JHandle* tblScript;
 | |
|     JHandle* keyScript;
 | |
|     ExecEnv* ee = EE();
 | |
| 
 | |
|     if( ! context || ! controller || ! ee )
 | |
|         return JSD_HOOK_RETURN_HOOK_ERROR;
 | |
| 
 | |
|     /* get the JSDStackFrameInfo */
 | |
|     jsdframe = JSD_GetStackFrame(jsdc, jsdstate);
 | |
|     if( ! jsdframe )
 | |
|         return JSD_HOOK_RETURN_HOOK_ERROR;
 | |
| 
 | |
|     /* get the JSDScript */
 | |
|     jsdscript = JSD_GetScriptForStackFrame(jsdc, jsdstate, jsdframe);
 | |
|     if( ! jsdscript )
 | |
|         return JSD_HOOK_RETURN_HOOK_ERROR;
 | |
| 
 | |
|     /* find Java Object for Script    */
 | |
|     tblScript = (JHandle*) unhand(controller)->scriptTable;
 | |
|     keyScript = _constructInteger(ee, (long)jsdscript);
 | |
|     script = (Hnetscape_jsdebug_Script*) _getHash( ee, tblScript, keyScript );
 | |
|     if( ! script )
 | |
|         return JSD_HOOK_RETURN_HOOK_ERROR;
 | |
| 
 | |
|     /* generate a JSPC */
 | |
|     pc = JSD_GetPCForStackFrame(jsdc, jsdstate, jsdframe);
 | |
| 
 | |
|     pcOb = (JHandle*)
 | |
|         _constructJSPC(ee, script, pc);
 | |
|     if( ! pcOb )
 | |
|         return JSD_HOOK_RETURN_HOOK_ERROR;
 | |
| 
 | |
|     /* build a JSThreadState */
 | |
|     threadState = (struct Hnetscape_jsdebug_JSThreadState*)
 | |
|             execute_java_constructor( ee, "netscape/jsdebug/JSThreadState",0,"()");
 | |
|     if( ! threadState )
 | |
|         return JSD_HOOK_RETURN_HOOK_ERROR;
 | |
| 
 | |
|     /* populate the ThreadState */
 | |
|     /* XXX FILL IN THE REST... */
 | |
|     unhand(threadState)->valid           = 1; /* correct value for true? */
 | |
|     unhand(threadState)->currentFramePtr = (long) jsdframe;
 | |
|     unhand(threadState)->nativeThreadState = (long) jsdstate;
 | |
|     unhand(threadState)->continueState = netscape_jsdebug_JSThreadState_DEBUG_STATE_RUN;
 | |
| 
 | |
|     /* XXX FILL IN THE REST... */
 | |
| 
 | |
| 
 | |
|     /* find and call the appropriate Hook */
 | |
|     if( JSD_HOOK_INTERRUPTED == type )
 | |
|     {
 | |
|         JHandle* hook;
 | |
| 
 | |
|         /* clear the JSD level hook (must reset on next sendInterrupt0()*/
 | |
|         JSD_ClearInterruptHook(context); 
 | |
| 
 | |
|         hook = (JHandle*) unhand(controller)->interruptHook;
 | |
|         if( ! hook )
 | |
|             return JSD_HOOK_RETURN_HOOK_ERROR;
 | |
| 
 | |
|         /* call the hook */
 | |
|         execute_java_dynamic_method( 
 | |
|             ee, hook, "aboutToExecute",
 | |
|             "(Lnetscape/jsdebug/ThreadStateBase;Lnetscape/jsdebug/PC;)V",
 | |
|             threadState, pcOb );
 | |
|     }
 | |
|     else if( JSD_HOOK_DEBUG_REQUESTED == type )
 | |
|     {
 | |
|         JHandle* hook;
 | |
| 
 | |
|         hook = (JHandle*) unhand(controller)->debugBreakHook;
 | |
|         if( ! hook )
 | |
|             return JSD_HOOK_RETURN_HOOK_ERROR;
 | |
| 
 | |
|         /* call the hook */
 | |
|         execute_java_dynamic_method( 
 | |
|             ee, hook, "aboutToExecute",
 | |
|             "(Lnetscape/jsdebug/ThreadStateBase;Lnetscape/jsdebug/PC;)V",
 | |
|             threadState, pcOb );
 | |
|     }
 | |
|     else if( JSD_HOOK_BREAKPOINT == type )
 | |
|     {
 | |
|         JHandle* hook;
 | |
| 
 | |
|         hook = (JHandle*)
 | |
|                 execute_java_dynamic_method( 
 | |
|                         ee,(JHandle*)controller,
 | |
|                         "getInstructionHook0",
 | |
|                         "(Lnetscape/jsdebug/PC;)Lnetscape/jsdebug/InstructionHook;",
 | |
|                         pcOb );
 | |
|         if( ! hook )
 | |
|             return JSD_HOOK_RETURN_HOOK_ERROR;
 | |
| 
 | |
|         /* call the hook */
 | |
|         execute_java_dynamic_method( 
 | |
|             ee, hook, "aboutToExecute",
 | |
|             "(Lnetscape/jsdebug/ThreadStateBase;)V",
 | |
|             threadState );
 | |
|     }
 | |
| 
 | |
|     if( netscape_jsdebug_JSThreadState_DEBUG_STATE_THROW == 
 | |
|         unhand(threadState)->continueState )
 | |
|         return JSD_HOOK_RETURN_ABORT;
 | |
| 
 | |
|     return JSD_HOOK_RETURN_CONTINUE;
 | |
| }
 | |
| 
 | |
| PRUintn PR_CALLBACK
 | |
| _errorReporter( JSDContext*     jsdc, 
 | |
|                 JSContext*      cx,
 | |
|                 const char*     message, 
 | |
|                 JSErrorReport*  report,
 | |
|                 void*           callerdata )
 | |
| {
 | |
|     JHandle* reporter;
 | |
|     JHandle* msg         = NULL;
 | |
|     JHandle* filename    = NULL;
 | |
|     int      lineno      = 0;
 | |
|     JHandle* linebuf     = NULL;
 | |
|     int      tokenOffset = 0;
 | |
|     ExecEnv* ee = EE();
 | |
| 
 | |
|     if( ! context || ! controller || ! ee )
 | |
|         return JSD_ERROR_REPORTER_PASS_ALONG;
 | |
| 
 | |
|     reporter = (JHandle*) unhand(controller)->errorReporter;
 | |
|     if( ! reporter )
 | |
|         return JSD_ERROR_REPORTER_PASS_ALONG;
 | |
| 
 | |
|     if( message )
 | |
|         msg = (JHandle*) makeJavaString((char*)message, strlen(message));
 | |
|     if( report && report->filename )
 | |
|         filename = (JHandle*) makeJavaString((char*)report->filename, strlen(report->filename));
 | |
|     if( report && report->linebuf )
 | |
|         linebuf = (JHandle*) makeJavaString((char*)report->linebuf, strlen(report->linebuf));
 | |
|     if( report )
 | |
|         lineno = report->lineno;
 | |
|     if( report && report->linebuf && report->tokenptr )
 | |
|         tokenOffset = report->tokenptr - report->linebuf;
 | |
| 
 | |
|     return (int) 
 | |
|         execute_java_dynamic_method( 
 | |
|                 ee, reporter, "reportError",
 | |
|                 "(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;I)I", 
 | |
|                 msg,
 | |
|                 filename,
 | |
|                 lineno,
 | |
|                 linebuf,
 | |
|                 tokenOffset );
 | |
| }
 | |
| 
 | |
| /***************************************************************************/
 | |
| /* from "_gen\netscape_jsdebug_DebugController.h" */
 | |
| 
 | |
| 
 | |
| /* XXX HACK */
 | |
| JSDContext* _simContext = 0;
 | |
| 
 | |
| void netscape_jsdebug_DebugController__setController(struct Hnetscape_jsdebug_DebugController * self,/*boolean*/ long on)
 | |
| {
 | |
|     if(on)
 | |
|     {
 | |
|         context = JSD_DebuggerOn();
 | |
|         if( ! context )
 | |
|             return;
 | |
| 
 | |
|         _simContext = context; /* XXX HACK */
 | |
| 
 | |
|         unhand(self)->_nativeContext = (long) context;
 | |
|         controller = self;
 | |
|         JSD_SetScriptHook(context, _scriptHook, (void*)1 );
 | |
|         JSD_SetErrorReporter(context, _errorReporter, (void*)1 );
 | |
|         JSD_SetDebugBreakHook(context, _executionHook, (void*)1 );
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         /* XXX stop somehow... */
 | |
|         /* kill context        */
 | |
|         JSD_SetDebugBreakHook(context, NULL, NULL );
 | |
|         JSD_SetErrorReporter(context, NULL, NULL);
 | |
|         JSD_SetScriptHook(context, NULL, NULL);
 | |
|         context = 0;
 | |
|         controller = 0;
 | |
|     }
 | |
| }
 | |
| 
 | |
| void netscape_jsdebug_DebugController_setInstructionHook0(struct Hnetscape_jsdebug_DebugController * self,struct Hnetscape_jsdebug_PC * pcOb)
 | |
| {
 | |
|     Hnetscape_jsdebug_Script* script;
 | |
|     JSDScript* jsdscript;
 | |
|     PRUintn pc;
 | |
|     ExecEnv* ee = EE();
 | |
| 
 | |
|     if( ! context || ! controller || ! ee )
 | |
|         return;
 | |
| 
 | |
|     script = (Hnetscape_jsdebug_Script*)
 | |
|         execute_java_dynamic_method(ee, (JHandle*)pcOb, "getScript","()Lnetscape/jsdebug/Script;");
 | |
| 
 | |
|     if( ! script )
 | |
|         return;
 | |
| 
 | |
|     jsdscript = (JSDScript*) unhand(script)->_nativePtr;
 | |
|     if( ! jsdscript )
 | |
|         return;
 | |
| 
 | |
|     pc = (PRUintn)
 | |
|         execute_java_dynamic_method(ee, (JHandle*)pcOb, "getPC","()I");
 | |
| 
 | |
|     JSD_SetExecutionHook(context, jsdscript, pc, _executionHook, 0);
 | |
| }
 | |
| 
 | |
| void netscape_jsdebug_DebugController_sendInterrupt0(struct Hnetscape_jsdebug_DebugController * self)
 | |
| {
 | |
|     if( ! context || ! controller )
 | |
|         return;
 | |
|     JSD_SetInterruptHook(context, _executionHook, 0);
 | |
| }
 | |
| 
 | |
| struct Hjava_lang_String *netscape_jsdebug_DebugController_executeScriptInStackFrame0(struct Hnetscape_jsdebug_DebugController *self,struct Hnetscape_jsdebug_JSStackFrameInfo *frame,struct Hjava_lang_String *src,struct Hjava_lang_String *filename,long lineno)
 | |
| {
 | |
|     struct Hnetscape_jsdebug_JSThreadState* threadStateOb;
 | |
|     JSDThreadState* jsdthreadstate;
 | |
|     JSDStackFrameInfo* jsdframe;
 | |
|     char* filenameC;
 | |
|     char* srcC;
 | |
|     JSString* jsstr;
 | |
|     jsval rval;
 | |
|     JSBool success;
 | |
|     int srclen;
 | |
| 
 | |
|     threadStateOb = (struct Hnetscape_jsdebug_JSThreadState*)unhand(frame)->threadState;
 | |
|     jsdthreadstate = (JSDThreadState*) unhand(threadStateOb)->nativeThreadState;
 | |
| 
 | |
|     jsdframe = (JSDStackFrameInfo*) unhand(frame)->_nativePtr;
 | |
| 
 | |
|     if( ! context || ! controller || ! jsdframe )
 | |
|         return NULL;
 | |
| 
 | |
|     filenameC = allocCString(filename);
 | |
|     if( ! filenameC )
 | |
|         return NULL;
 | |
|     srcC = allocCString(src);
 | |
|     if( ! srcC )
 | |
|     {
 | |
|         free(filenameC);
 | |
|         return NULL;
 | |
|     }
 | |
| 
 | |
|     srclen = strlen(srcC);
 | |
| 
 | |
|     success = JSD_EvaluateScriptInStackFrame(context, jsdthreadstate, jsdframe, 
 | |
|                                              srcC, srclen,
 | |
|                                              filenameC, lineno, &rval);
 | |
| 
 | |
|     /* XXX crashing on Windows under Symantec (though I can't see why!)*/
 | |
| 
 | |
|     free(filenameC);
 | |
|     free(srcC);
 | |
| 
 | |
| 
 | |
|     if( ! success )
 | |
|         return NULL;
 | |
| 
 | |
|     if( JSVAL_IS_NULL(rval) || JSVAL_IS_VOID(rval) )
 | |
|         return NULL;
 | |
| 
 | |
|     jsstr = JSD_ValToStringInStackFrame(context,jsdthreadstate,jsdframe,rval);
 | |
|     if( ! jsstr )
 | |
|         return NULL;
 | |
| 
 | |
|     /* XXXbe should use JS_GetStringChars and preserve Unicode. */
 | |
|     return makeJavaString((char*)JS_GetStringBytes(jsstr), JS_GetStringLength(jsstr));
 | |
| }    
 | |
| 
 | |
| long netscape_jsdebug_DebugController_getNativeMajorVersion(struct Hnetscape_jsdebug_DebugController* self)
 | |
| {
 | |
|     return (long) JSD_GetMajorVersion();
 | |
| }
 | |
| 
 | |
| long netscape_jsdebug_DebugController_getNativeMinorVersion(struct Hnetscape_jsdebug_DebugController* self)
 | |
| {
 | |
|     return (long) JSD_GetMinorVersion();
 | |
| }
 | |
| 
 | |
| /***************************************************************************/
 | |
| /* from "_gen\netscape_jsdebug_Script.h" */
 | |
| 
 | |
| struct Hnetscape_jsdebug_JSPC *netscape_jsdebug_Script_getClosestPC(struct Hnetscape_jsdebug_Script * self,long line)
 | |
| {
 | |
|     PRUintn pc;
 | |
|     JSDScript* jsdscript;
 | |
| 
 | |
|     if( ! context || ! controller )
 | |
|         return 0;
 | |
| 
 | |
|     jsdscript = (JSDScript*) unhand(self)->_nativePtr;
 | |
|     if( ! jsdscript )
 | |
|         return 0;
 | |
| 
 | |
|     pc = JSD_GetClosestPC(context, jsdscript, line);
 | |
| 
 | |
|     if( -1 == pc )
 | |
|         return 0;
 | |
|     return _constructJSPC( 0, self, pc);
 | |
| }
 | |
| 
 | |
| /***************************************************************************/
 | |
| /* from "_gen\netscape_jsdebug_JSThreadState.h" */
 | |
| 
 | |
| long netscape_jsdebug_JSThreadState_countStackFrames(struct Hnetscape_jsdebug_JSThreadState * self)
 | |
| {
 | |
|     JSDThreadState* jsdstate;
 | |
|         
 | |
|     if( ! context || ! controller )
 | |
|         return 0;
 | |
| 
 | |
|     jsdstate = (JSDThreadState*) unhand(self)->nativeThreadState;
 | |
| 
 | |
|     if( ! jsdstate )
 | |
|         return 0;
 | |
| 
 | |
|     return (long) JSD_GetCountOfStackFrames(context, jsdstate);
 | |
| }
 | |
| 
 | |
| struct Hnetscape_jsdebug_StackFrameInfo *netscape_jsdebug_JSThreadState_getCurrentFrame(struct Hnetscape_jsdebug_JSThreadState * self)
 | |
| {
 | |
|     JSDThreadState* jsdstate;
 | |
|     JSDStackFrameInfo* jsdframe;
 | |
|         
 | |
|     if( ! context || ! controller )
 | |
|         return NULL;
 | |
| 
 | |
|     jsdstate = (JSDThreadState*) unhand(self)->nativeThreadState;
 | |
| 
 | |
|     if( ! jsdstate )
 | |
|         return NULL;
 | |
| 
 | |
|     jsdframe = JSD_GetStackFrame(context, jsdstate);
 | |
|     if( ! jsdframe )
 | |
|         return NULL;
 | |
| 
 | |
|     return (struct Hnetscape_jsdebug_StackFrameInfo*)
 | |
|                 _constructJSStackFrameInfo( 0, jsdframe, self );
 | |
| }
 | |
| 
 | |
| 
 | |
| /***************************************************************************/
 | |
| /* from "_gen\netscape_jsdebug_JSStackFrameInfo.h" */
 | |
| 
 | |
| struct Hnetscape_jsdebug_StackFrameInfo *netscape_jsdebug_JSStackFrameInfo_getCaller0(struct Hnetscape_jsdebug_JSStackFrameInfo * self)
 | |
| {
 | |
|     JSDStackFrameInfo* jsdframeCur;
 | |
|     JSDStackFrameInfo* jsdframeCaller;
 | |
|     struct Hnetscape_jsdebug_JSThreadState* threadState;
 | |
|     JSDThreadState* jsdthreadstate;
 | |
| 
 | |
|     if( ! context || ! controller )
 | |
|         return NULL;
 | |
| 
 | |
|     jsdframeCur = (JSDStackFrameInfo*) unhand(self)->_nativePtr;
 | |
|     if( ! jsdframeCur )
 | |
|         return NULL;
 | |
| 
 | |
|     threadState = (struct Hnetscape_jsdebug_JSThreadState*) unhand(self)->threadState;
 | |
|     if( ! threadState )
 | |
|         return NULL;
 | |
| 
 | |
|     jsdthreadstate = (JSDThreadState*) unhand(threadState)->nativeThreadState;
 | |
|     if( ! jsdthreadstate )
 | |
|         return NULL;
 | |
| 
 | |
|     jsdframeCaller = JSD_GetCallingStackFrame(context, jsdthreadstate, jsdframeCur);
 | |
|     if( ! jsdframeCaller )
 | |
|         return NULL;
 | |
| 
 | |
|     return (struct Hnetscape_jsdebug_StackFrameInfo*)
 | |
|                 _constructJSStackFrameInfo( 0, jsdframeCaller, threadState );
 | |
| }
 | |
| struct Hnetscape_jsdebug_PC *netscape_jsdebug_JSStackFrameInfo_getPC(struct Hnetscape_jsdebug_JSStackFrameInfo * self)
 | |
| {
 | |
|     JSDScript* jsdscript;
 | |
|     JSDStackFrameInfo* jsdframe;
 | |
|     struct Hnetscape_jsdebug_Script* script;
 | |
|     struct Hnetscape_jsdebug_JSThreadState* threadState;
 | |
|     JSDThreadState* jsdthreadstate;
 | |
|     int pc;
 | |
|     ExecEnv* ee = EE();
 | |
| 
 | |
|     if( ! context || ! controller || ! ee )
 | |
|         return NULL;
 | |
| 
 | |
|     jsdframe = (JSDStackFrameInfo*) unhand(self)->_nativePtr;
 | |
|     if( ! jsdframe )
 | |
|         return NULL;
 | |
| 
 | |
|     threadState = (struct Hnetscape_jsdebug_JSThreadState*) unhand(self)->threadState;
 | |
|     if( ! threadState )
 | |
|         return NULL;
 | |
| 
 | |
|     jsdthreadstate = (JSDThreadState*) unhand(threadState)->nativeThreadState;
 | |
|     if( ! jsdthreadstate )
 | |
|         return NULL;
 | |
| 
 | |
|     jsdscript = JSD_GetScriptForStackFrame(context, jsdthreadstate, jsdframe );
 | |
|     if( ! jsdscript )
 | |
|         return NULL;
 | |
| 
 | |
|     script = _scriptObFromJSDScriptPtr(ee, jsdscript);
 | |
|     if( ! script )
 | |
|         return NULL;
 | |
| 
 | |
|     pc = JSD_GetPCForStackFrame(context, jsdthreadstate, jsdframe);
 | |
|     if( ! pc )
 | |
|         return NULL;
 | |
| 
 | |
|     return (struct Hnetscape_jsdebug_PC*) _constructJSPC(ee, script, pc);
 | |
| }
 | |
| 
 | |
| /***************************************************************************/
 | |
| /* from "_gen\netscape_jsdebug_JSPC.h" */
 | |
| 
 | |
| struct Hnetscape_jsdebug_SourceLocation *netscape_jsdebug_JSPC_getSourceLocation(struct Hnetscape_jsdebug_JSPC * self)
 | |
| {
 | |
|     JSDScript* jsdscript;
 | |
|     struct Hnetscape_jsdebug_Script* script;
 | |
|     struct Hnetscape_jsdebug_JSPC* newPCOb;
 | |
|     int line;
 | |
|     int newpc;
 | |
|     int pc;
 | |
|     ExecEnv* ee = EE();
 | |
| 
 | |
|     if( ! context || ! controller || ! ee )
 | |
|         return NULL;
 | |
| 
 | |
|     script = unhand(self)->script;
 | |
| 
 | |
|     if( ! script )
 | |
|         return NULL;
 | |
| 
 | |
|     jsdscript = (JSDScript*) unhand(script)->_nativePtr;
 | |
|     if( ! jsdscript )
 | |
|         return NULL;
 | |
|     pc = unhand(self)->pc;
 | |
| 
 | |
|     line = JSD_GetClosestLine(context, jsdscript, pc);
 | |
|     newpc = JSD_GetClosestPC(context, jsdscript, line);
 | |
| 
 | |
|     newPCOb = _constructJSPC(ee, script, newpc );
 | |
|     if( ! newPCOb )
 | |
|         return NULL;
 | |
| 
 | |
|     return (struct Hnetscape_jsdebug_SourceLocation *)
 | |
|         execute_java_constructor( ee, "netscape/jsdebug/JSSourceLocation", 0, 
 | |
|                                   "(Lnetscape/jsdebug/JSPC;I)",
 | |
|                                   newPCOb, line );
 | |
| }
 | |
| 
 | |
| /***************************************************************************/
 | |
| /* from "_gen\netscape_jsdebug_JSSourceTextProvider.h" */
 | |
| 
 | |
| struct Hnetscape_jsdebug_SourceTextItem *netscape_jsdebug_JSSourceTextProvider_loadSourceTextItem0(struct Hnetscape_jsdebug_JSSourceTextProvider * self,struct Hjava_lang_String * url)
 | |
| {
 | |
|     /* this should attempt to load the source for the indicated URL */
 | |
|     return NULL;    
 | |
| }
 | |
| 
 | |
| void netscape_jsdebug_JSSourceTextProvider_refreshSourceTextVector(struct Hnetscape_jsdebug_JSSourceTextProvider * self)
 | |
| {
 | |
| 
 | |
|     JHandle* vec;
 | |
|     JHandle* itemOb;
 | |
|     JSDSourceText* iterp = 0;
 | |
|     JSDSourceText* item;
 | |
|     const char* url;
 | |
|     struct Hjava_lang_String* urlOb;
 | |
|     ExecEnv* ee = EE();
 | |
| 
 | |
|     if( ! context || ! controller || ! ee )
 | |
|         return;
 | |
| 
 | |
|     /* create new vector */
 | |
|     vec = (JHandle*) execute_java_constructor(ee, "netscape/util/Vector", 0, "()");
 | |
|     if( ! vec )
 | |
|         return;
 | |
| 
 | |
|     /* lock the native subsystem */
 | |
|     JSD_LockSourceTextSubsystem(context);
 | |
| 
 | |
|     /* iterate through the native items */
 | |
|     while( 0 != (item = JSD_IterateSources(context, &iterp)) )
 | |
|     {
 | |
|         int urlStrLen;
 | |
|         int status = JSD_GetSourceStatus(context,item);
 | |
| 
 | |
|         /* try to find Java object */
 | |
|         url = JSD_GetSourceURL(context, item);
 | |
|         if( ! url || 0 == (urlStrLen = strlen(url)) ) /* ignoring those with no url */
 | |
|             continue;
 | |
| 
 | |
|         urlOb = makeJavaString((char*)url,urlStrLen);
 | |
|         if( ! urlOb )
 | |
|             continue;
 | |
| 
 | |
|         itemOb = (JHandle*)
 | |
|             execute_java_dynamic_method( ee, (JHandle*)self, "findSourceTextItem0",
 | |
|                       "(Ljava/lang/String;)Lnetscape/jsdebug/SourceTextItem;",
 | |
|                       urlOb );
 | |
|                       
 | |
|         if( ! itemOb )
 | |
|         {
 | |
|             /* if not found then generate new item */
 | |
|             struct Hjava_lang_String* textOb;
 | |
|             const char* str;
 | |
|             int length;
 | |
| 
 | |
|             if( ! JSD_GetSourceText(context, item, &str, &length ) )
 | |
|             {
 | |
|                 str = "";
 | |
|                 length = 0;
 | |
|             }
 | |
|             textOb = makeJavaString((char*)str, length);
 | |
| 
 | |
|             itemOb = (JHandle*)
 | |
|                 execute_java_constructor(ee, "netscape/jsdebug/SourceTextItem",0,  
 | |
|                      "(Ljava/lang/String;Ljava/lang/String;I)",
 | |
|                      urlOb, textOb, status );
 | |
|         }
 | |
|         else if( JSD_IsSourceDirty(context, item) && 
 | |
|                  JSD_SOURCE_CLEARED != status )
 | |
|         {
 | |
|             /* if found and dirty then update */
 | |
|             struct Hjava_lang_String* textOb;
 | |
|             const char* str;
 | |
|             int length;
 | |
| 
 | |
|             if( ! JSD_GetSourceText(context, item, &str, &length ) )
 | |
|             {
 | |
|                 str = "";
 | |
|                 length = 0;
 | |
|             }
 | |
|             textOb = makeJavaString((char*)str, length);
 | |
|             execute_java_dynamic_method(ee, itemOb, "setText", 
 | |
|                                         "(Ljava/lang/String;)V", textOb);
 | |
|             execute_java_dynamic_method(ee, itemOb, "setStatus", 
 | |
|                                         "(I)V", status );
 | |
|             execute_java_dynamic_method(ee, itemOb, "setDirty", "(Z)V", 1 );
 | |
|         }
 | |
| 
 | |
|         /* we have our copy; clear the native cached text */
 | |
|         if( JSD_SOURCE_INITED  != status && 
 | |
|             JSD_SOURCE_PARTIAL != status &&
 | |
|             JSD_SOURCE_CLEARED != status )
 | |
|         {
 | |
|             JSD_ClearSourceText(context, item);
 | |
|         }
 | |
| 
 | |
|         /* set the item clean */
 | |
|         JSD_SetSourceDirty(context, item, FALSE );
 | |
| 
 | |
|         /* add the item to the vector */
 | |
|         if( itemOb )
 | |
|             execute_java_dynamic_method(ee, vec, "addElement", 
 | |
|                                         "(Ljava/lang/Object;)V", itemOb );
 | |
|     }
 | |
|     /* unlock the native subsystem */
 | |
|     JSD_UnlockSourceTextSubsystem(context);
 | |
| 
 | |
|     /* set main vector to our new vector */
 | |
| 
 | |
|     unhand(self)->_sourceTextVector = (struct Hnetscape_util_Vector*) vec;
 | |
| }    
 | |
| 
 | |
| 
 | |
| #endif
 | 
