Back to index

lightning-sunbird  0.9+nobinonly
Functions | Variables
jsd_high.c File Reference
#include "jsd.h"

Go to the source code of this file.

Functions

static JSBool _validateUserCallbacks (JSD_UserCallbacks *callbacks)
static JSDContext_newJSDContext (JSRuntime *jsrt, JSD_UserCallbacks *callbacks, void *user)
static void _destroyJSDContext (JSDContext *jsdc)
JSDContextjsd_DebuggerOnForUser (JSRuntime *jsrt, JSD_UserCallbacks *callbacks, void *user)
JSDContextjsd_DebuggerOn (void)
void jsd_DebuggerOff (JSDContext *jsdc)
void jsd_SetUserCallbacks (JSRuntime *jsrt, JSD_UserCallbacks *callbacks, void *user)
voidjsd_SetContextPrivate (JSDContext *jsdc, void *data)
voidjsd_GetContextPrivate (JSDContext *jsdc)
void jsd_ClearAllProfileData (JSDContext *jsdc)
JSDContextjsd_JSDContextForJSContext (JSContext *context)
 jsd_DebugErrorHook (JSContext *cx, const char *message, JSErrorReport *report, void *closure)
JSBool jsd_SetErrorReporter (JSDContext *jsdc, JSD_ErrorReporter reporter, void *callerdata)
JSBool jsd_GetErrorReporter (JSDContext *jsdc, JSD_ErrorReporter *reporter, void **callerdata)

Variables

JSCList _jsd_context_list = JS_INIT_STATIC_CLIST(&_jsd_context_list)
static JSD_UserCallbacks _callbacks
static void_user = NULL
static JSRuntime_jsrt = NULL
static JSClass global_class

Function Documentation

static void _destroyJSDContext ( JSDContext jsdc) [static]

Definition at line 163 of file jsd_high.c.

{
    JSD_ASSERT_VALID_CONTEXT(jsdc);

    JSD_LOCK();
    JS_REMOVE_LINK(&jsdc->links);
    JSD_UNLOCK();

    jsd_DestroyObjectManager(jsdc);
    jsd_DestroyAtomTable(jsdc);

    jsdc->inited = JS_FALSE;

    /*
    * We should free jsdc here, but we let it leak in case there are any 
    * asynchronous hooks calling into the system using it as a handle
    *
    * XXX we also leak the locks
    */
    JS_DestroyContext(jsdc->dumbContext);
    jsdc->dumbContext = NULL;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static JSDContext* _newJSDContext ( JSRuntime jsrt,
JSD_UserCallbacks callbacks,
void user 
) [static]

Definition at line 87 of file jsd_high.c.

{
    JSDContext* jsdc = NULL;

    if( ! jsrt )
        return NULL;

    if( ! _validateUserCallbacks(callbacks) )
        return NULL;

    jsdc = (JSDContext*) calloc(1, sizeof(JSDContext));
    if( ! jsdc )
        goto label_newJSDContext_failure;

    if( ! JSD_INIT_LOCKS(jsdc) )
        goto label_newJSDContext_failure;

    JS_INIT_CLIST(&jsdc->links);

    jsdc->jsrt = jsrt;

    if( callbacks )
        memcpy(&jsdc->userCallbacks, callbacks, callbacks->size);
    
    jsdc->user = user;

#ifdef JSD_HAS_DANGEROUS_THREAD
    jsdc->dangerousThread = _dangerousThread;
#endif

    JS_INIT_CLIST(&jsdc->threadsStates);
    JS_INIT_CLIST(&jsdc->sources);
    JS_INIT_CLIST(&jsdc->removedSources);

    jsdc->sourceAlterCount = 1;

    if( ! jsd_CreateAtomTable(jsdc) )
        goto label_newJSDContext_failure;

    if( ! jsd_InitObjectManager(jsdc) )
        goto label_newJSDContext_failure;

    if( ! jsd_InitScriptManager(jsdc) )
        goto label_newJSDContext_failure;

    jsdc->dumbContext = JS_NewContext(jsdc->jsrt, 256);
    if( ! jsdc->dumbContext )
        goto label_newJSDContext_failure;

    jsdc->glob = JS_NewObject(jsdc->dumbContext, &global_class, NULL, NULL);
    if( ! jsdc->glob )
        goto label_newJSDContext_failure;

    if( ! JS_InitStandardClasses(jsdc->dumbContext, jsdc->glob) )
        goto label_newJSDContext_failure;

    jsdc->data = NULL;
    jsdc->inited = JS_TRUE;

    JSD_LOCK();
    JS_INSERT_LINK(&jsdc->links, &_jsd_context_list);
    JSD_UNLOCK();

    return jsdc;

label_newJSDContext_failure:
    jsd_DestroyObjectManager(jsdc);
    jsd_DestroyAtomTable(jsdc);
    if( jsdc )
        free(jsdc);
    return NULL;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static JSBool _validateUserCallbacks ( JSD_UserCallbacks callbacks) [static]

Definition at line 80 of file jsd_high.c.

{
    return !callbacks ||
           (callbacks->size && callbacks->size <= sizeof(JSD_UserCallbacks));
}    

Here is the caller graph for this function:

Definition at line 284 of file jsd_high.c.

{
    JSDScript *current;
    
    JSD_LOCK_SCRIPTS(jsdc);
    current = (JSDScript *)jsdc->scripts.next;
    while (current != (JSDScript *)&jsdc->scripts)
    {
        jsd_ClearScriptProfileData(jsdc, current);
        current = (JSDScript *)current->links.next;
    }

    JSD_UNLOCK_SCRIPTS(jsdc);
}

Here is the call graph for this function:

Here is the caller graph for this function:

jsd_DebugErrorHook ( JSContext cx,
const char *  message,
JSErrorReport report,
void closure 
)

Definition at line 322 of file jsd_high.c.

{
    JSDContext* jsdc = (JSDContext*) closure;
    JSD_ErrorReporter errorReporter;
    void*             errorReporterData;
    
    if( ! jsdc )
    {
        JS_ASSERT(0);
        return JS_TRUE;
    }
    if( JSD_IS_DANGEROUS_THREAD(jsdc) )
        return JS_TRUE;

    /* local in case hook gets cleared on another thread */
    JSD_LOCK();
    errorReporter     = jsdc->errorReporter;
    errorReporterData = jsdc->errorReporterData;
    JSD_UNLOCK();

    if(!errorReporter)
        return JS_TRUE;

    switch(errorReporter(jsdc, cx, message, report, errorReporterData))
    {
        case JSD_ERROR_REPORTER_PASS_ALONG:
            return JS_TRUE;
        case JSD_ERROR_REPORTER_RETURN:
            return JS_FALSE;
        case JSD_ERROR_REPORTER_DEBUG:
        {
            jsval rval;
            JSD_ExecutionHookProc   hook;
            void*                   hookData;

            /* local in case hook gets cleared on another thread */
            JSD_LOCK();
            hook = jsdc->debugBreakHook;
            hookData = jsdc->debugBreakHookData;
            JSD_UNLOCK();

            jsd_CallExecutionHook(jsdc, cx, JSD_HOOK_DEBUG_REQUESTED,
                                  hook, hookData, &rval);
            /* XXX Should make this dependent on ExecutionHook retval */
            return JS_TRUE;
        }
        case JSD_ERROR_REPORTER_CLEAR_RETURN:
            if(report && JSREPORT_IS_EXCEPTION(report->flags))
                JS_ClearPendingException(cx);
            return JS_FALSE;
        default:
            JS_ASSERT(0);
            break;
    }
    return JS_TRUE;
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 226 of file jsd_high.c.

{
    /* clear hooks here */
    JS_SetNewScriptHookProc(jsdc->jsrt, NULL, NULL);
    JS_SetDestroyScriptHookProc(jsdc->jsrt, NULL, NULL);
    JS_SetDebuggerHandler(jsdc->jsrt, NULL, NULL);
    JS_SetExecuteHook(jsdc->jsrt, NULL, NULL);
    JS_SetCallHook(jsdc->jsrt, NULL, NULL);
    JS_SetObjectHook(jsdc->jsrt, NULL, NULL);
    JS_SetThrowHook(jsdc->jsrt, NULL, NULL);
    JS_SetDebugErrorHook(jsdc->jsrt, NULL, NULL);
#ifdef LIVEWIRE
    LWDBG_SetNewScriptHookProc(NULL,NULL);
#endif

    /* clean up */
    JSD_LockScriptSubsystem(jsdc);
    jsd_DestroyScriptManager(jsdc);
    JSD_UnlockScriptSubsystem(jsdc);
    jsd_DestroyAllSources(jsdc);
    
    _destroyJSDContext(jsdc);

    if( jsdc->userCallbacks.setContext )
        jsdc->userCallbacks.setContext(NULL, jsdc->user);
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 218 of file jsd_high.c.

Here is the call graph for this function:

Here is the caller graph for this function:

JSDContext* jsd_DebuggerOnForUser ( JSRuntime jsrt,
JSD_UserCallbacks callbacks,
void user 
)

Definition at line 189 of file jsd_high.c.

{
    JSDContext* jsdc;
    JSContext* iter = NULL;

    jsdc = _newJSDContext(jsrt, callbacks, user);
    if( ! jsdc )
        return NULL;

    /* set hooks here */
    JS_SetNewScriptHookProc(jsdc->jsrt, jsd_NewScriptHookProc, jsdc);
    JS_SetDestroyScriptHookProc(jsdc->jsrt, jsd_DestroyScriptHookProc, jsdc);
    JS_SetDebuggerHandler(jsdc->jsrt, jsd_DebuggerHandler, jsdc);
    JS_SetExecuteHook(jsdc->jsrt, jsd_TopLevelCallHook, jsdc);
    JS_SetCallHook(jsdc->jsrt, jsd_FunctionCallHook, jsdc);
    JS_SetObjectHook(jsdc->jsrt, jsd_ObjectHook, jsdc);
    JS_SetThrowHook(jsdc->jsrt, jsd_ThrowHandler, jsdc);
    JS_SetDebugErrorHook(jsdc->jsrt, jsd_DebugErrorHook, jsdc);
#ifdef LIVEWIRE
    LWDBG_SetNewScriptHookProc(jsd_NewScriptHookProc, jsdc);
#endif
    if( jsdc->userCallbacks.setContext )
        jsdc->userCallbacks.setContext(jsdc, jsdc->user);
    return jsdc;
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 278 of file jsd_high.c.

{
    return jsdc->data;
}

Here is the caller graph for this function:

JSBool jsd_GetErrorReporter ( JSDContext jsdc,
JSD_ErrorReporter *  reporter,
void **  callerdata 
)

Definition at line 393 of file jsd_high.c.

Here is the caller graph for this function:

Definition at line 300 of file jsd_high.c.

{
    JSDContext* iter;
    JSDContext* jsdc = NULL;
    JSRuntime*  runtime = JS_GetRuntime(context);

    JSD_LOCK();
    for( iter = (JSDContext*)_jsd_context_list.next;
         iter != (JSDContext*)&_jsd_context_list;
         iter = (JSDContext*)iter->links.next )
    {
        if( runtime == iter->jsrt )
        {
            jsdc = iter;
            break;
        }
    }
    JSD_UNLOCK();
    return jsdc;
}    

Here is the call graph for this function:

Here is the caller graph for this function:

void* jsd_SetContextPrivate ( JSDContext jsdc,
void data 
)

Definition at line 270 of file jsd_high.c.

{
    void *rval = jsdc->data;
    jsdc->data = data;
    return data;
}

Here is the caller graph for this function:

JSBool jsd_SetErrorReporter ( JSDContext jsdc,
JSD_ErrorReporter  reporter,
void callerdata 
)

Definition at line 381 of file jsd_high.c.

Here is the caller graph for this function:

void jsd_SetUserCallbacks ( JSRuntime jsrt,
JSD_UserCallbacks callbacks,
void user 
)

Definition at line 254 of file jsd_high.c.

{
    _jsrt = jsrt;
    _user = user;

#ifdef JSD_HAS_DANGEROUS_THREAD
    _dangerousThread = JSD_CURRENT_THREAD();
#endif

    if( callbacks )
        memcpy(&_callbacks, callbacks, sizeof(JSD_UserCallbacks));
    else
        memset(&_callbacks, 0 , sizeof(JSD_UserCallbacks));
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

Definition at line 50 of file jsd_high.c.

Definition at line 47 of file jsd_high.c.

JSRuntime* _jsrt = NULL [static]

Definition at line 52 of file jsd_high.c.

void* _user = NULL [static]

Definition at line 51 of file jsd_high.c.