enum reflectStatus ReflectHistogramSnapshot(JSContext *cx, JSObject *obj, Histogram *h) { Histogram::SampleSet ss; h->SnapshotSample(&ss); // We don't want to reflect corrupt histograms. if (h->FindCorruption(ss) != Histogram::NO_INCONSISTENCIES) { return REFLECT_CORRUPT; } JSObject *counts_array; JSObject *rarray; const size_t count = h->bucket_count(); if (!(JS_DefineProperty(cx, obj, "min", INT_TO_JSVAL(h->declared_min()), NULL, NULL, JSPROP_ENUMERATE) && JS_DefineProperty(cx, obj, "max", INT_TO_JSVAL(h->declared_max()), NULL, NULL, JSPROP_ENUMERATE) && JS_DefineProperty(cx, obj, "histogram_type", INT_TO_JSVAL(h->histogram_type()), NULL, NULL, JSPROP_ENUMERATE) && JS_DefineProperty(cx, obj, "sum", DOUBLE_TO_JSVAL(ss.sum()), NULL, NULL, JSPROP_ENUMERATE) && (rarray = JS_NewArrayObject(cx, count, NULL)) && JS_DefineProperty(cx, obj, "ranges", OBJECT_TO_JSVAL(rarray), NULL, NULL, JSPROP_ENUMERATE) && FillRanges(cx, rarray, h) && (counts_array = JS_NewArrayObject(cx, count, NULL)) && JS_DefineProperty(cx, obj, "counts", OBJECT_TO_JSVAL(counts_array), NULL, NULL, JSPROP_ENUMERATE) )) { return REFLECT_FAILURE; } for (size_t i = 0; i < count; i++) { if (!JS_DefineElement(cx, counts_array, i, INT_TO_JSVAL(ss.counts(i)), NULL, NULL, JSPROP_ENUMERATE)) { return REFLECT_FAILURE; } } return REFLECT_OK; }
bool FillRanges(JSContext *cx, JSObject *array, Histogram *h) { for (size_t i = 0; i < h->bucket_count(); i++) { if (!JS_DefineElement(cx, array, i, INT_TO_JSVAL(h->ranges(i)), NULL, NULL, JSPROP_ENUMERATE)) return false; } return true; }
static JSBool rpmmg_enumerate(JSContext *cx, JSObject *obj, JSIterateOp op, jsval *statep, jsid *idp) { #ifdef NOTYET void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmgClass, NULL); rpmmg mg = ptr; struct dirent * dp; unsigned int ix = 0; #endif _ENUMERATE_DEBUG_ENTRY(_debug < 0); #ifdef NOTYET switch (op) { case JSENUMERATE_INIT: if (idp) *idp = JSVAL_ZERO; *statep = INT_TO_JSVAL(ix); if (_debug) fprintf(stderr, "\tINIT mg %p\n", mg); break; case JSENUMERATE_NEXT: ix = JSVAL_TO_INT(*statep); if ((dp = Readdir(dir)) != NULL) { (void) JS_DefineElement(cx, obj, ix, STRING_TO_JSVAL(JS_NewStringCopyZ(cx, dp->d_name)), NULL, NULL, JSPROP_ENUMERATE); JS_ValueToId(cx, *statep, idp); if (_debug) fprintf(stderr, "\tNEXT mg %p[%u] dirent %p \"%s\"\n", mg, ix, dp, dp->d_name); *statep = INT_TO_JSVAL(ix+1); } else *idp = JSVAL_VOID; if (*idp != JSVAL_VOID) break; /*@fallthrough@*/ case JSENUMERATE_DESTROY: ix = JSVAL_TO_INT(*statep); (void) JS_DefineProperty(cx, obj, "length", INT_TO_JSVAL(ix), NULL, NULL, JSPROP_ENUMERATE); if (_debug) fprintf(stderr, "\tFINI mg %p[%u]\n", mg, ix); *statep = JSVAL_NULL; break; } #else *statep = JSVAL_NULL; #endif return JS_TRUE; }
static JSBool rpmdir_enumerate(JSContext *cx, JSObject *obj, JSIterateOp op, jsval *statep, jsid *idp) { void * ptr = JS_GetInstancePrivate(cx, obj, &rpmdirClass, NULL); DIR * dir = ptr; struct dirent * dp; unsigned int ix = 0; /* XXX VG: JS_Enumerate (jsobj.c:4211) doesn't initialize some fields. */ _ENUMERATE_DEBUG_ENTRY(_debug < 0); switch (op) { case JSENUMERATE_INIT: case JSENUMERATE_INIT_ALL: if (idp) *idp = JSVAL_ZERO; *statep = INT_TO_JSVAL(ix); if (_debug) fprintf(stderr, "\tINIT dir %p\n", dir); break; case JSENUMERATE_NEXT: ix = JSVAL_TO_INT(*statep); if ((dp = Readdir(dir)) != NULL) { (void) JS_DefineElement(cx, obj, ix, STRING_TO_JSVAL(JS_NewStringCopyZ(cx, dp->d_name)), NULL, NULL, JSPROP_ENUMERATE); JS_ValueToId(cx, *statep, idp); if (_debug) fprintf(stderr, "\tNEXT dir %p[%u] dirent %p \"%s\"\n", dir, ix, dp, dp->d_name); *statep = INT_TO_JSVAL(ix+1); } else *idp = JSVAL_VOID; if (!JSID_IS_VOID(*idp)) break; /*@fallthrough@*/ case JSENUMERATE_DESTROY: ix = JSVAL_TO_INT(*statep); (void) JS_DefineProperty(cx, obj, "length", INT_TO_JSVAL(ix), NULL, NULL, JSPROP_ENUMERATE); if (_debug) fprintf(stderr, "\tFINI dir %p[%u]\n", dir, ix); *statep = JSVAL_NULL; break; } return JS_TRUE; }
nsresult KeyPath::ToJSVal(JSContext* aCx, JS::MutableHandle<JS::Value> aValue) const { if (IsArray()) { uint32_t len = mStrings.Length(); JS::Rooted<JSObject*> array(aCx, JS_NewArrayObject(aCx, len)); if (!array) { IDB_WARNING("Failed to make array!"); return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } for (uint32_t i = 0; i < len; ++i) { JS::Rooted<JS::Value> val(aCx); nsString tmp(mStrings[i]); if (!xpc::StringToJsval(aCx, tmp, &val)) { IDB_REPORT_INTERNAL_ERR(); return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } if (!JS_DefineElement(aCx, array, i, val, JSPROP_ENUMERATE)) { IDB_REPORT_INTERNAL_ERR(); return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } } aValue.setObject(*array); return NS_OK; } if (IsString()) { nsString tmp(mStrings[0]); if (!xpc::StringToJsval(aCx, tmp, aValue)) { IDB_REPORT_INTERNAL_ERR(); return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } return NS_OK; } aValue.setNull(); return NS_OK; }
int add_domain(jsval *smtpPath, char *domain) { jsval domains; uint32_t arr_len; // Get smtpPath.domains property if (!JS_GetProperty(js_context, JSVAL_TO_OBJECT(*smtpPath), "domains", &domains)) { return -1; } // Get number of recipients if (!JS_GetArrayLength(js_context, JSVAL_TO_OBJECT(domains), &arr_len)) { return -1; } // Add recipient if (!JS_DefineElement(js_context, JSVAL_TO_OBJECT(domains), arr_len, STRING_TO_JSVAL(JS_InternString(js_context, domain)), NULL, NULL, 0)) { return -1; } return 0; }
JSBool buildNodeList(nsIDOMNodeList * nodeList, JSContext * cx, JSObject * parent, jsval * rval) { JSObject * nodeArray = JS_NewArrayObject(cx,0, NULL); if(!nodeArray) return JS_FALSE; *rval = OBJECT_TO_JSVAL(nodeArray); PRUint32 nNodes; nodeList->GetLength(&nNodes); for(PRUint32 i = 0; i < nNodes; i++) { nsCOMPtr<nsIDOMNode> curNode; nodeList->Item(i, getter_AddRefs(curNode)); JSObject * curNodeObj = JS_NewObject(cx, &lDOMNodeClass, lDOMNodeProto, parent); jsval curNodeVal = OBJECT_TO_JSVAL(curNodeObj); JS_DefineElement(cx, nodeArray, i, curNodeVal, NULL, NULL, JSPROP_ENUMERATE | JSPROP_READONLY); JS_SetPrivate(cx, curNodeObj, curNode); } return JS_TRUE; }
NS_IMETHODIMP PlaceInfo::GetVisits(JSContext* aContext, JS::MutableHandle<JS::Value> _visits) { // If the visits data was not provided, return null rather // than an empty array to distinguish this case from the case // of a place without any visit. if (!mVisitsAvailable) { _visits.setNull(); return NS_OK; } // TODO bug 625913 when we use this in situations that have more than one // visit here, we will likely want to make this cache the value. JS::Rooted<JSObject*> visits(aContext, JS_NewArrayObject(aContext, 0)); NS_ENSURE_TRUE(visits, NS_ERROR_OUT_OF_MEMORY); JS::Rooted<JSObject*> global(aContext, JS::CurrentGlobalOrNull(aContext)); NS_ENSURE_TRUE(global, NS_ERROR_UNEXPECTED); nsCOMPtr<nsIXPConnect> xpc = mozilla::services::GetXPConnect(); for (VisitsArray::size_type idx = 0; idx < mVisits.Length(); idx++) { nsCOMPtr<nsIXPConnectJSObjectHolder> wrapper; nsresult rv = xpc->WrapNative(aContext, global, mVisits[idx], NS_GET_IID(mozIVisitInfo), getter_AddRefs(wrapper)); NS_ENSURE_SUCCESS(rv, rv); JS::Rooted<JSObject*> jsobj(aContext, wrapper->GetJSObject()); NS_ENSURE_STATE(jsobj); bool rc = JS_DefineElement(aContext, visits, idx, jsobj, JSPROP_ENUMERATE); NS_ENSURE_TRUE(rc, NS_ERROR_UNEXPECTED); } _visits.setObject(*visits); return NS_OK; }
void CThreadDebugger::SaveCallstack() { ENSURE(GetIsInBreak()); CScopeLock lock(m->m_Mutex); JSStackFrame *fp; JSStackFrame *iter = 0; std::string functionName; jsint counter = 0; JSObject* jsArray; jsArray = JS_NewArrayObject(m->m_pScriptInterface->GetContext(), 0, 0); JSString* functionID; fp = JS_FrameIterator(m->m_pScriptInterface->GetContext(), &iter); while (fp) { JSFunction* fun = 0; fun = JS_GetFrameFunction(m->m_pScriptInterface->GetContext(), fp); if (NULL == fun) functionID = JS_NewStringCopyZ(m->m_pScriptInterface->GetContext(), "null"); else { functionID = JS_GetFunctionId(fun); if (NULL == functionID) functionID = JS_NewStringCopyZ(m->m_pScriptInterface->GetContext(), "anonymous"); } JSBool ret = JS_DefineElement(m->m_pScriptInterface->GetContext(), jsArray, counter, STRING_TO_JSVAL(functionID), NULL, NULL, 0); ENSURE(ret); fp = JS_FrameIterator(m->m_pScriptInterface->GetContext(), &iter); counter++; } m->m_Callstack = ""; m->m_Callstack = m->m_pScriptInterface->StringifyJSON(OBJECT_TO_JSVAL(jsArray), false).c_str(); }
static JSBool rpmhdr_resolve(JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp) { void * ptr = JS_GetInstancePrivate(cx, obj, &rpmhdrClass, NULL); Header h = ptr; JSBool ok = JS_FALSE; _RESOLVE_DEBUG_ENTRY(_debug); if ((flags & JSRESOLVE_ASSIGNING) || (h == NULL)) { /* don't resolve to parent prototypes objects. */ *objp = NULL; ok = JS_TRUE; goto exit; } if (JSVAL_IS_INT(id) || JSVAL_IS_STRING(id)) { char * s = NULL; rpmTag tag = JSVAL_IS_INT(id) ? (rpmTag) JSVAL_TO_INT(id) : tagValue(JS_EncodeString(cx, JS_ValueToString(cx, id))); JSObject * arr = rpmhdrLoadTag(cx, obj, h, tag, NULL); if (s) JS_free(cx, s); if (!JS_DefineElement(cx, obj, tag, OBJECT_TO_JSVAL(arr), NULL, NULL, JSPROP_ENUMERATE)) { *objp = NULL; goto exit; } *objp = obj; } else *objp = NULL; ok = JS_TRUE; exit: return ok; }
static JSBool rpmts_resolve(JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp) { void * ptr = JS_GetInstancePrivate(cx, obj, &rpmtsClass, NULL); rpmts ts = ptr; JSBool ok = JS_FALSE; int oc; _RESOLVE_DEBUG_ENTRY(_debug); if (flags & JSRESOLVE_ASSIGNING) { ok = JS_TRUE; goto exit; } if (JSVAL_IS_INT(id) && (oc = JSVAL_TO_INT(id)) >= 0 && oc < rpmtsNElements(ts)) { JSObject *teo = NULL; rpmte te = NULL; /* XXX rpmteLink/rpmteUnlink are no-ops */ if ((te = rpmtsElement(ts, oc)) == NULL || (teo = JS_NewObject(cx, &rpmteClass, NULL, NULL)) == NULL || !JS_SetPrivate(cx, teo, rpmteLink(te)) || !JS_DefineElement(cx, obj, oc, OBJECT_TO_JSVAL(teo), NULL, NULL, JSPROP_ENUMERATE)) { *objp = NULL; goto exit; } *objp = obj; } else *objp = NULL; ok = JS_TRUE; exit: return ok; }
NS_IMETHODIMP MobileMessageCallback::NotifyMessageDeleted(bool *aDeleted, uint32_t aSize) { if (aSize == 1) { AutoJSContext cx; JS::Rooted<JS::Value> val(cx, JS::BooleanValue(*aDeleted)); return NotifySuccess(val); } AutoJSAPI jsapi; if (NS_WARN_IF(!jsapi.Init(mDOMRequest->GetOwner()))) { return NS_ERROR_FAILURE; } JSContext* cx = jsapi.cx(); JS::Rooted<JSObject*> deleteArrayObj(cx, JS_NewArrayObject(cx, aSize)); for (uint32_t i = 0; i < aSize; i++) { JS_DefineElement(cx, deleteArrayObj, i, aDeleted[i], JSPROP_ENUMERATE); } JS::Rooted<JS::Value> deleteArrayVal(cx, JS::ObjectValue(*deleteArrayObj)); return NotifySuccess(deleteArrayVal); }
nsresult KeyPath::ExtractKeyAsJSVal(JSContext* aCx, const JS::Value& aValue, JS::Value* aOutVal) const { NS_ASSERTION(IsValid(), "This doesn't make sense!"); if (IsString()) { return GetJSValFromKeyPathString(aCx, aValue, mStrings[0], aOutVal, DoNotCreateProperties, nullptr, nullptr); } const uint32_t len = mStrings.Length(); JS::Rooted<JSObject*> arrayObj(aCx, JS_NewArrayObject(aCx, len)); if (!arrayObj) { return NS_ERROR_OUT_OF_MEMORY; } JS::Rooted<JS::Value> value(aCx); for (uint32_t i = 0; i < len; ++i) { nsresult rv = GetJSValFromKeyPathString(aCx, aValue, mStrings[i], value.address(), DoNotCreateProperties, nullptr, nullptr); if (NS_FAILED(rv)) { return rv; } if (!JS_DefineElement(aCx, arrayObj, i, value, JSPROP_ENUMERATE)) { IDB_REPORT_INTERNAL_ERR(); return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR; } } aOutVal->setObject(*arrayObj); return NS_OK; }
static JSBool parse_section(JSContext *cx, JSObject *sobj, ns_msg *hdl, ns_sect sect) { int rrnum, i; ns_rr rr; JSObject *robj; JSString *name; for (rrnum = 0; rrnum < ns_msg_count(*hdl, sect); rrnum++) { if (ns_parserr(hdl, sect, rrnum, &rr) < 0) return JS_RetError(cx, "ns_parserr: %s", strerror(errno)); robj = JS_NewObject(cx, NULL, NULL, NULL); if (!robj) return JS_RetErrno(cx, ENOMEM); if (!JS_DefineElement(cx, sobj, rrnum, OBJECT_TO_JSVAL(robj), NULL, NULL, JSPROP_ENUMERATE)) return JS_RetErrno(cx, ENOMEM); name = JS_NewStringCopyZ(cx, ns_rr_name(rr)); if (!name || !JS_DefineProperty(cx, robj, "name", STRING_TO_JSVAL(name), NULL, NULL, JSPROP_ENUMERATE)) return JS_RetErrno(cx, ENOMEM); if (!JS_DefineProperty(cx, robj, "type", INT_TO_JSVAL(ns_rr_type(rr)), NULL, NULL, JSPROP_ENUMERATE)) return JS_RetErrno(cx, ENOMEM); for (i = 0; i < ARRAY_SIZE(pmap); i++) { if (pmap[i].type != ns_rr_type(rr)) continue; if (!pmap[i].func(cx, robj, hdl, &rr)) return JS_FALSE; break; } } return JS_TRUE; }
/** Create a JS Array from a C-style argument vector. * * @param cx JS Context * @param obj JS Object to which to attach the array * @param arrayName Property name wrt 'obj' * @param argv A NULL-terminated array of char * * * @returns JS_TRUE on success */ JSBool gpsee_createJSArray_fromVector(JSContext *cx, JSObject *obj, const char *arrayName, char * const argv[]) { char * const *argp; JSObject *argsObj; if ((argsObj = JS_NewArrayObject(cx, 0, NULL)) == NULL) return JS_FALSE; if (JS_DefineProperty(cx, obj, arrayName, OBJECT_TO_JSVAL(argsObj), NULL, NULL, 0) != JS_TRUE) return JS_FALSE; if (argv) { for (argp = argv; *argp; argp++) { JSString *str = JS_NewStringCopyZ(cx, *argp); if (!str || JS_DefineElement(cx, argsObj, argp-argv, STRING_TO_JSVAL(str), NULL, NULL, JSPROP_ENUMERATE) != JS_TRUE) return JS_FALSE; } } return JS_TRUE; }
int ExecShellScript(const char * file, int argc, char** argv, JSContext * context, JSObject * env, jsval * vp) { register FILE * filep; register int c; filep = fopen(file, "rb"); if (!filep) { JS_ReportError(context, "%s: %s", file, "No such file or directory"); return 0; } if (getc(filep) == '#' && getc(filep) == '!') { c = 1; while (c != EOF && c != '\n') c = getc(filep); ungetc(c, filep); } else { fclose(filep); JS_ReportError(context, "%s: %s", file, "is not a shell script"); return 0; } JSObject* argsObj = JS_NewArrayObject(context, 0, NULL); JS_DefineProperty(context, env, "parameter", OBJECT_TO_JSVAL(argsObj), NULL, NULL, 0); JSString* str = JS_NewStringCopyZ(context, file); JS_DefineElement(context, argsObj, 0, STRING_TO_JSVAL(str), NULL, NULL, JSPROP_ENUMERATE); int i; for (i = 0; i < argc; i++) { str = JS_NewStringCopyZ(context, argv[i]); JS_DefineElement(context, argsObj, i + 1, STRING_TO_JSVAL(str), NULL, NULL, JSPROP_ENUMERATE); } setenv(SMASH_RESOURCE_PATH_ENV_ID, GET_STRING_DEF(SMASH_RESOURCE_PATH), 0); JS_InitCTypesClass(context, env); JS_DefineFunctions(context, env, shell_functions); JS_DefineProperties(context, env, shell_properties); jsval fun; JS_GetProperty(context, env, "system", &fun); JS_DefineFunction(context, JSVAL_TO_OBJECT(fun), "read", ShellSystemRead, 1, JSPROP_ENUMERATE); JS_DefineFunction(context, JSVAL_TO_OBJECT(fun), "write", ShellSystemWrite, 2, JSPROP_ENUMERATE); jsval fun2; JS_GetProperty(context, env, "echo", &fun2); JS_DefineFunction(context, JSVAL_TO_OBJECT(fun2), "error", ShellEchoError, 1, JSPROP_ENUMERATE); jsval fun3; JS_GetProperty(context, env, "setFileContent", &fun3); JS_DefineFunction(context, JSVAL_TO_OBJECT(fun3), "append", ShellSetFileContentAppend, 2, JSPROP_ENUMERATE); #ifdef SMASH_MAIN_LOADER //ExecScriptFile(context, env, GET_STRING_DEF(SMASH_MAIN_LOADER), NULL); #endif #ifdef SMASH_SHELL_LOADER ExecScriptFile(context, env, GET_STRING_DEF(SMASH_SHELL_LOADER), NULL); #endif JSObject * jsTemp = JS_CompileFileHandle(context, env, file, filep); fclose(filep); if (jsTemp) { return JS_ExecuteScript(context, env, jsTemp, vp); } else { JS_ReportPendingException(context); return 1; } }
static void StartElementHandler(void *userdata, const char *name, const char **atts) { XMLGraphCallback * cb = (XMLGraphCallback *)userdata; int i; JSObject *element, *attobj, *array; JSContext *cx = cb->cb.cx; jsval rval; if (!cb->current) { if (!JS_EvaluateScript(cx, JS_GetGlobalObject(cx), xmljs_newObj_str, xmljs_newObj_size, "XMLGraph internal", 0, &rval)) { JS_ReportError(cx, "failed to create new Object"); return; } element = JSVAL_TO_OBJECT(rval); cb->current = element; if (!JS_DefineProperty(cx, cb->cb.obj, "graph", rval, NULL, NULL, JSPROP_ENUMERATE)) { JS_ReportError(cx, "failed to define graph prop"); return; } } if (!JS_EvaluateScript(cx, JS_GetGlobalObject(cx), xmljs_newObj_str, xmljs_newObj_size, "XMLGraph internal", 0, &rval)) { JS_ReportError(cx, "failed to create new Object"); return; } element = JSVAL_TO_OBJECT(rval); /* populate and set __attributes__ */ if (atts[0]) { JSString *attstr; if (!JS_EvaluateScript(cx, JS_GetGlobalObject(cx), xmljs_newObj_str, xmljs_newObj_size, "XMLGraph internal", 0, &rval)) return; attobj = JSVAL_TO_OBJECT(rval); for (i = 0; atts[i]; i+=2) { /* * if we have an attribute that matches nameBy, use * the value of that attribute to name the node */ if (cb->nameBy && !strcmp(cb->nameBy, atts[i])) name = atts[i+1]; attstr = JS_NewStringCopyZ(cx, atts[i+1]); if (!attstr || !JS_DefineProperty(cx, attobj, atts[i], STRING_TO_JSVAL(attstr), NULL, NULL, JSPROP_ENUMERATE)) return; } if (!JS_DefineProperty(cx, element, "__attributes__", OBJECT_TO_JSVAL(attobj), NULL, NULL, 0)) return; } /* Check for existing property with this name */ if (!JS_GetProperty(cx, cb->current, name, &rval)) return; if (JSVAL_IS_OBJECT(rval)) { JSObject *existing = JSVAL_TO_OBJECT(rval); if (JS_IsArrayObject(cx, existing)) { /* already an array, so append */ jsuint length; if (!JS_GetArrayLength(cx, existing, &length) || !JS_DefineElement(cx, existing, (jsint)length, OBJECT_TO_JSVAL(element), NULL, NULL, JSPROP_ENUMERATE)) return; } else { /* replace with an array [current, new] */ jsval vector[2]; vector[0] = OBJECT_TO_JSVAL(existing); vector[1] = OBJECT_TO_JSVAL(element); array = JS_NewArrayObject(cx, 2, vector); if (!array || !JS_DefineProperty(cx, cb->current, name, OBJECT_TO_JSVAL(array), NULL, NULL, JSPROP_ENUMERATE)) return; } } else if (!JS_DefineProperty(cx, cb->current, name, OBJECT_TO_JSVAL(element), NULL, NULL, JSPROP_ENUMERATE)) return; /* define backpointer __up__ */ if (!JS_DefineProperty(cx, element, xmlg_up_str, OBJECT_TO_JSVAL(cb->current), NULL, NULL, 0)) return; /* * XXX DefineProperty(element, "__element__", elementstr) */ cb->current = element; }
static JSBool rpmxar_enumerate(JSContext *cx, JSObject *obj, JSIterateOp op, jsval *statep, jsid *idp) { void * ptr = JS_GetInstancePrivate(cx, obj, &rpmxarClass, NULL); rpmxar xar = ptr; int ix = 0; _ENUMERATE_DEBUG_ENTRY(_debug < 0); switch (op) { case JSENUMERATE_INIT: if (idp) *idp = JSVAL_ZERO; *statep = INT_TO_JSVAL(ix); if (_debug) fprintf(stderr, "\tINIT xar %p\n", xar); break; case JSENUMERATE_NEXT: ix = JSVAL_TO_INT(*statep); if (!rpmxarNext(xar)) { const char * path = rpmxarPath(xar); struct stat * st = xmalloc(sizeof(*st)); JSObject * arr = JS_NewArrayObject(cx, 0, NULL); JSBool ok = JS_AddRoot(cx, &arr); JSObject * o; jsval v; v = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, path)); ok = JS_SetElement(cx, arr, 0, &v); if (!rpmxarStat(xar, st) && (o = JS_NewObject(cx, &rpmstClass, NULL, NULL)) != NULL && JS_SetPrivate(cx, o, (void *)st)) v = OBJECT_TO_JSVAL(o); else { st = _free(st); v = JSVAL_NULL; } ok = JS_SetElement(cx, arr, 1, &v); v = OBJECT_TO_JSVAL(arr); ok = JS_DefineElement(cx, obj, ix, v, NULL, NULL, JSPROP_ENUMERATE); (void) JS_RemoveRoot(cx, &arr); if (_debug) fprintf(stderr, "\tNEXT xar %p[%u] \"%s\"\n", xar, ix, path); path = _free(path); JS_ValueToId(cx, *statep, idp); *statep = INT_TO_JSVAL(ix+1); } else *idp = JSVAL_VOID; if (*idp != JSVAL_VOID) break; /*@fallthrough@*/ case JSENUMERATE_DESTROY: ix = JSVAL_TO_INT(*statep); (void) JS_DefineProperty(cx, obj, "length", INT_TO_JSVAL(ix), NULL, NULL, JSPROP_ENUMERATE); if (_debug) fprintf(stderr, "\tFINI xar %p[%u]\n", xar, ix); *statep = JSVAL_NULL; break; } return JS_TRUE; }
void WebGL2Context::GetActiveUniforms(JSContext* cx, WebGLProgram* program, const dom::Sequence<GLuint>& uniformIndices, GLenum pname, JS::MutableHandleValue retval) { retval.set(JS::NullValue()); if (IsContextLost()) return; if (!ValidateUniformEnum(this, pname, "getActiveUniforms")) return; if (!ValidateObject("getActiveUniforms: program", program)) return; size_t count = uniformIndices.Length(); if (!count) return; GLuint progname = program->mGLName; Vector<GLint> samples; if (!samples.resize(count)) { return; } MakeContextCurrent(); gl->fGetActiveUniformsiv(progname, count, uniformIndices.Elements(), pname, samples.begin()); JS::Rooted<JSObject*> array(cx, JS_NewArrayObject(cx, count)); if (!array) { return; } switch (pname) { case LOCAL_GL_UNIFORM_TYPE: case LOCAL_GL_UNIFORM_SIZE: case LOCAL_GL_UNIFORM_BLOCK_INDEX: case LOCAL_GL_UNIFORM_OFFSET: case LOCAL_GL_UNIFORM_ARRAY_STRIDE: case LOCAL_GL_UNIFORM_MATRIX_STRIDE: for (uint32_t i = 0; i < count; ++i) { JS::RootedValue value(cx); value = JS::Int32Value(samples[i]); if (!JS_DefineElement(cx, array, i, value, JSPROP_ENUMERATE)) { return; } } break; case LOCAL_GL_UNIFORM_IS_ROW_MAJOR: for (uint32_t i = 0; i < count; ++i) { JS::RootedValue value(cx); value = JS::BooleanValue(samples[i]); if (!JS_DefineElement(cx, array, i, value, JSPROP_ENUMERATE)) { return; } } break; default: return; } retval.setObjectOrNull(array); }
void WebGL2Context::GetActiveUniforms(JSContext* cx, const WebGLProgram& program, const dom::Sequence<GLuint>& uniformIndices, GLenum pname, JS::MutableHandleValue retval) { const char funcName[] = "getActiveUniforms"; retval.setNull(); if (IsContextLost()) return; if (!ValidateUniformEnum(this, pname, funcName)) return; if (!ValidateObject("getActiveUniforms: program", program)) return; const auto& numActiveUniforms = program.LinkInfo()->uniforms.size(); for (const auto& curIndex : uniformIndices) { if (curIndex >= numActiveUniforms) { ErrorInvalidValue("%s: Too-large active uniform index queried.", funcName); return; } } const auto& count = uniformIndices.Length(); JS::Rooted<JSObject*> array(cx, JS_NewArrayObject(cx, count)); UniquePtr<GLint[]> samples(new GLint[count]); if (!array || !samples) { ErrorOutOfMemory("%s: Failed to allocate buffers.", funcName); return; } retval.setObject(*array); MakeContextCurrent(); gl->fGetActiveUniformsiv(program.mGLName, count, uniformIndices.Elements(), pname, samples.get()); switch (pname) { case LOCAL_GL_UNIFORM_TYPE: case LOCAL_GL_UNIFORM_SIZE: case LOCAL_GL_UNIFORM_BLOCK_INDEX: case LOCAL_GL_UNIFORM_OFFSET: case LOCAL_GL_UNIFORM_ARRAY_STRIDE: case LOCAL_GL_UNIFORM_MATRIX_STRIDE: for (size_t i = 0; i < count; ++i) { JS::RootedValue value(cx); value = JS::Int32Value(samples[i]); if (!JS_DefineElement(cx, array, i, value, JSPROP_ENUMERATE)) return; } break; case LOCAL_GL_UNIFORM_IS_ROW_MAJOR: for (size_t i = 0; i < count; ++i) { JS::RootedValue value(cx); value = JS::BooleanValue(samples[i]); if (!JS_DefineElement(cx, array, i, value, JSPROP_ENUMERATE)) return; } break; default: MOZ_CRASH("Invalid pname"); } }
static int ProcessArgs(JSContext *cx, JSObject *obj, char **argv, int argc) { int i, j, length; JSObject *argsObj; char *filename = NULL; JSBool isInteractive = JS_TRUE; JSBool forceTTY = JS_FALSE; /* * Scan past all optional arguments so we can create the arguments object * before processing any -f options, which must interleave properly with * -v and -w options. This requires two passes, and without getopt, we'll * have to keep the option logic here and in the second for loop in sync. */ for (i = 0; i < argc; i++) { if (argv[i][0] != '-' || argv[i][1] == '\0') { ++i; break; } switch (argv[i][1]) { case 'b': case 'c': case 'f': case 'e': case 'v': case 'S': ++i; break; default:; } } /* * Create arguments early and define it to root it, so it's safe from any * GC calls nested below, and so it is available to -f <file> arguments. */ argsObj = JS_NewArrayObject(cx, 0, NULL); if (!argsObj) return 1; if (!JS_DefineProperty(cx, obj, "arguments", OBJECT_TO_JSVAL(argsObj), NULL, NULL, 0)) { return 1; } length = argc - i; for (j = 0; j < length; j++) { JSString *str = JS_NewStringCopyZ(cx, argv[i++]); if (!str) return 1; if (!JS_DefineElement(cx, argsObj, j, STRING_TO_JSVAL(str), NULL, NULL, JSPROP_ENUMERATE)) { return 1; } } for (i = 0; i < argc; i++) { if (argv[i][0] != '-' || argv[i][1] == '\0') { filename = argv[i++]; isInteractive = JS_FALSE; break; } switch (argv[i][1]) { case 'v': if (++i == argc) return usage(); JS_SetVersion(cx, (JSVersion) atoi(argv[i])); break; case 'w': reportWarnings = JS_TRUE; break; case 'W': reportWarnings = JS_FALSE; break; case 's': JS_ToggleOptions(cx, JSOPTION_STRICT); break; case 'E': JS_ToggleOptions(cx, JSOPTION_RELIMIT); break; case 'x': JS_ToggleOptions(cx, JSOPTION_XML); break; case 'o': if (++i == argc) return usage(); for (j = 0; js_options[j].name; ++j) { if (strcmp(js_options[j].name, argv[i]) == 0) { JS_ToggleOptions(cx, js_options[j].flag); break; } } break; case 'c': /* set stack chunk size */ gStackChunkSize = atoi(argv[++i]); break; case 'f': if (++i == argc) return usage(); Process(cx, obj, argv[i], JS_FALSE); /* * XXX: js -f foo.js should interpret foo.js and then * drop into interactive mode, but that breaks the test * harness. Just execute foo.js for now. */ isInteractive = JS_FALSE; break; case 'e': { jsval rval; if (++i == argc) return usage(); /* Pass a filename of -e to imitate PERL */ JS_EvaluateScript(cx, obj, argv[i], SG_STRLEN(argv[i]), "-e", 1, &rval); isInteractive = JS_FALSE; break; } case 'C': compileOnly = JS_TRUE; isInteractive = JS_FALSE; break; case 'i': isInteractive = forceTTY = JS_TRUE; break; case 'S': if (++i == argc) return usage(); /* Set maximum stack size. */ gMaxStackSize = atoi(argv[i]); break; #ifdef MOZ_SHARK case 'k': JS_ConnectShark(); break; #endif default: return usage(); } } if (filename || isInteractive) Process(cx, obj, filename, forceTTY); return gExitCode; }
JSBool netlocalgroupaddmembers(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval) { JS_BeginRequest(cx); if(argc < 2) { JS_ReportError(cx, "Must pass members to be added."); JS_EndRequest(cx); return JS_FALSE; } LOCALGROUP_MEMBERS_INFO_0 * members; DWORD * lookupResult; DWORD memberCount = 0; JSString * groupName = JS_ValueToString(cx, argv[0]); argv[0] = STRING_TO_JSVAL(groupName); if(JSVAL_IS_OBJECT(argv[1]) && JS_IsArrayObject(cx, JSVAL_TO_OBJECT(argv[1]))) { JSObject * memberArray; JS_ValueToObject(cx, argv[1], &memberArray); argv[1] = OBJECT_TO_JSVAL(memberArray); JS_GetArrayLength(cx, memberArray, (jsuint*)&memberCount); members = (LOCALGROUP_MEMBERS_INFO_0*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LOCALGROUP_MEMBERS_INFO_0) * memberCount); lookupResult = (DWORD*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DWORD) * memberCount); JS_EnterLocalRootScope(cx); for(DWORD i = 0; i < memberCount; i++) { jsval curMemberVal; JSString * curMemberString; JS_GetElement(cx, memberArray, (jsint)i, &curMemberVal); curMemberString = JS_ValueToString(cx, curMemberVal); members[i].lgrmi0_sid = convert_jsstring_to_sid(cx, curMemberString, &lookupResult[i]); } JS_LeaveLocalRootScope(cx); } else { JSString * memberString = JS_ValueToString(cx, argv[1]); argv[1] = STRING_TO_JSVAL(memberString); members = (LOCALGROUP_MEMBERS_INFO_0*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LOCALGROUP_MEMBERS_INFO_0)); lookupResult = (DWORD*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DWORD)); members->lgrmi0_sid = convert_jsstring_to_sid(cx, memberString, lookupResult); memberCount = 1; } for(DWORD i = 0; i < memberCount; i++) { if(lookupResult[i] == 0) { JS_YieldRequest(cx); lookupResult[i] = NetLocalGroupAddMembers(NULL, (LPWSTR)JS_GetStringChars(groupName), 0, (LPBYTE)&members[i], 1); } } JSObject * retArray = JS_NewArrayObject(cx, 0, NULL); *rval = OBJECT_TO_JSVAL(retArray); for(DWORD i = 0; i < memberCount; i++) { jsval curResultVal; JS_NewNumberValue(cx, lookupResult[i], &curResultVal); JS_DefineElement(cx, retArray, i, curResultVal, NULL, NULL, 0); HeapFree(GetProcessHeap(), 0, members[i].lgrmi0_sid); } HeapFree(GetProcessHeap(), 0, members); HeapFree(GetProcessHeap(), 0, lookupResult); JS_EndRequest(cx); return JS_TRUE; }
static int ProcessArgs(JSContext *cx, JSObject *obj, char **argv, int argc) { const char rcfilename[] = "xpcshell.js"; FILE *rcfile; int i, j, length; JSObject *argsObj; char *filename = NULL; JSBool isInteractive = JS_TRUE; JSBool forceTTY = JS_FALSE; rcfile = fopen(rcfilename, "r"); if (rcfile) { printf("[loading '%s'...]\n", rcfilename); ProcessFile(cx, obj, rcfilename, rcfile, JS_FALSE); } /* * Scan past all optional arguments so we can create the arguments object * before processing any -f options, which must interleave properly with * -v and -w options. This requires two passes, and without getopt, we'll * have to keep the option logic here and in the second for loop in sync. */ for (i = 0; i < argc; i++) { if (argv[i][0] != '-' || argv[i][1] == '\0') { ++i; break; } switch (argv[i][1]) { case 'v': case 'f': case 'e': ++i; break; default:; } } /* * Create arguments early and define it to root it, so it's safe from any * GC calls nested below, and so it is available to -f <file> arguments. */ argsObj = JS_NewArrayObject(cx, 0, NULL); if (!argsObj) return 1; if (!JS_DefineProperty(cx, obj, "arguments", OBJECT_TO_JSVAL(argsObj), NULL, NULL, 0)) { return 1; } length = argc - i; for (j = 0; j < length; j++) { JSString *str = JS_NewStringCopyZ(cx, argv[i++]); if (!str) return 1; if (!JS_DefineElement(cx, argsObj, j, STRING_TO_JSVAL(str), NULL, NULL, JSPROP_ENUMERATE)) { return 1; } } for (i = 0; i < argc; i++) { if (argv[i][0] != '-' || argv[i][1] == '\0') { filename = argv[i++]; isInteractive = JS_FALSE; break; } switch (argv[i][1]) { case 'v': if (++i == argc) { return usage(); } JS_SetVersion(cx, JSVersion(atoi(argv[i]))); break; case 'W': reportWarnings = JS_FALSE; break; case 'w': reportWarnings = JS_TRUE; break; case 's': JS_ToggleOptions(cx, JSOPTION_STRICT); break; case 'x': JS_ToggleOptions(cx, JSOPTION_XML); break; case 'P': if (JS_GET_CLASS(cx, JS_GetPrototype(cx, obj)) != &global_class) { JSObject *gobj; if (!JS_SealObject(cx, obj, JS_TRUE)) return JS_FALSE; gobj = JS_NewObject(cx, &global_class, NULL, NULL); if (!gobj) return JS_FALSE; if (!JS_SetPrototype(cx, gobj, obj)) return JS_FALSE; JS_SetParent(cx, gobj, NULL); JS_SetGlobalObject(cx, gobj); obj = gobj; } break; case 'f': if (++i == argc) { return usage(); } Process(cx, obj, argv[i], JS_FALSE); /* * XXX: js -f foo.js should interpret foo.js and then * drop into interactive mode, but that breaks test * harness. Just execute foo.js for now. */ isInteractive = JS_FALSE; break; case 'i': isInteractive = forceTTY = JS_TRUE; break; case 'e': { jsval rval; if (++i == argc) { return usage(); } JS_EvaluateScript(cx, obj, argv[i], strlen(argv[i]), "-e", 1, &rval); isInteractive = JS_FALSE; break; } case 'C': compileOnly = JS_TRUE; isInteractive = JS_FALSE; break; #ifdef MOZ_SHARK case 'k': JS_ConnectShark(); break; #endif default: return usage(); } } if (filename || isInteractive) Process(cx, obj, filename, forceTTY); return gExitCode; }
/** Needs nargs to be at least 2 for GC roots. * * JS method returns true if values were read. */ static JSBool query_readQuery(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { extern cfgHnd cfg; query_private_t *hnd = JS_GetPrivate(cx, obj); node *n; JSString *str; int retval; jsrefcount depth; jsval val; if (hnd->query) return gpsee_throw(cx, OBJECT_ID ".readQuery.alreadyRead"); else hnd->query = JS_malloc(cx, sizeof(*hnd->query)); if (argc > 0) { str = JS_ValueToString(cx, argv[0]); hnd->uploadDir = JS_strdup(cx, JS_GetStringBytes(str)); } else hnd->uploadDir = cfg_value(cfg, OBJECT_ID ".default_upload_dir"); /* fix this later by making upload files == /dev/null in libcgihtml.so when upload dir is null */ if (!hnd->uploadDir) gpsee_log(cx, GLOG_NOTICE, "Unspecified upload dir is a security problem! Specify rc." OBJECT_ID ".default_upload_dir!"); depth = JS_SuspendRequest(cx); retval = read_cgi_input(cx, hnd->query, hnd->uploadDir); JS_ResumeRequest(cx, depth); *rval = retval ? JSVAL_TRUE : JSVAL_FALSE; for (n = hnd->query->head; n; n = n->next) { /* temporary fix? we don't want to overwrite our module readQuery() member */ if (!n->entry.name || !strcmp(n->entry.name,"readQuery")) continue; if (n->entry.value == NULL) n->entry.value = strdup(""); /* Match eekim's horrible semantics */ /* later optimization note: almost all of the cases where we'd need to * create arrays instead of strings are also cases where the CGI * variables of the same name are adjacent in the query */ if ((JS_GetProperty(cx, obj, n->entry.name, &val) == JS_TRUE) && (!JSVAL_IS_VOID(val))) { /* Already seen a CGI variable with this name */ if (JSVAL_IS_STRING(val)) /* Only seen one, create a new array */ { argv[0] = val; argv[1] = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, n->entry.value)); argv[0] = OBJECT_TO_JSVAL(JS_NewArrayObject(cx, 2, argv)); if (JS_SetProperty(cx, obj, n->entry.name, argv + 0) == JS_FALSE) return gpsee_throw(cx, OBJECT_ID ".readQuery.property.recreate.%s", n->entry.name); } else { jsuint length; /* seen many: append to the array */ if (JS_IsArrayObject(cx, JSVAL_TO_OBJECT(val)) != JS_TRUE) return gpsee_throw(cx, OBJECT_ID ".readQuery.property.type.%s", n->entry.name); if (JS_GetArrayLength(cx, JSVAL_TO_OBJECT(val), &length) != JS_TRUE) return gpsee_throw(cx, OBJECT_ID ".readQuery.property.%s.length.get", n->entry.name); if (JS_DefineElement(cx, JSVAL_TO_OBJECT(val), length, STRING_TO_JSVAL(JS_NewStringCopyZ(cx, n->entry.value)), JS_PropertyStub, JS_PropertyStub, JSPROP_ENUMERATE) != JS_TRUE) return gpsee_throw(cx, OBJECT_ID ".readQuery.property.%s.element.%u", n->entry.name, length); if (JS_SetArrayLength(cx, JSVAL_TO_OBJECT(val), length + 1) != JS_TRUE) return gpsee_throw(cx, OBJECT_ID ".readQuery.property.%s.length.set", n->entry.name); } } else { /* First time for this property, insert it as a string */ argv[0] = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, n->entry.value)); if (JS_SetProperty(cx, obj, n->entry.name, argv + 0) == JS_FALSE) return gpsee_throw(cx, OBJECT_ID ".readQuery.property.create.%s", n->entry.name); } } return JS_TRUE; }