gecko-dev/js/jsd/jsd_java.cpp

780 строки
24 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* vim: set ts=8 sts=4 et sw=4 tw=99:
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* 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 nullptr;
/* 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 nullptr;
/* 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
_scriptHook( JSDContext* jsdc,
JSDScript* jsdscript,
bool creating,
void* callerdata )
{
Hnetscape_jsdebug_Script* script;
ExecEnv* ee = EE();
if( ! context || ! controller || ! ee )
return;
if( creating )
{
char* url = (char*)JSD_GetScriptFilename (jsdc, jsdscript);
JSString* function = JSD_GetScriptFunctionId (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" );
}
}
/***************************************************************************/
unsigned
_executionHook( JSDContext* jsdc,
JSDThreadState* jsdstate,
unsigned 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;
}
unsigned
_errorReporter( JSDContext* jsdc,
JSContext* cx,
const char* message,
JSErrorReport* report,
void* callerdata )
{
JHandle* reporter;
JHandle* msg = nullptr;
JHandle* filename = nullptr;
int lineno = 0;
JHandle* linebuf = nullptr;
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, nullptr, nullptr);
JSD_SetErrorReporter(context, nullptr, nullptr);
JSD_SetScriptHook(context, nullptr, nullptr);
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;
unsigned 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 = (unsigned)
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;
bool 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 nullptr;
filenameC = allocCString(filename);
if( ! filenameC )
return nullptr;
srcC = allocCString(src);
if( ! srcC )
{
free(filenameC);
return nullptr;
}
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 nullptr;
if( JSVAL_IS_NULL(rval) || JSVAL_IS_VOID(rval) )
return nullptr;
jsstr = JSD_ValToStringInStackFrame(context,jsdthreadstate,jsdframe,rval);
if( ! jsstr )
return nullptr;
/* 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)
{
unsigned 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 nullptr;
jsdstate = (JSDThreadState*) unhand(self)->nativeThreadState;
if( ! jsdstate )
return nullptr;
jsdframe = JSD_GetStackFrame(context, jsdstate);
if( ! jsdframe )
return nullptr;
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 nullptr;
jsdframeCur = (JSDStackFrameInfo*) unhand(self)->_nativePtr;
if( ! jsdframeCur )
return nullptr;
threadState = (struct Hnetscape_jsdebug_JSThreadState*) unhand(self)->threadState;
if( ! threadState )
return nullptr;
jsdthreadstate = (JSDThreadState*) unhand(threadState)->nativeThreadState;
if( ! jsdthreadstate )
return nullptr;
jsdframeCaller = JSD_GetCallingStackFrame(context, jsdthreadstate, jsdframeCur);
if( ! jsdframeCaller )
return nullptr;
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 nullptr;
jsdframe = (JSDStackFrameInfo*) unhand(self)->_nativePtr;
if( ! jsdframe )
return nullptr;
threadState = (struct Hnetscape_jsdebug_JSThreadState*) unhand(self)->threadState;
if( ! threadState )
return nullptr;
jsdthreadstate = (JSDThreadState*) unhand(threadState)->nativeThreadState;
if( ! jsdthreadstate )
return nullptr;
jsdscript = JSD_GetScriptForStackFrame(context, jsdthreadstate, jsdframe );
if( ! jsdscript )
return nullptr;
script = _scriptObFromJSDScriptPtr(ee, jsdscript);
if( ! script )
return nullptr;
pc = JSD_GetPCForStackFrame(context, jsdthreadstate, jsdframe);
if( ! pc )
return nullptr;
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 nullptr;
script = unhand(self)->script;
if( ! script )
return nullptr;
jsdscript = (JSDScript*) unhand(script)->_nativePtr;
if( ! jsdscript )
return nullptr;
pc = unhand(self)->pc;
line = JSD_GetClosestLine(context, jsdscript, pc);
newpc = JSD_GetClosestPC(context, jsdscript, line);
newPCOb = _constructJSPC(ee, script, newpc );
if( ! newPCOb )
return nullptr;
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 nullptr;
}
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