📄 jsiruntime.cpp
字号:
/***************************************************************************** ***************************************************************************** * * $Id: JsiRuntime.cpp,v 1.11.6.1 2001/10/03 16:20:52 dmeyer Exp $ * * JsiRuntime, class for managing JavaScript runtime environments * * The JsiRuntime class represents a JavaScript interpreter runtime * environment, which is the overall JavaScript engine execution space * (compiler, interpreter, decompiler, garbage collector, etc.) which * can hold zero or more JavaScript contexts (JsiContext objects). * ***************************************************************************** ****************************************************************************//****************License************************************************ * * Copyright 2000-2001. SpeechWorks International, Inc. * * Use of this software is subject to notices and obligations set forth * in the SpeechWorks Public License - Software Version 1.1 which is * included with this software. * * SpeechWorks is a registered trademark, and SpeechWorks Here, * DialogModules and the SpeechWorks logo are trademarks of SpeechWorks * International, Inc. in the United States and other countries. * ************************************************************************ */static const char *rcsid = 0 ? (char *) &rcsid :"$Id: JsiRuntime.cpp,v 1.11.6.1 2001/10/03 16:20:52 dmeyer Exp $";// -----1=0-------2=0-------3=0-------4=0-------5=0-------6=0-------7=0-------8#include "SBjsiInternal.h"#ifndef JS_THREADSAFE#include "VXItrd.h" // For VXItrdMutex object and functions#endif#include "SBjsiLog.h" // For logging#include "JsiRuntime.hpp" // Defines this class#include <jsapi.h> // SpiderMonkey JavaScript API// -----1=0-------2=0-------3=0-------4=0-------5=0-------6=0-------7=0-------8// Constructor, only does initialization that cannot failJsiRuntime::JsiRuntime( ) : SBinetLogger(MODULE_SBJSI, NULL, 0), runtime(NULL)#ifndef JS_THREADSAFE , mutex(NULL)#endif{}// DestructorJsiRuntime::~JsiRuntime( ){ // Destroy the runtime if ( runtime ) JS_DestroyRuntime (runtime);#ifndef JS_THREADSAFE // Destroy the mutex if ( mutex ) VXItrdMutexDestroy (&mutex);#endif}// Creation methodVXIjsiResult JsiRuntime::Create (long runtimeSize, VXIlogInterface *l, VXIunsigned diagTagBase){ if (( runtimeSize < 1 ) || ( ! l )) return VXIjsi_RESULT_INVALID_ARGUMENT; // Initialize the logging base class SetLog (l, diagTagBase); VXIjsiResult rc = VXIjsi_RESULT_SUCCESS;#ifndef JS_THREADSAFE // Create the mutex if ( VXItrdMutexCreate (&mutex) != VXItrd_RESULT_SUCCESS ) rc = VXIjsi_RESULT_SYSTEM_ERROR;#endif if ( rc == VXIjsi_RESULT_SUCCESS ) { // Create the runtime, must do this within a mutex to ensure // this is thread safe due to us using a non-thread safe build // of SpiderMonkey for performance reasons runtime = JS_NewRuntime (runtimeSize); if ( runtime == NULL ) { rc = VXIjsi_RESULT_OUT_OF_MEMORY; } else { // Set this as the runtime's private data JS_SetRuntimePrivate (runtime, this); // Enable garbage collection tracking JS_SetGCCallbackRT (runtime, JsiRuntime::GCCallback); } } return rc;}// Get a new JavaScript context for the runtimeVXIjsiResult JsiRuntime::NewContext (long contextSize, JSContext **context){ if (( contextSize < 1 ) || ( context == NULL )) return VXIjsi_RESULT_INVALID_ARGUMENT;#ifndef JS_THREADSAFE if ( AccessBegin( ) == false ) return VXIjsi_RESULT_SYSTEM_ERROR;#endif // Create the context JSContext *newContext = JS_NewContext (runtime, contextSize); if ( newContext == NULL ) return VXIjsi_RESULT_OUT_OF_MEMORY;#ifndef JS_THREADSAFE if ( AccessEnd( ) == false ) { DestroyContext (&newContext); return VXIjsi_RESULT_SYSTEM_ERROR; }#endif *context = newContext; return VXIjsi_RESULT_SUCCESS;}// Destroy a JavaScript context for the runtimeVXIjsiResult JsiRuntime::DestroyContext (JSContext **context){ if (( context == NULL ) || ( *context == NULL )) return VXIjsi_RESULT_INVALID_ARGUMENT;#ifndef JS_THREADSAFE if ( AccessBegin( ) == false ) return VXIjsi_RESULT_SYSTEM_ERROR;#endif // Destroy the context JS_DestroyContext (*context);#ifndef JS_THREADSAFE if ( AccessEnd( ) == false ) return VXIjsi_RESULT_SYSTEM_ERROR;#endif *context = NULL; return VXIjsi_RESULT_SUCCESS;}#ifndef JS_THREADSAFE// Flag that we are beginning and ending access of a context within// this runtime, used to ensure thread safety. For simplicity,// return true on success, false on failure (mutex error).bool JsiRuntime::AccessBegin( ) const{ return (VXItrdMutexLock (mutex) == VXItrd_RESULT_SUCCESS ? true : false);}bool JsiRuntime::AccessEnd( ) const{ return (VXItrdMutexUnlock (mutex) == VXItrd_RESULT_SUCCESS ? true : false);}#endif /* JS_THREADSAFE */// Static callback for diagnostic logging of garbage collectionJSBool JS_DLL_CALLBACK JsiRuntime::GCCallback (JSContext *context, JSGCStatus status){ JSBool rc = JS_TRUE; // Get the runtime, then this runtime object JSRuntime *rt = JS_GetRuntime (context); if ( rt == NULL ) { rc = JS_FALSE; // Fatal error } else { const JsiRuntime *pThis = (const JsiRuntime *) JS_GetRuntimePrivate (rt); if ( pThis == NULL ) { return JS_FALSE; // Fatal error } else { // Log the garbage collection state switch (status) { case JSGC_BEGIN: pThis->Diag (SBJSI_LOG_GC, NULL, L"begin 0x%p", context); break; case JSGC_END: pThis->Diag (SBJSI_LOG_GC, NULL, L"end 0x%p", context); break; case JSGC_MARK_END: // Diag (SBJSI_LOG_GC, NULL, L"mark end 0x%p", context); break; default: pThis->Diag (SBJSI_LOG_GC, NULL, L"unknown %d 0x%p", status, context); break; } } } return rc;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -