/* nsIStackFrame GetStack (); */ NS_IMETHODIMP xpctestEcho::GetStack(nsIStackFrame **_retval) { nsIStackFrame* stack = nsnull; if(!_retval) return NS_ERROR_NULL_POINTER; nsresult rv; nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID(), &rv)); if(NS_SUCCEEDED(rv)) { nsIStackFrame* jsstack; if(NS_SUCCEEDED(xpc->GetCurrentJSStack(&jsstack)) && jsstack) { xpc->CreateStackFrameLocation(nsIProgrammingLanguage::CPLUSPLUS, __FILE__, "xpctestEcho::GetStack", __LINE__, jsstack, &stack); NS_RELEASE(jsstack); } } if(stack) { *_retval = stack; return NS_OK; } return NS_ERROR_FAILURE; }
/* void DebugDumpJSStack (); */ NS_IMETHODIMP xpctestEcho::DebugDumpJSStack() { nsresult rv; nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID(), &rv)); if(NS_SUCCEEDED(rv)) { rv = xpc->DebugDumpJSStack(JS_TRUE, JS_TRUE, JS_TRUE); } return rv; }
nsresult xgGtkElement::DefineProperties () { nsresult rv; JSContext *jscx; rv = GetJSContext (&jscx); NS_ENSURE_SUCCESS (rv, rv); nsCOMPtr<nsIXPConnect> xpc (do_GetService ("@mozilla.org/js/xpc/XPConnect;1", &rv)); NS_ENSURE_SUCCESS (rv, rv); nsCOMPtr<nsIDOMElement> elem; rv = mWrapper->GetElementNode (getter_AddRefs (elem)); NS_ENSURE_SUCCESS (rv, rv); nsCOMPtr<nsIXPConnectJSObjectHolder> jswrapper; rv = xpc->WrapNative (jscx, JS_GetGlobalObject (jscx), elem, NS_GET_IID (nsISupports), getter_AddRefs (jswrapper)); NS_ENSURE_SUCCESS (rv, rv); JSObject *jsobj; rv = jswrapper->GetJSObject (&jsobj); NS_ENSURE_SUCCESS (rv, rv); g_message (GOM_LOC ("Got JSObject: %p"), (void *)jsobj); guint n_properties; GParamSpec **props = g_object_class_list_properties (G_OBJECT_GET_CLASS (mObject), &n_properties); g_message (GOM_LOC ("Adding %d properties from %s"), n_properties, G_OBJECT_TYPE_NAME (mObject)); JS_BeginRequest (jscx); const char *camelName; for (guint i = 0; i < n_properties; i++) { camelName = gom_camel_case (props[i]->name); if (!JS_DefineProperty (jscx, jsobj, camelName, JSVAL_VOID, xgGObject::GetProperty, xgGObject::SetProperty, JSPROP_ENUMERATE | JSPROP_PERMANENT)) { g_printerr ("Could not define a property for %s\n", camelName); } else { g_print (GOM_LOC ("Defined property: %s.%s\n"), G_OBJECT_TYPE_NAME (mObject), camelName); } GOM_CAMEL_FREE (camelName, props[i]->name); } JS_EndRequest (jscx); return NS_OK; }
static void ShowXPCException() { nsresult rv; nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID(), &rv)); if(NS_SUCCEEDED(rv) && xpc) { nsCOMPtr<nsIException> e; xpc->GetPendingException(getter_AddRefs(e)); if(e) { char* str; rv = e->ToString(&str); if(NS_SUCCEEDED(rv) && str) { printf(str); printf("\n"); nsMemory::Free(str); nsresult res; e->GetResult(&res); if(res == NS_ERROR_XPC_JAVASCRIPT_ERROR_WITH_DETAILS) { nsCOMPtr<nsISupports> data; e->GetData(getter_AddRefs(data)); if(data) { nsCOMPtr<nsIScriptError> report = do_QueryInterface(data); if(report) { nsCAutoString str2; rv = report->ToString(str2); if(NS_SUCCEEDED(rv)) { printf("%s\n", str2.get()); } } } else printf("can't get data for pending XPC exception\n"); } } else printf("can't get string for pending XPC exception\n"); } else printf("no pending XPC exception\n"); } else printf("can't get xpconnect\n"); }
// static already_AddRefed<nsIXPConnect> Service::getXPConnect() { NS_PRECONDITION(NS_IsMainThread(), "Must only get XPConnect on the main thread!"); NS_PRECONDITION(gService, "Can not get XPConnect without an instance of our service!"); // If we've been shutdown, sXPConnect will be null. To prevent leaks, we do // not cache the service after this point. nsCOMPtr<nsIXPConnect> xpc(sXPConnect); if (!xpc) xpc = do_GetService(nsIXPConnect::GetCID()); NS_ASSERTION(xpc, "Could not get XPConnect!"); return xpc.forget(); }
nsresult StatementJSHelper::getParams(Statement *aStatement, JSContext *aCtx, JSObject *aScopeObj, JS::Value *_params) { MOZ_ASSERT(NS_IsMainThread()); nsresult rv; #ifdef DEBUG int32_t state; (void)aStatement->GetState(&state); NS_ASSERTION(state == mozIStorageStatement::MOZ_STORAGE_STATEMENT_READY, "Invalid state to get the params object - all calls will fail!"); #endif if (!aStatement->mStatementParamsHolder) { JS::RootedObject scope(aCtx, aScopeObj); nsCOMPtr<mozIStorageStatementParams> params = new StatementParams(aStatement); NS_ENSURE_TRUE(params, NS_ERROR_OUT_OF_MEMORY); nsCOMPtr<nsIXPConnectJSObjectHolder> holder; nsCOMPtr<nsIXPConnect> xpc(Service::getXPConnect()); rv = xpc->WrapNativeHolder( aCtx, ::JS_GetGlobalForObject(aCtx, scope), params, NS_GET_IID(mozIStorageStatementParams), getter_AddRefs(holder) ); NS_ENSURE_SUCCESS(rv, rv); RefPtr<StatementParamsHolder> paramsHolder = new StatementParamsHolder(holder); aStatement->mStatementParamsHolder = new nsMainThreadPtrHolder<nsIXPConnectJSObjectHolder>(paramsHolder); } JS::Rooted<JSObject*> obj(aCtx); obj = aStatement->mStatementParamsHolder->GetJSObject(); NS_ENSURE_STATE(obj); _params->setObject(*obj); return NS_OK; }
nsresult StatementJSHelper::getParams(Statement *aStatement, JSContext *aCtx, JSObject *aScopeObj, jsval *_params) { nsresult rv; #ifdef DEBUG PRInt32 state; (void)aStatement->GetState(&state); NS_ASSERTION(state == mozIStorageStatement::MOZ_STORAGE_STATEMENT_READY, "Invalid state to get the params object - all calls will fail!"); #endif if (!aStatement->mStatementParamsHolder) { nsCOMPtr<mozIStorageStatementParams> params = new StatementParams(aStatement); NS_ENSURE_TRUE(params, NS_ERROR_OUT_OF_MEMORY); nsCOMPtr<nsIXPConnect> xpc(Service::getXPConnect()); rv = xpc->WrapNative( aCtx, ::JS_GetGlobalForObject(aCtx, aScopeObj), params, NS_GET_IID(mozIStorageStatementParams), getter_AddRefs(aStatement->mStatementParamsHolder) ); NS_ENSURE_SUCCESS(rv, rv); } JSObject *obj = nullptr; rv = aStatement->mStatementParamsHolder->GetJSObject(&obj); NS_ENSURE_SUCCESS(rv, rv); *_params = OBJECT_TO_JSVAL(obj); return NS_OK; }
int main() { JSRuntime *rt; JSContext *jscontext; JSObject *glob; nsresult rv; gErrFile = stderr; gOutFile = stdout; { nsCOMPtr<nsIServiceManager> servMan; NS_InitXPCOM2(getter_AddRefs(servMan), nsnull, nsnull); // get the JSRuntime from the runtime svc, if possible nsCOMPtr<nsIJSRuntimeService> rtsvc = do_GetService("@mozilla.org/js/xpc/RuntimeService;1", &rv); if(NS_FAILED(rv) || NS_FAILED(rtsvc->GetRuntime(&rt)) || !rt) DIE("FAILED to get a JSRuntime"); jscontext = JS_NewContext(rt, 8192); if(!jscontext) DIE("FAILED to create a JSContext"); JS_SetErrorReporter(jscontext, my_ErrorReporter); nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID(), &rv)); if(!xpc) DIE("FAILED to get xpconnect service\n"); nsCOMPtr<nsIJSContextStack> cxstack = do_GetService("@mozilla.org/js/xpc/ContextStack;1", &rv); if(NS_FAILED(rv)) DIE("FAILED to get the nsThreadJSContextStack service!\n"); if(NS_FAILED(cxstack->Push(jscontext))) DIE("FAILED to push the current jscontext on the nsThreadJSContextStack service!\n"); // XXX I'd like to replace this with code that uses a wrapped xpcom object // as the global object. The old TextXPC did this. The support for this // is not working now in the new xpconnect code. { JSAutoRequest ar(jscontext); glob = JS_NewCompartmentAndGlobalObject(jscontext, &global_class, NULL); if (!glob) DIE("FAILED to create global object"); JSAutoEnterCompartment ac; if (!ac.enter(jscontext, glob)) DIE("FAILED to enter compartment"); if (!JS_InitStandardClasses(jscontext, glob)) DIE("FAILED to init standard classes"); if (!JS_DefineFunctions(jscontext, glob, glob_functions)) DIE("FAILED to define global functions"); if (NS_FAILED(xpc->InitClasses(jscontext, glob))) DIE("FAILED to init xpconnect classes"); } /**********************************************/ // run the tests... TestCategoryManmager(); TestSecurityManager(jscontext, glob, xpc); TestArgFormatter(jscontext, glob, xpc); TestThreadJSContextStack(jscontext); /**********************************************/ if(NS_FAILED(cxstack->Pop(nsnull))) DIE("FAILED to pop the current jscontext from the nsThreadJSContextStack service!\n"); { JSAutoRequest ar(jscontext); JS_ClearScope(jscontext, glob); JS_GC(jscontext); JS_GC(jscontext); } JS_DestroyContext(jscontext); xpc->DebugDump(4); cxstack = nsnull; // release service held by nsCOMPtr xpc = nsnull; // release service held by nsCOMPtr rtsvc = nsnull; // release service held by nsCOMPtr } rv = NS_ShutdownXPCOM( NULL ); NS_ASSERTION(NS_SUCCEEDED(rv), "NS_ShutdownXPCOM FAILED"); return 0; }
NS_IMETHODIMP nsHTTPIndex::OnStartRequest(nsIRequest *request, nsISupports* aContext) { nsresult rv; mParser = do_CreateInstance(NS_DIRINDEXPARSER_CONTRACTID, &rv); if (NS_FAILED(rv)) return rv; rv = mParser->SetEncoding(mEncoding.get()); if (NS_FAILED(rv)) return rv; rv = mParser->SetListener(this); if (NS_FAILED(rv)) return rv; rv = mParser->OnStartRequest(request,aContext); if (NS_FAILED(rv)) return rv; // This should only run once... // Unless we don't have a container to start with // (ie called from bookmarks as an rdf datasource) if (mBindToGlobalObject && mRequestor) { mBindToGlobalObject = PR_FALSE; // Now get the content viewer container's script object. nsCOMPtr<nsIScriptGlobalObject> scriptGlobal(do_GetInterface(mRequestor)); NS_ENSURE_TRUE(scriptGlobal, NS_ERROR_FAILURE); nsIScriptContext *context = scriptGlobal->GetContext(); NS_ENSURE_TRUE(context, NS_ERROR_FAILURE); JSContext* cx = reinterpret_cast<JSContext*> (context->GetNativeContext()); JSObject* global = JS_GetGlobalObject(cx); // Using XPConnect, wrap the HTTP index object... static NS_DEFINE_CID(kXPConnectCID, NS_XPCONNECT_CID); nsCOMPtr<nsIXPConnect> xpc(do_GetService(kXPConnectCID, &rv)); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsIXPConnectJSObjectHolder> wrapper; rv = xpc->WrapNative(cx, global, static_cast<nsIHTTPIndex*>(this), NS_GET_IID(nsIHTTPIndex), getter_AddRefs(wrapper)); NS_ASSERTION(NS_SUCCEEDED(rv), "unable to xpconnect-wrap http-index"); if (NS_FAILED(rv)) return rv; JSObject* jsobj; rv = wrapper->GetJSObject(&jsobj); NS_ASSERTION(NS_SUCCEEDED(rv), "unable to get jsobj from xpconnect wrapper"); if (NS_FAILED(rv)) return rv; jsval jslistener = OBJECT_TO_JSVAL(jsobj); // ...and stuff it into the global context PRBool ok; JSAutoRequest ar(cx); ok = JS_SetProperty(cx, global, "HTTPIndex", &jslistener); NS_ASSERTION(ok, "unable to set Listener property"); if (! ok) return NS_ERROR_FAILURE; } if (!aContext) { nsCOMPtr<nsIChannel> channel(do_QueryInterface(request)); NS_ASSERTION(channel, "request should be a channel"); // lets hijack the notifications: channel->SetNotificationCallbacks(this); // now create the top most resource nsCOMPtr<nsIURI> uri; channel->GetURI(getter_AddRefs(uri)); nsCAutoString entryuriC; uri->GetSpec(entryuriC); nsCOMPtr<nsIRDFResource> entry; rv = mDirRDF->GetResource(entryuriC, getter_AddRefs(entry)); NS_ConvertUTF8toUTF16 uriUnicode(entryuriC); nsCOMPtr<nsIRDFLiteral> URLVal; rv = mDirRDF->GetLiteral(uriUnicode.get(), getter_AddRefs(URLVal)); Assert(entry, kNC_URL, URLVal, PR_TRUE); mDirectory = do_QueryInterface(entry); } else { // Get the directory from the context mDirectory = do_QueryInterface(aContext); } if (!mDirectory) { request->Cancel(NS_BINDING_ABORTED); return NS_BINDING_ABORTED; } // Mark the directory as "loading" rv = Assert(mDirectory, kNC_Loading, kTrueLiteral, PR_TRUE); if (NS_FAILED(rv)) return rv; return NS_OK; }
/* void CompileFile (in nsILocalFile aFile, in PRBool strict); */ NS_IMETHODIMP nsXPCToolsCompiler::CompileFile(nsILocalFile *aFile, PRBool strict) { // use the xpccallcontext stuff to get the current JSContext // get the xpconnect service nsresult rv; nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID(), &rv)); if(NS_FAILED(rv)) return NS_ERROR_FAILURE; // get the xpconnect native call context nsCOMPtr<nsIXPCNativeCallContext> callContext; xpc->GetCurrentNativeCallContext(getter_AddRefs(callContext)); if(!callContext) return NS_ERROR_FAILURE; // verify that we are being called from JS (i.e. the current call is // to this object - though we don't verify that it is to this exact method) nsCOMPtr<nsISupports> callee; callContext->GetCallee(getter_AddRefs(callee)); if(!callee || callee.get() != (nsISupports*)this) return NS_ERROR_FAILURE; // Get JSContext of current call JSContext* cx; rv = callContext->GetJSContext(&cx); if(NS_FAILED(rv) || !cx) return NS_ERROR_FAILURE; FILE* handle; if(NS_FAILED(aFile->OpenANSIFileDesc("r", &handle))) return NS_ERROR_FAILURE; JSObject* glob = JS_NewObject(cx, &global_class, NULL, NULL); if (!glob) return NS_ERROR_FAILURE; if (!JS_InitStandardClasses(cx, glob)) return NS_ERROR_FAILURE; nsCAutoString path; if(NS_FAILED(aFile->GetNativePath(path))) return NS_ERROR_FAILURE; uint32 oldoptions = JS_GetOptions(cx); JS_SetOptions(cx, JSOPTION_WERROR | (strict ? JSOPTION_STRICT : 0)); JSErrorReporter older = JS_SetErrorReporter(cx, ErrorReporter); JSExceptionState *es =JS_SaveExceptionState(cx); if(!JS_CompileFileHandle(cx, glob, path.get(), handle)) { jsval v; JSErrorReport* report; if(JS_GetPendingException(cx, &v) && nsnull != (report = JS_ErrorFromException(cx, v))) { JSString* str; const char* msg = "Error"; str = JS_ValueToString(cx, v); if(str) msg = JS_GetStringBytes(str); printf("%s [%s,%d]\n\n", msg, report->filename, (int)report->lineno); } else { printf("no script and no error report!\n"); } } JS_RestoreExceptionState(cx, es); JS_SetErrorReporter(cx, older); JS_SetOptions(cx, oldoptions); return NS_OK; }
void xgamc(int index, int *nerr) { /*===================================================================== * PURPOSE: To execute a MOD command given its index number. *===================================================================== * INPUT ARGUMENTS: * INDEX: The index number of the command. *===================================================================== * OUTPUT ARGUMENTS: * NERR: Error flag. Set to 0 if no error occurred. * Potential error numbers: 0901. *===================================================================== * MODULE/LEVEL: GAM/1 *===================================================================== * GLOBAL INPUT: * MACH: *===================================================================== * GLOBAL OUTPUT: * GAM: LRTWXL, KRTWXL, ORTWXL *===================================================================== * SUBROUTINES CALLED: * SACLIB: GTOUTM, XP, XP1, XP2, XPPK, XPC, XFID, XPICKS, XPLOTPM *===================================================================== * MODIFICATION HISTORY: * 970204: Added FILENUMBER to allow or disallow file number * display. maf * 890421: Added PLOTXY command. * 870728: Moved XLIM and YLIM commands from GEM. * 870420: Added SETDEVICE command. * 861203: Added PLOTPM command. * 830105: Deleted PUSER command. * 821228: Added FILEID and PICKS commands. Deleted DISPLAY command. * 821005: Added PLOTC command. * 820825: Original version. *===================================================================== */ /* PROCEDURE: */ *nerr = 0; /* - Jump to correct command based upon its index number. */ switch( index ){ case 1: goto L_100; case 2: goto L_200; case 3: goto L_300; case 4: goto L_400; case 5: goto L_500; case 6: goto L_600; case 7: goto L_700; case 8: goto L_800; case 9: goto L_900; case 10: goto L_1000; case 11: goto L_1100; case 12: goto L_1200; case 13: goto L_1300; case 14: goto L_1400; case 15: goto L_1500; case 16: goto L_1600; /* added for FILENUMBER. maf 970204 */ case 17: goto L_1700; /* added for PRINT. maf 990422 */ case 18: goto L_1800; } /* - Error return if bad index value. */ *nerr = 901; setmsg( "ERROR", *nerr ); apcmsg( "in XGAMC",9 ); goto L_8888; L_100: /* - Command 01: PLOT */ xp( nerr ); goto L_8888; L_200: /* - Command 02: PLOT1 */ xp1( nerr ); goto L_8888; L_300: /* - Command 03: PLOT2 */ xp2( nerr ); goto L_8888; L_400: /* - Command 04: PLOTPK */ xppk( nerr ); goto L_8888; L_500: /* - Command 05: PLOTC */ xpc( nerr ); goto L_8888; L_600: /* - Command 06: FILEID */ xfid( nerr ); goto L_8888; L_700: /* - Command 07: PICKS */ xpicks( nerr ); goto L_8888; L_800: /* - Command 08: PLOTPM */ xplotpm( nerr ); goto L_8888; L_900: /* - Command 09: SETDEVICE */ xsetdevice( nerr ); goto L_8888; L_1000: /* - Command 10: XLIM */ xcrtw( &cmgam.lrtwxl, (char*)kmgam.krtwxl,9, cmgam.ortwxl, nerr ); goto L_8888; L_1100: /* - Command 11: YLIM */ xylim( nerr ); goto L_8888; L_1200: /* - Command 12: PLOTXY */ xplotxy( nerr ); goto L_8888; L_1300: /* - Command 13: FITXY */ xfitxy( nerr ); goto L_8888; L_1400: /* - Command 14: PLOTDY */ xplotdy( nerr ); goto L_8888; L_1500: /* - Command 15: PLOTALPHA */ xplotalpha( nerr ); goto L_8888; L_1600: /* - Command 16: FILENUMBER */ xfilenumber ( nerr ) ; goto L_8888 ; L_1700: /* - Command 17: PRINT */ xprint ( nerr ) ; goto L_8888 ; L_1800: xsave( ); goto L_8888; L_8888: return; } /* end of function */