NS_IMETHODIMP HTMLImageElement::Initialize(nsISupports* aOwner, JSContext* aContext, JSObject *aObj, uint32_t argc, jsval *argv) { if (argc <= 0) { // Nothing to do here if we don't get any arguments. return NS_OK; } // The first (optional) argument is the width of the image uint32_t width; JSBool ret = JS_ValueToECMAUint32(aContext, argv[0], &width); NS_ENSURE_TRUE(ret, NS_ERROR_INVALID_ARG); nsresult rv = SetIntAttr(nsGkAtoms::width, static_cast<int32_t>(width)); if (NS_SUCCEEDED(rv) && (argc > 1)) { // The second (optional) argument is the height of the image uint32_t height; ret = JS_ValueToECMAUint32(aContext, argv[1], &height); NS_ENSURE_TRUE(ret, NS_ERROR_INVALID_ARG); rv = SetIntAttr(nsGkAtoms::height, static_cast<int32_t>(height)); } return rv; }
static JSBool gjs_value_to_gsize(JSContext *context, jsval value, gsize *v_p) { guint32 val32; /* Just JS_ValueToECMAUint32() would work. However, * we special case ints for two reasons: * - JS_ValueToECMAUint32() always goes via a double which is slow * - nicer error message on negative indices */ if (JSVAL_IS_INT(value)) { int i = JSVAL_TO_INT(value); if (i < 0) { gjs_throw(context, "Negative length or index %d is not allowed for ByteArray", i); return JS_FALSE; } *v_p = i; return JS_TRUE; } else { JSBool ret; /* This is pretty liberal (it converts about anything to * a number) but it's what we use elsewhere in gjs too. */ ret = JS_ValueToECMAUint32(context, value, &val32); *v_p = val32; return ret; } }
template<> bool ScriptInterface::FromJSVal<u32>(JSContext* cx, jsval v, u32& out) { uint32 ret; WARN_IF_NOT(JSVAL_IS_NUMBER(v), v); if (!JS_ValueToECMAUint32(cx, v, &ret)) return false; out = ret; return true; }
/* @smjs_globhist_item_class.setProperty */ static JSBool smjs_globhist_item_set_property(JSContext *ctx, JSObject *obj, jsid id, JSBool strict, jsval *vp) { struct global_history_item *history_item; /* This can be called if @obj if not itself an instance of the * appropriate class but has one in its prototype chain. Fail * such calls. */ if (!JS_InstanceOf(ctx, obj, (JSClass *) &smjs_globhist_item_class, NULL)) return JS_FALSE; history_item = JS_GetInstancePrivate(ctx, obj, (JSClass *) &smjs_globhist_item_class, NULL); if (!history_item) return JS_FALSE; if (!JSID_IS_INT(id)) return JS_FALSE; switch (JSID_TO_INT(id)) { case GLOBHIST_TITLE: { JSString *jsstr = JS_ValueToString(smjs_ctx, *vp); unsigned char *str = JS_EncodeString(smjs_ctx, jsstr); mem_free_set(&history_item->title, stracpy(str)); return JS_TRUE; } case GLOBHIST_URL: { JSString *jsstr = JS_ValueToString(smjs_ctx, *vp); unsigned char *str = JS_EncodeString(smjs_ctx, jsstr); mem_free_set(&history_item->url, stracpy(str)); return JS_TRUE; } case GLOBHIST_LAST_VISIT: { uint32 seconds; /* Bug 923: Assumes time_t values fit in uint32. */ JS_ValueToECMAUint32(smjs_ctx, *vp, &seconds); history_item->last_visit = seconds; return JS_TRUE; } default: /* Unrecognized integer property ID; someone is using * the object as an array. SMJS builtin classes (e.g. * js_RegExpClass) just return JS_TRUE in this case. * Do the same here. */ return JS_TRUE; } }
JSBool JetpackChild::GCZeal(JSContext* cx, uintN argc, jsval *vp) { jsval* argv = JS_ARGV(cx, vp); uint32 zeal; if (!JS_ValueToECMAUint32(cx, argv[0], &zeal)) return JS_FALSE; JS_SetGCZeal(cx, PRUint8(zeal), JS_DEFAULT_ZEAL_FREQ, JS_FALSE); return JS_TRUE; }
JSBool InterfaceObjectToString(JSContext* cx, unsigned argc, JS::Value *vp) { JSObject* callee = JSVAL_TO_OBJECT(JS_CALLEE(cx, vp)); JSObject* obj = JS_THIS_OBJECT(cx, vp); if (!obj) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_CANT_CONVERT_TO, "null", "object"); return false; } jsval v = js::GetFunctionNativeReserved(callee, TOSTRING_CLASS_RESERVED_SLOT); JSClass* clasp = static_cast<JSClass*>(JSVAL_TO_PRIVATE(v)); v = js::GetFunctionNativeReserved(callee, TOSTRING_NAME_RESERVED_SLOT); JSString* jsname = static_cast<JSString*>(JSVAL_TO_STRING(v)); size_t length; const jschar* name = JS_GetInternedStringCharsAndLength(jsname, &length); if (js::GetObjectJSClass(obj) != clasp) { JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_INCOMPATIBLE_PROTO, NS_ConvertUTF16toUTF8(name).get(), "toString", "object"); return false; } JS::Value* argv = JS_ARGV(cx, vp); uint32_t indent = 0; if (argc != 0 && !JS_ValueToECMAUint32(cx, argv[0], &indent)) return false; nsAutoString spaces; while (indent-- > 0) { spaces.Append(PRUnichar(' ')); } nsString str; str.Append(spaces); str.AppendLiteral("function "); str.Append(name, length); str.AppendLiteral("() {"); str.Append('\n'); str.Append(spaces); str.AppendLiteral(" [native code]"); str.Append('\n'); str.Append(spaces); str.AppendLiteral("}"); return xpc::NonVoidStringToJsval(cx, str, vp); }
JSBool win32_getlasterrormsg(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval) { LPWSTR buffer; DWORD errorCode = GetLastError(); JS_BeginRequest(cx); if(argc > 0) JS_ValueToECMAUint32(cx, argv[0], (uint32*)&errorCode); FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&buffer, 0, NULL); JSString * retStr = JS_NewUCStringCopyZ(cx, (jschar*)buffer); JS_EndRequest(cx); LocalFree(buffer); *rval = STRING_TO_JSVAL(retStr); return JS_TRUE; }
JSBool S_SimpleNativeClass::jsPropertySet(JSContext *cx, JSObject *obj, jsid _id, JSBool strict, jsval *val) { int32_t propId = JSID_TO_INT(_id); S_SimpleNativeClass *cobj; JSGET_PTRSHELL(S_SimpleNativeClass, cobj, obj); if (!cobj) return JS_FALSE; switch(propId) { case kSomeField: do { uint32_t tmp; JS_ValueToECMAUint32(cx, *val, &tmp); cobj->setSomeField(tmp); } while (0); break; case kSomeOtherField: do { uint32_t tmp; JS_ValueToECMAUint32(cx, *val, &tmp); cobj->setSomeOtherField(tmp); } while (0); break; case kAnotherMoreComplexField: do { char *tmp = JS_EncodeString(cx, JSVAL_TO_STRING(*val)); if (tmp) { cobj->setAnotherMoreComplexField(tmp); } } while (0); break; default: break; } return JS_TRUE; }
JSBool S_AnotherClass::jsPropertySet(JSContext *cx, JSObject *obj, jsid _id, JSBool strict, jsval *val) { int32_t propId = JSID_TO_INT(_id); S_AnotherClass *cobj; JSGET_PTRSHELL(S_AnotherClass, cobj, obj); if (!cobj) return JS_FALSE; switch(propId) { case kAPublicField: do { uint32_t tmp; JS_ValueToECMAUint32(cx, *val, &tmp); cobj->aPublicField = tmp; } while (0); break; default: break; } return JS_TRUE; }
JSBool win32_sleep(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval) { if(argc < 1 || ! JSVAL_IS_NUMBER(*argv)) { JS_ReportError(cx, "Must pass a numeric value to Sleep."); return JS_FALSE; } DWORD nTimeout = 0; JS_BeginRequest(cx); JS_ValueToECMAUint32(cx, *argv, &nTimeout); jsrefcount rCount = JS_SuspendRequest(cx); Sleep(nTimeout); JS_ResumeRequest(cx, rCount); JS_EndRequest(cx); return JS_TRUE; }
JSBool js_cocos2dx_CCAnimation_create(JSContext *cx, uint32_t argc, jsval *vp) { jsval *argv = JS_ARGV(cx, vp); if (argc <= 3) { cocos2d::CCArray* arg0; if (argc > 0) { arg0 = jsval_to_ccarray(cx, argv[0]); } cocos2d::CCAnimation* ret; double arg1 = 0.0f; if (argc > 0 && argc == 2) { if (argc == 2) { JS_ValueToNumber(cx, argv[1], &arg1); } ret = cocos2d::CCAnimation::create(arg0, arg1); } else if (argc > 0) { unsigned int loops; JS_ValueToNumber(cx, argv[1], &arg1); JS_ValueToECMAUint32(cx, argv[1], &loops); ret = cocos2d::CCAnimation::create(arg0, arg1, loops); } else if (argc == 0) { ret = cocos2d::CCAnimation::create(); } jsval jsret; if (ret) { js_proxy_t *proxy; JS_GET_PROXY(proxy, ret); if (proxy) { jsret = OBJECT_TO_JSVAL(proxy->obj); } else { // create a new js obj of that class proxy = js_get_or_create_proxy<cocos2d::CCAnimation>(cx, ret); jsret = OBJECT_TO_JSVAL(proxy->obj); } } else { jsret = JSVAL_NULL; } JS_SET_RVAL(cx, vp, jsret); return JS_TRUE; } return JS_FALSE; }
static JSBool at(JSContext *cx, uintN argc, jsval *vp) { if (argc < 2) { flm_log("'at' requires at least 2 arguments: <time> <function>"); return JS_FALSE; } jsval *arguments = JS_ARGV(cx, vp); uint32_t time; JS_ValueToECMAUint32(cx, arguments[0], &time); struct task *t = task_create(time); t->js_argc = 0; if (JS_TypeOfValue(cx, arguments[1]) == JSTYPE_FUNCTION) { t->js_function = arguments[1]; } else { flm_log("2nd argument of 'at' should be a function"); return JS_FALSE; } t->js_argc = (argc > 2 ? argc - 2 : 1); jsval *fn_args = malloc(t->js_argc * sizeof(jsval)); if (argc > 2) { int i; for (i = 2; i < argc; i++) { fn_args[i - 2] = arguments[i]; } } else { fn_args[0] = time; } t->js_args = fn_args; t->task_type = JS_FUNCTION; schedule_task(flim->scheduler, t); return JS_TRUE; }
JSBool GetLastNetErrorMessage(JSContext * cx, JSObject * obj, uintN argc, jsval * argv, jsval * rval) { DWORD dwLastError = NERR_Success; HANDLE hModule = GetModuleHandle(NULL); if(argc < 1 || !JSVAL_IS_NUMBER(*argv)) { JS_ReportError(cx, "Must provide valid error code to GetLastNetErrorMessage"); return JS_FALSE; } JS_BeginRequest(cx); JS_ValueToECMAUint32(cx, *argv, &dwLastError); DWORD dwFormatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM ; if(dwLastError >= NERR_BASE && dwLastError <= MAX_NERR) { hModule = LoadLibraryEx(TEXT("netmsg.dll"), NULL, LOAD_LIBRARY_AS_DATAFILE); if(hModule != NULL) dwFormatFlags |= FORMAT_MESSAGE_FROM_HMODULE; } LPWSTR buffer = NULL; DWORD size = FormatMessage(dwFormatFlags, hModule, dwLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&buffer, 0, NULL); if(size == 0) { *rval = JSVAL_FALSE; return JS_TRUE; } JSString * rString = JS_NewUCStringCopyN(cx, (jschar*)buffer, size); *rval = STRING_TO_JSVAL(rString); JS_EndRequest(cx); LocalFree(buffer); return JS_TRUE; }
// // Native method InstallChrome // static JSBool InstallTriggerGlobalInstallChrome(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { nsIDOMInstallTriggerGlobal *nativeThis = getTriggerNative(cx, obj); if (!nativeThis) return JS_FALSE; uint32 chromeType = NOT_CHROME; nsAutoString sourceURL; nsAutoString name; *rval = JSVAL_FALSE; // get chromeType first, the update enabled check for skins skips whitelisting if (argc >=1) { if (!JS_ValueToECMAUint32(cx, argv[0], &chromeType)) return JS_FALSE; } // make sure XPInstall is enabled, return if not nsIScriptGlobalObject *globalObject = nsnull; nsIScriptContext *scriptContext = GetScriptContextFromJSContext(cx); if (scriptContext) globalObject = scriptContext->GetGlobalObject(); if (!globalObject) return JS_TRUE; // get window.location to construct relative URLs nsCOMPtr<nsIURI> baseURL; JSObject* global = JS_GetGlobalObject(cx); if (global) { jsval v; if (JS_GetProperty(cx,global,"location",&v)) { nsAutoString location; ConvertJSValToStr( location, cx, v ); NS_NewURI(getter_AddRefs(baseURL), location); } } if ( argc >= 3 ) { ConvertJSValToStr(sourceURL, cx, argv[1]); ConvertJSValToStr(name, cx, argv[2]); if (baseURL) { nsCAutoString resolvedURL; baseURL->Resolve(NS_ConvertUTF16toUTF8(sourceURL), resolvedURL); sourceURL = NS_ConvertUTF8toUTF16(resolvedURL); } // Make sure caller is allowed to load this url. nsresult rv = InstallTriggerCheckLoadURIFromScript(cx, sourceURL); if (NS_FAILED(rv)) return JS_FALSE; if ( chromeType & CHROME_ALL ) { // there's at least one known chrome type nsCOMPtr<nsIURI> checkuri; nsresult rv = nativeThis->GetOriginatingURI(globalObject, getter_AddRefs(checkuri)); if (NS_SUCCEEDED(rv)) { nsAutoPtr<nsXPITriggerInfo> trigger(new nsXPITriggerInfo()); nsAutoPtr<nsXPITriggerItem> item(new nsXPITriggerItem(name.get(), sourceURL.get(), nsnull)); if (trigger && item) { // trigger will free item when complete trigger->Add(item.forget()); nsCOMPtr<nsIDOMWindowInternal> win(do_QueryInterface(globalObject)); nsCOMPtr<nsIXPIInstallInfo> installInfo = new nsXPIInstallInfo(win, checkuri, trigger, chromeType); if (installInfo) { // installInfo owns trigger now trigger.forget(); PRBool enabled = PR_FALSE; nativeThis->UpdateEnabled(checkuri, XPI_WHITELIST, &enabled); if (!enabled) { nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService(); if (os) os->NotifyObservers(installInfo, "xpinstall-install-blocked", nsnull); } else { PRBool nativeRet = PR_FALSE; nativeThis->StartInstall(installInfo, &nativeRet); *rval = BOOLEAN_TO_JSVAL(nativeRet); } } } } } } return JS_TRUE; }
static JSBool gjs_value_to_g_value_internal(JSContext *context, jsval value, GValue *gvalue, gboolean no_copy) { GType gtype; gtype = G_VALUE_TYPE(gvalue); if (gtype == 0) { gtype = gjs_value_guess_g_type(context, value); if (gtype == G_TYPE_INVALID) { gjs_throw(context, "Could not guess unspecified GValue type"); return JS_FALSE; } gjs_debug_marshal(GJS_DEBUG_GCLOSURE, "Guessed GValue type %s from JS Value", g_type_name(gtype)); g_value_init(gvalue, gtype); } gjs_debug_marshal(GJS_DEBUG_GCLOSURE, "Converting jsval to gtype %s", g_type_name(gtype)); if (gtype == G_TYPE_STRING) { /* Don't use ValueToString since we don't want to just toString() * everything automatically */ if (JSVAL_IS_NULL(value)) { g_value_set_string(gvalue, NULL); } else if (JSVAL_IS_STRING(value)) { gchar *utf8_string; if (!gjs_string_to_utf8(context, value, &utf8_string)) return JS_FALSE; g_value_take_string(gvalue, utf8_string); } else { gjs_throw(context, "Wrong type %s; string expected", gjs_get_type_name(value)); return JS_FALSE; } } else if (gtype == G_TYPE_CHAR) { gint32 i; if (JS_ValueToInt32(context, value, &i) && i >= SCHAR_MIN && i <= SCHAR_MAX) { g_value_set_schar(gvalue, (signed char)i); } else { gjs_throw(context, "Wrong type %s; char expected", gjs_get_type_name(value)); return JS_FALSE; } } else if (gtype == G_TYPE_UCHAR) { guint16 i; if (JS_ValueToUint16(context, value, &i) && i <= UCHAR_MAX) { g_value_set_uchar(gvalue, (unsigned char)i); } else { gjs_throw(context, "Wrong type %s; unsigned char expected", gjs_get_type_name(value)); return JS_FALSE; } } else if (gtype == G_TYPE_INT) { gint32 i; if (JS_ValueToInt32(context, value, &i)) { g_value_set_int(gvalue, i); } else { gjs_throw(context, "Wrong type %s; integer expected", gjs_get_type_name(value)); return JS_FALSE; } } else if (gtype == G_TYPE_DOUBLE) { gdouble d; if (JS_ValueToNumber(context, value, &d)) { g_value_set_double(gvalue, d); } else { gjs_throw(context, "Wrong type %s; double expected", gjs_get_type_name(value)); return JS_FALSE; } } else if (gtype == G_TYPE_FLOAT) { gdouble d; if (JS_ValueToNumber(context, value, &d)) { g_value_set_float(gvalue, d); } else { gjs_throw(context, "Wrong type %s; float expected", gjs_get_type_name(value)); return JS_FALSE; } } else if (gtype == G_TYPE_UINT) { guint32 i; if (JS_ValueToECMAUint32(context, value, &i)) { g_value_set_uint(gvalue, i); } else { gjs_throw(context, "Wrong type %s; unsigned integer expected", gjs_get_type_name(value)); return JS_FALSE; } } else if (gtype == G_TYPE_BOOLEAN) { JSBool b; /* JS_ValueToBoolean() pretty much always succeeds, * which is maybe surprising sometimes, but could * be handy also... */ if (JS_ValueToBoolean(context, value, &b)) { g_value_set_boolean(gvalue, b); } else { gjs_throw(context, "Wrong type %s; boolean expected", gjs_get_type_name(value)); return JS_FALSE; } } else if (g_type_is_a(gtype, G_TYPE_OBJECT) || g_type_is_a(gtype, G_TYPE_INTERFACE)) { GObject *gobj; gobj = NULL; if (JSVAL_IS_NULL(value)) { /* nothing to do */ } else if (JSVAL_IS_OBJECT(value)) { JSObject *obj; obj = JSVAL_TO_OBJECT(value); if (!gjs_typecheck_object(context, obj, gtype, JS_TRUE)) return JS_FALSE; gobj = gjs_g_object_from_object(context, obj); } else { gjs_throw(context, "Wrong type %s; object %s expected", gjs_get_type_name(value), g_type_name(gtype)); return JS_FALSE; } g_value_set_object(gvalue, gobj); } else if (gtype == G_TYPE_STRV) { if (JSVAL_IS_NULL(value)) { /* do nothing */ } else if (gjs_object_has_property(context, JSVAL_TO_OBJECT(value), "length")) { jsval length_value; guint32 length; if (!gjs_object_require_property(context, JSVAL_TO_OBJECT(value), NULL, "length", &length_value) || !JS_ValueToECMAUint32(context, length_value, &length)) { gjs_throw(context, "Wrong type %s; strv expected", gjs_get_type_name(value)); return JS_FALSE; } else { void *result; char **strv; if (!gjs_array_to_strv (context, value, length, &result)) return JS_FALSE; /* cast to strv in a separate step to avoid type-punning */ strv = result; g_value_take_boxed (gvalue, strv); } } else { gjs_throw(context, "Wrong type %s; strv expected", gjs_get_type_name(value)); return JS_FALSE; } } else if (g_type_is_a(gtype, G_TYPE_BOXED)) { void *gboxed; gboxed = NULL; if (JSVAL_IS_NULL(value)) { /* nothing to do */ } else if (JSVAL_IS_OBJECT(value)) { JSObject *obj; obj = JSVAL_TO_OBJECT(value); if (g_type_is_a(gtype, G_TYPE_ERROR)) { /* special case GError */ if (!gjs_typecheck_gerror(context, obj, JS_TRUE)) return JS_FALSE; gboxed = gjs_gerror_from_error(context, obj); } else { /* First try a union, if that fails, assume a boxed struct. Distinguishing which one is expected would require checking the associated GIBaseInfo, which is not necessary possible, if e.g. we see the GType without loading the typelib. */ if (gjs_typecheck_union(context, obj, NULL, gtype, JS_FALSE)) { gboxed = gjs_c_union_from_union(context, obj); } else { if (!gjs_typecheck_boxed(context, obj, NULL, gtype, JS_TRUE)) return JS_FALSE; gboxed = gjs_c_struct_from_boxed(context, obj); } } } else { gjs_throw(context, "Wrong type %s; boxed type %s expected", gjs_get_type_name(value), g_type_name(gtype)); return JS_FALSE; } if (no_copy) g_value_set_static_boxed(gvalue, gboxed); else g_value_set_boxed(gvalue, gboxed); } else if (g_type_is_a(gtype, G_TYPE_VARIANT)) { GVariant *variant = NULL; if (JSVAL_IS_NULL(value)) { /* nothing to do */ } else if (JSVAL_IS_OBJECT(value)) { JSObject *obj = JSVAL_TO_OBJECT(value); if (!gjs_typecheck_boxed(context, obj, NULL, G_TYPE_VARIANT, JS_TRUE)) return JS_FALSE; variant = gjs_c_struct_from_boxed(context, obj); } else { gjs_throw(context, "Wrong type %s; boxed type %s expected", gjs_get_type_name(value), g_type_name(gtype)); return JS_FALSE; } g_value_set_variant (gvalue, variant); } else if (g_type_is_a(gtype, G_TYPE_ENUM)) { gint64 value_int64; if (gjs_value_to_int64 (context, value, &value_int64)) { GEnumValue *v; /* See arg.c:_gjs_enum_to_int() */ v = g_enum_get_value(G_ENUM_CLASS(g_type_class_peek(gtype)), (int)value_int64); if (v == NULL) { gjs_throw(context, "%d is not a valid value for enumeration %s", JSVAL_TO_INT(value), g_type_name(gtype)); return JS_FALSE; } g_value_set_enum(gvalue, v->value); } else { gjs_throw(context, "Wrong type %s; enum %s expected", gjs_get_type_name(value), g_type_name(gtype)); return JS_FALSE; } } else if (g_type_is_a(gtype, G_TYPE_FLAGS)) { gint64 value_int64; if (gjs_value_to_int64 (context, value, &value_int64)) { if (!_gjs_flags_value_is_valid(context, gtype, value_int64)) return JS_FALSE; /* See arg.c:_gjs_enum_to_int() */ g_value_set_flags(gvalue, (int)value_int64); } else { gjs_throw(context, "Wrong type %s; flags %s expected", gjs_get_type_name(value), g_type_name(gtype)); return JS_FALSE; } } else if (g_type_is_a(gtype, G_TYPE_PARAM)) { void *gparam; gparam = NULL; if (JSVAL_IS_NULL(value)) { /* nothing to do */ } else if (JSVAL_IS_OBJECT(value)) { JSObject *obj; obj = JSVAL_TO_OBJECT(value); if (!gjs_typecheck_param(context, obj, gtype, JS_TRUE)) return JS_FALSE; gparam = gjs_g_param_from_param(context, obj); } else { gjs_throw(context, "Wrong type %s; param type %s expected", gjs_get_type_name(value), g_type_name(gtype)); return JS_FALSE; } g_value_set_param(gvalue, gparam); } else if (g_type_is_a(gtype, G_TYPE_GTYPE)) { GType type; if (!JSVAL_IS_OBJECT(value)) { gjs_throw(context, "Wrong type %s; expect a GType object", gjs_get_type_name(value)); return JS_FALSE; } type = gjs_gtype_get_actual_gtype(context, JSVAL_TO_OBJECT(value)); g_value_set_gtype(gvalue, type); } else if (g_type_is_a(gtype, G_TYPE_POINTER)) { if (JSVAL_IS_NULL(value)) { /* Nothing to do */ } else { gjs_throw(context, "Cannot convert non-null JS value to G_POINTER"); return JS_FALSE; } } else if (JSVAL_IS_NUMBER(value) && g_value_type_transformable(G_TYPE_INT, gtype)) { /* Only do this crazy gvalue transform stuff after we've * exhausted everything else. Adding this for * e.g. ClutterUnit. */ gint32 i; if (JS_ValueToInt32(context, value, &i)) { GValue int_value = { 0, }; g_value_init(&int_value, G_TYPE_INT); g_value_set_int(&int_value, i); g_value_transform(&int_value, gvalue); } else { gjs_throw(context, "Wrong type %s; integer expected", gjs_get_type_name(value)); return JS_FALSE; } } else { gjs_debug(GJS_DEBUG_GCLOSURE, "jsval is number %d gtype fundamental %d transformable to int %d from int %d", JSVAL_IS_NUMBER(value), G_TYPE_IS_FUNDAMENTAL(gtype), g_value_type_transformable(gtype, G_TYPE_INT), g_value_type_transformable(G_TYPE_INT, gtype)); gjs_throw(context, "Don't know how to convert JavaScript object to GType %s", g_type_name(gtype)); return JS_FALSE; } return JS_TRUE; }
nsresult nsDOMWorkerTimeout::Init(JSContext* aCx, PRUint32 aArgc, jsval* aArgv, PRBool aIsInterval) { NS_ASSERTION(aCx, "Null pointer!"); NS_ASSERTION(aArgv, "Null pointer!"); JSAutoRequest ar(aCx); if (!aArgc) { JS_ReportError(aCx, "Function %s requires at least 1 parameter", aIsInterval ? kSetIntervalStr : kSetTimeoutStr); return NS_ERROR_INVALID_ARG; } PRUint32 interval; if (aArgc > 1) { if (!JS_ValueToECMAUint32(aCx, aArgv[1], (uint32*)&interval)) { JS_ReportError(aCx, "Second argument to %s must be a millisecond value", aIsInterval ? kSetIntervalStr : kSetTimeoutStr); return NS_ERROR_INVALID_ARG; } } else { // If no interval was specified, treat this like a timeout, to avoid // setting an interval of 0 milliseconds. interval = 0; aIsInterval = PR_FALSE; } mInterval = interval; mIsInterval = aIsInterval; mTargetTime = PR_Now() + interval * (PRTime)PR_USEC_PER_MSEC; nsresult rv; switch (JS_TypeOfValue(aCx, aArgv[0])) { case JSTYPE_FUNCTION: mCallback = new FunctionCallback(aArgc, aArgv, &rv); NS_ENSURE_TRUE(mCallback, NS_ERROR_OUT_OF_MEMORY); NS_ENSURE_SUCCESS(rv, rv); break; case JSTYPE_STRING: case JSTYPE_OBJECT: mCallback = new ExpressionCallback(aArgc, aArgv, aCx, &rv); NS_ENSURE_TRUE(mCallback, NS_ERROR_OUT_OF_MEMORY); NS_ENSURE_SUCCESS(rv, rv); break; default: JS_ReportError(aCx, "useless %s call (missing quotes around argument?)", aIsInterval ? kSetIntervalStr : kSetTimeoutStr); // Return an error that nsGlobalWindow can recognize and turn into NS_OK. return NS_ERROR_INVALID_ARG; } nsCOMPtr<nsITimer> timer = do_CreateInstance(NS_TIMER_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); nsIEventTarget* target = static_cast<nsIEventTarget*>(nsDOMThreadService::get()); rv = timer->SetTarget(target); NS_ENSURE_SUCCESS(rv, rv); mTimer.swap(timer); return NS_OK; }
static JSBool rpmts_dbkeys(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { void * ptr = JS_GetInstancePrivate(cx, obj, &rpmtsClass, NULL); rpmts ts = ptr; jsval tagid = JSVAL_VOID; jsval v = JSVAL_VOID; rpmTag tag = RPMTAG_NVRA; rpmMireMode _mode = RPMMIRE_PCRE; const char * _pat = "^a.*$"; ARGV_t _av = NULL; JSBool ok = JS_FALSE; int xx; _METHOD_DEBUG_ENTRY(_debug); if (!(ok = JS_ConvertArguments(cx, argc, argv, "/vvu", &v, &tagid, &v, &_mode))) goto exit; if (!JSVAL_IS_VOID(tagid)) { /* XXX TODO: make sure both tag and key were specified. */ tag = JSVAL_IS_INT(tagid) ? (rpmTag) JSVAL_TO_INT(tagid) : tagValue(JS_GetStringBytes(JS_ValueToString(cx, tagid))); } if (JSVAL_IS_VOID(v)) _pat = "^.*$"; else if (JSVAL_IS_NULL(v)) _pat = NULL; else if (JSVAL_IS_STRING(v)) _pat = JS_GetStringBytes(JS_ValueToString(cx, v)); #ifdef NOTYET else if (JSVAL_IS_NUMBER(v)) { uint32_t _u = 0; if (!JS_ValueToECMAUint32(cx, v, &_u)) { *rval = JSVAL_VOID; goto exit; } } else ; #endif switch (_mode) { default: *rval = JSVAL_VOID; goto exit; break; case RPMMIRE_DEFAULT: case RPMMIRE_STRCMP: case RPMMIRE_REGEX: case RPMMIRE_GLOB: case RPMMIRE_PCRE: break; } if (rpmtsGetRdb(ts) == NULL) xx = rpmtsOpenDB(ts, O_RDONLY); if (rpmdbMireApply(rpmtsGetRdb(ts), tag, _mode, _pat, &_av)) *rval = JSVAL_VOID; else if (_av == NULL || _av[0] == NULL) *rval = JSVAL_NULL; else { int _ac = argvCount(_av); int i; JSObject * arr = JS_NewArrayObject(cx, 0, NULL); *rval = OBJECT_TO_JSVAL(arr); for (i = 0; i < _ac; i++) { v = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, _av[i])); ok = JS_SetElement(cx, arr, i, &v); } } exit: ok = JS_TRUE; _av = argvFree(_av); return ok; }
static JSBool DumpHeap(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char *fileName = NULL; void* startThing = NULL; uint32 startTraceKind = 0; void *thingToFind = NULL; size_t maxDepth = (size_t)-1; void *thingToIgnore = NULL; jsval *vp; FILE *dumpFile; JSBool ok; vp = &argv[0]; if (*vp != JSVAL_NULL && *vp != JSVAL_VOID) { JSString *str; str = JS_ValueToString(cx, *vp); if (!str) return JS_FALSE; *vp = STRING_TO_JSVAL(str); fileName = JS_GetStringBytes(str); } vp = &argv[1]; if (*vp != JSVAL_NULL && *vp != JSVAL_VOID) { if (!JSVAL_IS_TRACEABLE(*vp)) goto not_traceable_arg; startThing = JSVAL_TO_TRACEABLE(*vp); startTraceKind = JSVAL_TRACE_KIND(*vp); } vp = &argv[2]; if (*vp != JSVAL_NULL && *vp != JSVAL_VOID) { if (!JSVAL_IS_TRACEABLE(*vp)) goto not_traceable_arg; thingToFind = JSVAL_TO_TRACEABLE(*vp); } vp = &argv[3]; if (*vp != JSVAL_NULL && *vp != JSVAL_VOID) { uint32 depth; if (!JS_ValueToECMAUint32(cx, *vp, &depth)) return JS_FALSE; maxDepth = depth; } vp = &argv[4]; if (*vp != JSVAL_NULL && *vp != JSVAL_VOID) { if (!JSVAL_IS_TRACEABLE(*vp)) goto not_traceable_arg; thingToIgnore = JSVAL_TO_TRACEABLE(*vp); } if (!fileName) { dumpFile = gOutFile; } else { dumpFile = fopen(fileName, "w"); if (!dumpFile) { fprintf(gErrFile, "dumpHeap: can't open %s: %s\n", fileName, strerror(errno)); return JS_FALSE; } } ok = JS_DumpHeap(cx, dumpFile, startThing, startTraceKind, thingToFind, maxDepth, thingToIgnore); if (dumpFile != gOutFile) fclose(dumpFile); return ok; not_traceable_arg: fprintf(gErrFile, "dumpHeap: argument %u is not null or a heap-allocated thing\n", (unsigned)(vp - argv)); return JS_FALSE; }
static char* FormatJSFrame(JSContext* cx, JSStackFrame* fp, char* buf, int num, JSBool showArgs, JSBool showLocals, JSBool showThisProps) { JSPropertyDescArray callProps = {0, nsnull}; JSPropertyDescArray thisProps = {0, nsnull}; JSBool gotThisVal = JS_FALSE; jsval thisVal; JSObject* callObj = nsnull; JSString* funname = nsnull; JSAutoByteString funbytes; const char* filename = nsnull; PRInt32 lineno = 0; JSFunction* fun = nsnull; uint32 namedArgCount = 0; jsval val; JSBool isString; // get the info for this stack frame JSScript* script = JS_GetFrameScript(cx, fp); jsbytecode* pc = JS_GetFramePC(cx, fp); JSAutoRequest ar(cx); JSAutoEnterCompartment ac; if(!ac.enter(cx, JS_GetFrameScopeChain(cx, fp))) return buf; if(script && pc) { filename = JS_GetScriptFilename(cx, script); lineno = (PRInt32) JS_PCToLineNumber(cx, script, pc); fun = JS_GetFrameFunction(cx, fp); if(fun) funname = JS_GetFunctionId(fun); if(showArgs || showLocals) { callObj = JS_GetFrameCallObject(cx, fp); if(callObj) if(!JS_GetPropertyDescArray(cx, callObj, &callProps)) callProps.array = nsnull; // just to be sure } gotThisVal = JS_GetFrameThis(cx, fp, &thisVal); if (!gotThisVal || !showThisProps || JSVAL_IS_PRIMITIVE(thisVal) || !JS_GetPropertyDescArray(cx, JSVAL_TO_OBJECT(thisVal), &thisProps)) { thisProps.array = nsnull; // just to be sure } } // print the frame number and function name if(funname) buf = JS_sprintf_append(buf, "%d %s(", num, funbytes.encode(cx, funname)); else if(fun) buf = JS_sprintf_append(buf, "%d anonymous(", num); else buf = JS_sprintf_append(buf, "%d <TOP LEVEL>", num); if(!buf) goto out; // print the function arguments if(showArgs && callObj) { for(uint32 i = 0; i < callProps.length; i++) { JSPropertyDesc* desc = &callProps.array[i]; if(desc->flags & JSPD_ARGUMENT) { JSAutoByteString nameBytes; const char* name = JSVAL2String(cx, desc->id, &isString, &nameBytes); if(!isString) name = nsnull; JSAutoByteString valueBytes; const char* value = JSVAL2String(cx, desc->value, &isString, &valueBytes); buf = JS_sprintf_append(buf, "%s%s%s%s%s%s", namedArgCount ? ", " : "", name ? name :"", name ? " = " : "", isString ? "\"" : "", value ? value : "?unknown?", isString ? "\"" : ""); if(!buf) goto out; namedArgCount++; } } // print any unnamed trailing args (found in 'arguments' object) if(JS_GetProperty(cx, callObj, "arguments", &val) && JSVAL_IS_OBJECT(val)) { uint32 argCount; JSObject* argsObj = JSVAL_TO_OBJECT(val); if(JS_GetProperty(cx, argsObj, "length", &val) && JS_ValueToECMAUint32(cx, val, &argCount) && argCount > namedArgCount) { for(uint32 k = namedArgCount; k < argCount; k++) { char number[8]; JS_snprintf(number, 8, "%d", (int) k); if(JS_GetProperty(cx, argsObj, number, &val)) { JSAutoByteString valueBytes; const char *value = JSVAL2String(cx, val, &isString, &valueBytes); buf = JS_sprintf_append(buf, "%s%s%s%s", k ? ", " : "", isString ? "\"" : "", value ? value : "?unknown?", isString ? "\"" : ""); if(!buf) goto out; } } } } } // print filename and line number buf = JS_sprintf_append(buf, "%s [\"%s\":%d]\n", fun ? ")" : "", filename ? filename : "<unknown>", lineno); if(!buf) goto out; // print local variables if(showLocals && callProps.array) { for(uint32 i = 0; i < callProps.length; i++) { JSPropertyDesc* desc = &callProps.array[i]; if(desc->flags & JSPD_VARIABLE) { JSAutoByteString nameBytes; JSAutoByteString valueBytes; const char *name = JSVAL2String(cx, desc->id, nsnull, &nameBytes); const char *value = JSVAL2String(cx, desc->value, &isString, &valueBytes); if(name && value) { buf = JS_sprintf_append(buf, TAB "%s = %s%s%s\n", name, isString ? "\"" : "", value, isString ? "\"" : ""); if(!buf) goto out; } } } } // print the value of 'this' if(showLocals) { if(gotThisVal) { JSString* thisValStr; JSAutoByteString thisValBytes; if(nsnull != (thisValStr = JS_ValueToString(cx, thisVal)) && thisValBytes.encode(cx, thisValStr)) { buf = JS_sprintf_append(buf, TAB "this = %s\n", thisValBytes.ptr()); if(!buf) goto out; } } else buf = JS_sprintf_append(buf, TAB "<failed to get 'this' value>\n"); } // print the properties of 'this', if it is an object if(showThisProps && thisProps.array) { for(uint32 i = 0; i < thisProps.length; i++) { JSPropertyDesc* desc = &thisProps.array[i]; if(desc->flags & JSPD_ENUMERATE) { JSAutoByteString nameBytes; JSAutoByteString valueBytes; const char *name = JSVAL2String(cx, desc->id, nsnull, &nameBytes); const char *value = JSVAL2String(cx, desc->value, &isString, &valueBytes); if(name && value) { buf = JS_sprintf_append(buf, TAB "this.%s = %s%s%s\n", name, isString ? "\"" : "", value, isString ? "\"" : ""); if(!buf) goto out; } } } } out: if(callProps.array) JS_PutPropertyDescArray(cx, &callProps); if(thisProps.array) JS_PutPropertyDescArray(cx, &thisProps); return buf; }