JSBool JetpackChild::CallMessage(JSContext* cx, uintN argc, jsval* vp) { MessageResult smr; if (!MessageCommon(cx, argc, vp, &smr)) return JS_FALSE; InfallibleTArray<Variant> results; if (!GetThis(cx)->CallCallMessage(smr.msgName, smr.data, &results)) { JS_ReportError(cx, "Failed to callMessage"); return JS_FALSE; } nsAutoTArray<jsval, 4> jsvals; jsval* rvals = jsvals.AppendElements(results.Length()); if (!rvals) { JS_ReportOutOfMemory(cx); return JS_FALSE; } for (PRUint32 i = 0; i < results.Length(); ++i) rvals[i] = JSVAL_VOID; js::AutoArrayRooter root(cx, results.Length(), rvals); for (PRUint32 i = 0; i < results.Length(); ++i) if (!jsval_from_Variant(cx, results.ElementAt(i), rvals + i)) { JS_ReportError(cx, "Invalid result from handler %d", i); return JS_FALSE; } JSObject* arrObj = JS_NewArrayObject(cx, results.Length(), rvals); if (!arrObj) { JS_ReportOutOfMemory(cx); return JS_FALSE; } JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(arrObj)); return JS_TRUE; }