static void SetContextOptions(JSContext *cx) { jsuword stackLimit; if (gMaxStackSize == 0) { /* * Disable checking for stack overflow if limit is zero. */ stackLimit = 0; } else { #if JS_STACK_GROWTH_DIRECTION > 0 stackLimit = gStackBase + gMaxStackSize; #else stackLimit = gStackBase - gMaxStackSize; #endif } JS_SetThreadStackLimit(cx, stackLimit); JS_SetScriptStackQuota(cx, gScriptStackQuota); }
ContextCallback(JSContext *cx, uintN operation) { XPCJSRuntime* self = nsXPConnect::GetRuntime(); if (self) { if (operation == JSCONTEXT_NEW) { // Set the limits on the native and script stack space. XPCPerThreadData* tls = XPCPerThreadData::GetData(cx); if(tls) { JS_SetThreadStackLimit(cx, tls->GetStackLimit()); } JS_SetScriptStackQuota(cx, 100*1024*1024); } } return gOldJSContextCallback ? gOldJSContextCallback(cx, operation) : JS_TRUE; }
nsresult mozJSComponentLoader::ReallyInit() { nsresult rv; /* * Get the JSRuntime from the runtime svc, if possible. * We keep a reference around, because it's a Bad Thing if the runtime * service gets shut down before we're done. Bad! */ mRuntimeService = do_GetService(kJSRuntimeServiceContractID, &rv); if (NS_FAILED(rv) || NS_FAILED(rv = mRuntimeService->GetRuntime(&mRuntime))) return rv; // Create our compilation context. mContext = JS_NewContext(mRuntime, 256); if (!mContext) return NS_ERROR_OUT_OF_MEMORY; uint32 options = JS_GetOptions(mContext); JS_SetOptions(mContext, options | JSOPTION_XML); // Always use the latest js version JS_SetVersion(mContext, JSVERSION_LATEST); // Limit C stack consumption to a reasonable 512K int stackDummy; const jsuword kStackSize = 0x80000; jsuword stackLimit, currentStackAddr = (jsuword)&stackDummy; #if JS_STACK_GROWTH_DIRECTION < 0 stackLimit = (currentStackAddr > kStackSize) ? currentStackAddr - kStackSize : 0; #else stackLimit = (currentStackAddr + kStackSize > currentStackAddr) ? currentStackAddr + kStackSize : (jsuword) -1; #endif JS_SetThreadStackLimit(mContext, stackLimit); #ifndef XPCONNECT_STANDALONE nsCOMPtr<nsIScriptSecurityManager> secman = do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID); if (!secman) return NS_ERROR_FAILURE; rv = secman->GetSystemPrincipal(getter_AddRefs(mSystemPrincipal)); if (NS_FAILED(rv) || !mSystemPrincipal) return NS_ERROR_FAILURE; #endif if (!mModules.Init(32)) return NS_ERROR_OUT_OF_MEMORY; if (!mImports.Init(32)) return NS_ERROR_OUT_OF_MEMORY; if (!mInProgressImports.Init(32)) return NS_ERROR_OUT_OF_MEMORY; // Set up our fastload file nsCOMPtr<nsIFastLoadService> flSvc = do_GetFastLoadService(&rv); if (NS_SUCCEEDED(rv)) rv = flSvc->NewFastLoadFile("XPC", getter_AddRefs(mFastLoadFile)); if (NS_FAILED(rv)) { LOG(("Could not get fastload file location\n")); } // Listen for xpcom-shutdown so that we can close out our fastload file // at that point (after that we can no longer create an input stream). nsCOMPtr<nsIObserverService> obsSvc = do_GetService(kObserverServiceContractID, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = obsSvc->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, PR_FALSE); NS_ENSURE_SUCCESS(rv, rv); rv = obsSvc->AddObserver(this, "xpcom-shutdown-loaders", PR_FALSE); NS_ENSURE_SUCCESS(rv, rv); #ifdef DEBUG_shaver_off fprintf(stderr, "mJCL: ReallyInit success!\n"); #endif mInitialized = PR_TRUE; return NS_OK; }