AppendUTF16toUTF8(NS_REINTERPRET_CAST(const PRUnichar*, report->ucmessage), error);
if (report->ucmessage) { AppendUTF16toUTF8(NS_REINTERPRET_CAST(const PRUnichar*, report->ucmessage), error); } else { error.Append(message); }
NS_ScriptErrorReporter(JSContext *cx,                       const char *message,                       JSErrorReport *report){  // XXX this means we are not going to get error reports on non DOM contexts  nsIScriptContext *context = nsJSUtils::GetDynamicScriptContext(cx);  nsEventStatus status = nsEventStatus_eIgnore;  if (context) {    nsIScriptGlobalObject *globalObject = context->GetGlobalObject();    if (globalObject) {      nsAutoString fileName, msg;      if (report) {        fileName.AssignWithConversion(report->filename);        const PRUnichar *m = NS_REINTERPRET_CAST(const PRUnichar*,                                                 report->ucmessage);        if (m) {          msg.Assign(m);        }      }      if (msg.IsEmpty() && message) {        msg.AssignWithConversion(message);      }      // First, notify the DOM that we have a script error.      /* We do not try to report Out Of Memory via a dom       * event because the dom event handler would encounter       * an OOM exception trying to process the event, and       * then we'd need to generate a new OOM event for that       * new OOM instance -- this isn't pretty.       */      nsIDocShell *docShell = globalObject->GetDocShell();      if (docShell &&          (!report ||           (report->errorNumber != JSMSG_OUT_OF_MEMORY &&            !JSREPORT_IS_WARNING(report->flags)))) {        static PRInt32 errorDepth; // Recursion prevention        ++errorDepth;        nsCOMPtr<nsPresContext> presContext;        docShell->GetPresContext(getter_AddRefs(presContext));        if (presContext && errorDepth < 2) {          nsScriptErrorEvent errorevent(PR_TRUE, NS_SCRIPT_ERROR);          errorevent.fileName = fileName.get();          errorevent.errorMsg = msg.get();          errorevent.lineNr = report ? report->lineno : 0;          // HandleDOMEvent() must be synchronous for the recursion block          // (errorDepth) to work.          globalObject->HandleDOMEvent(presContext, &errorevent, nsnull,                                       NS_EVENT_FLAG_INIT, &status);        }        --errorDepth;      }      if (status != nsEventStatus_eConsumeNoDefault) {        // Make an nsIScriptError and populate it with information from        // this error.        nsCOMPtr<nsIScriptError> errorObject =          do_CreateInstance("@mozilla.org/scripterror;1");        if (errorObject != nsnull) {          nsresult rv;          const char *category = nsnull;          // Set category to XUL or content, if possible.          if (docShell) {            nsCOMPtr<nsIDocShellTreeItem> docShellTI(do_QueryInterface(docShell, &rv));            if (NS_SUCCEEDED(rv) && docShellTI) {              PRInt32 docShellType;              rv = docShellTI->GetItemType(&docShellType);              if (NS_SUCCEEDED(rv)) {                category = docShellType == nsIDocShellTreeItem::typeChrome                  ? "chrome javascript"                  : "content javascript";              }            }          }          if (report) {            PRUint32 column = report->uctokenptr - report->uclinebuf;            rv = errorObject->Init(msg.get(), fileName.get(),                                   NS_REINTERPRET_CAST(const PRUnichar*,                                                       report->uclinebuf),                                   report->lineno, column, report->flags,                                   category);          } else if (message) {            rv = errorObject->Init(msg.get(), nsnull, nsnull, 0, 0, 0,                                   category);          }          if (NS_SUCCEEDED(rv)) {            nsCOMPtr<nsIConsoleService> consoleService =              do_GetService(NS_CONSOLESERVICE_CONTRACTID, &rv);            if (NS_SUCCEEDED(rv)) {              consoleService->LogMessage(errorObject);            }          }        }      }    }  }#ifdef DEBUG  // Print it to stderr as well, for the benefit of those invoking  // mozilla with -console.  nsCAutoString error;  error.Assign("JavaScript ");  if (!report) {    error.Append("[no report]: ");    error.Append(message);  } else {    if (JSREPORT_IS_STRICT(report->flags))      error.Append("strict ");    if (JSREPORT_IS_WARNING(report->flags))      error.Append("warning: ");    else      error.Append("error: ");    error.Append(report->filename);    error.Append(", line ");    error.AppendInt(report->lineno, 10);    error.Append(": ");    AppendUTF16toUTF8(NS_REINTERPRET_CAST(const PRUnichar*, report->ucmessage),                      error);    if (status != nsEventStatus_eIgnore && !JSREPORT_IS_WARNING(report->flags))      error.Append(" Error was suppressed by event handler\n");  }  fprintf(stderr, "%s\n", error.get());  fflush(stderr);#endif#ifdef PR_LOGGING  if (report) {    if (!gJSDiagnostics)      gJSDiagnostics = PR_NewLogModule("JSDiagnostics");    if (gJSDiagnostics) {      PR_LOG(gJSDiagnostics,             JSREPORT_IS_WARNING(report->flags) ? PR_LOG_WARNING : PR_LOG_ERROR,             ("file %s, line %u: %s\n%s%s",              report->filename, report->lineno, message,              report->linebuf ? report->linebuf : "",              (report->linebuf &&               report->linebuf[strlen(report->linebuf)-1] != '\n')              ? "\n"              : ""));    }  }#endif  // XXX do we really want to be doing this?  ::JS_ClearPendingException(cx);}