Bug 969798 - Convert JS_ConvertArguments APIs to take CallArgs rather than raw Value pointer r=terrence

This commit is contained in:
Jon Coppeard 2014-02-10 16:42:27 +00:00
parent cb4d976e7c
commit f78663e243
7 changed files with 52 additions and 46 deletions

View File

@ -167,7 +167,9 @@ private:
static bool
Slice(JSContext* aCx, unsigned aArgc, jsval* aVp)
{
JS::Rooted<JSObject*> obj(aCx, JS_THIS_OBJECT(aCx, aVp));
JS::CallArgs args = JS::CallArgsFromVp(aArgc, aVp);
JS::Rooted<JSObject*> obj(aCx, args.thisv().toObjectOrNull());
if (!obj) {
return false;
}
@ -179,7 +181,7 @@ private:
double start = 0, end = 0;
JS::Rooted<JSString*> jsContentType(aCx, JS_GetEmptyString(JS_GetRuntime(aCx)));
if (!JS_ConvertArguments(aCx, aArgc, JS_ARGV(aCx, aVp), "/IIS", &start,
if (!JS_ConvertArguments(aCx, args, "/IIS", &start,
&end, jsContentType.address())) {
return false;
}
@ -203,7 +205,7 @@ private:
return false;
}
JS_SET_RVAL(aCx, aVp, OBJECT_TO_JSVAL(rtnObj));
args.rval().setObject(*rtnObj);
return true;
}
};

View File

@ -191,7 +191,7 @@ AssertHeapIsIdleOrStringIsFlat(JSContext *cx, JSString *str)
}
JS_PUBLIC_API(bool)
JS_ConvertArguments(JSContext *cx, unsigned argc, jsval *argv, const char *format, ...)
JS_ConvertArguments(JSContext *cx, const CallArgs &args, const char *format, ...)
{
va_list ap;
bool ok;
@ -199,15 +199,15 @@ JS_ConvertArguments(JSContext *cx, unsigned argc, jsval *argv, const char *forma
AssertHeapIsIdle(cx);
va_start(ap, format);
ok = JS_ConvertArgumentsVA(cx, argc, argv, format, ap);
ok = JS_ConvertArgumentsVA(cx, args, format, ap);
va_end(ap);
return ok;
}
JS_PUBLIC_API(bool)
JS_ConvertArgumentsVA(JSContext *cx, unsigned argc, jsval *argv, const char *format, va_list ap)
JS_ConvertArgumentsVA(JSContext *cx, const CallArgs &args, const char *format, va_list ap)
{
jsval *sp;
unsigned index = 0;
bool required;
char c;
double d;
@ -217,8 +217,7 @@ JS_ConvertArgumentsVA(JSContext *cx, unsigned argc, jsval *argv, const char *for
AssertHeapIsIdle(cx);
CHECK_REQUEST(cx);
assertSameCompartment(cx, JSValueArray(argv - 2, argc + 2));
sp = argv;
assertSameCompartment(cx, args);
required = true;
while ((c = *format++) != '\0') {
if (isspace(c))
@ -227,24 +226,23 @@ JS_ConvertArgumentsVA(JSContext *cx, unsigned argc, jsval *argv, const char *for
required = false;
continue;
}
if (sp == argv + argc) {
if (index == args.length()) {
if (required) {
HandleValue callee = HandleValue::fromMarkedLocation(&argv[-2]);
if (JSFunction *fun = ReportIfNotFunction(cx, callee)) {
if (JSFunction *fun = ReportIfNotFunction(cx, args.calleev())) {
char numBuf[12];
JS_snprintf(numBuf, sizeof numBuf, "%u", argc);
JS_snprintf(numBuf, sizeof numBuf, "%u", args.length());
JSAutoByteString funNameBytes;
if (const char *name = GetFunctionNameBytes(cx, fun, &funNameBytes)) {
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr,
JSMSG_MORE_ARGS_NEEDED,
name, numBuf, (argc == 1) ? "" : "s");
name, numBuf, (args.length() == 1) ? "" : "s");
}
}
return false;
}
break;
}
RootedValue arg(cx, *sp);
MutableHandleValue arg = args[index++];
switch (c) {
case 'b':
*va_arg(ap, bool *) = ToBoolean(arg);
@ -273,11 +271,10 @@ JS_ConvertArgumentsVA(JSContext *cx, unsigned argc, jsval *argv, const char *for
break;
case 'S':
case 'W':
val = *sp;
str = ToString<CanGC>(cx, val);
str = ToString<CanGC>(cx, arg);
if (!str)
return false;
*sp = STRING_TO_JSVAL(str);
arg.setString(str);
if (c == 'W') {
JSFlatString *flat = str->ensureFlat(cx);
if (!flat)
@ -288,26 +285,25 @@ JS_ConvertArgumentsVA(JSContext *cx, unsigned argc, jsval *argv, const char *for
}
break;
case 'o':
if (sp->isNullOrUndefined()) {
if (arg.isNullOrUndefined()) {
obj = nullptr;
} else {
RootedValue v(cx, *sp);
obj = ToObject(cx, v);
obj = ToObject(cx, arg);
if (!obj)
return false;
}
*sp = ObjectOrNullValue(obj);
arg.setObjectOrNull(obj);
*va_arg(ap, JSObject **) = obj;
break;
case 'f':
obj = ReportIfNotFunction(cx, HandleValue::fromMarkedLocation(sp));
obj = ReportIfNotFunction(cx, arg);
if (!obj)
return false;
*sp = OBJECT_TO_JSVAL(obj);
arg.setObject(*obj);
*va_arg(ap, JSFunction **) = &obj->as<JSFunction>();
break;
case 'v':
*va_arg(ap, jsval *) = *sp;
*va_arg(ap, jsval *) = arg;
break;
case '*':
break;
@ -315,7 +311,6 @@ JS_ConvertArgumentsVA(JSContext *cx, unsigned argc, jsval *argv, const char *for
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_BAD_CHAR, format);
return false;
}
sp++;
}
return true;
}

View File

@ -996,13 +996,12 @@ JS_GetEmptyString(JSRuntime *rt);
* unconverted arguments.
*/
extern JS_PUBLIC_API(bool)
JS_ConvertArguments(JSContext *cx, unsigned argc, jsval *argv, const char *format,
...);
JS_ConvertArguments(JSContext *cx, const JS::CallArgs &args, const char *format, ...);
#ifdef va_start
extern JS_PUBLIC_API(bool)
JS_ConvertArgumentsVA(JSContext *cx, unsigned argc, jsval *argv,
const char *format, va_list ap);
JS_ConvertArgumentsVA(JSContext *cx, const JS::CallArgs &args, const char *format,
va_list ap);
#endif
extern JS_PUBLIC_API(bool)

View File

@ -171,8 +171,14 @@ static const JSClass pm_class = {
static bool
pm_construct(JSContext* cx, unsigned argc, jsval* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
uint32_t mask;
if (!JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "u", &mask))
if (!args.hasDefined(0)) {
js_ReportMissingArg(cx, args.calleev(), 0);
return false;
}
if (!JS::ToUint32(cx, args[0], &mask))
return false;
JS::RootedObject obj(cx, JS_NewObjectForConstructor(cx, &pm_class, vp));
@ -189,7 +195,7 @@ pm_construct(JSContext* cx, unsigned argc, jsval* vp)
}
JS_SetPrivate(obj, p);
*vp = OBJECT_TO_JSVAL(obj);
args.rval().setObject(*obj);
return true;
}

View File

@ -1364,7 +1364,7 @@ Quit(JSContext *cx, unsigned argc, jsval *vp)
#endif
CallArgs args = CallArgsFromVp(argc, vp);
JS_ConvertArguments(cx, args.length(), args.array(), "/ i", &gExitCode);
JS_ConvertArguments(cx, args, "/ i", &gExitCode);
gQuitting = true;
return false;
@ -2227,7 +2227,7 @@ DumpObject(JSContext *cx, unsigned argc, jsval *vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
RootedObject arg0(cx);
if (!JS_ConvertArguments(cx, args.length(), args.array(), "o", arg0.address()))
if (!JS_ConvertArguments(cx, args, "o", arg0.address()))
return false;
js_DumpObject(arg0);
@ -2480,9 +2480,11 @@ NewSandbox(JSContext *cx, bool lazy)
static bool
EvalInContext(JSContext *cx, unsigned argc, jsval *vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
RootedString str(cx);
RootedObject sobj(cx);
if (!JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "S / o", str.address(), sobj.address()))
if (!JS_ConvertArguments(cx, args, "S / o", str.address(), sobj.address()))
return false;
size_t srclen;
@ -2507,7 +2509,7 @@ EvalInContext(JSContext *cx, unsigned argc, jsval *vp)
}
if (srclen == 0) {
JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(sobj));
args.rval().setObject(*sobj);
return true;
}
@ -2515,7 +2517,6 @@ EvalInContext(JSContext *cx, unsigned argc, jsval *vp)
unsigned lineno;
JS_DescribeScriptedCaller(cx, &script, &lineno);
RootedValue rval(cx);
{
Maybe<JSAutoCompartment> ac;
unsigned flags;
@ -2535,15 +2536,14 @@ EvalInContext(JSContext *cx, unsigned argc, jsval *vp)
if (!JS_EvaluateUCScript(cx, sobj, src, srclen,
script->filename(),
lineno,
&rval)) {
args.rval())) {
return false;
}
}
if (!cx->compartment()->wrap(cx, &rval))
if (!cx->compartment()->wrap(cx, args.rval()))
return false;
JS_SET_RVAL(cx, vp, rval);
return true;
}

View File

@ -379,7 +379,7 @@ static bool
Quit(JSContext *cx, unsigned argc, jsval *vp)
{
gExitCode = 0;
JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp),"/ i", &gExitCode);
JS_ConvertArguments(cx, JS::CallArgsFromVp(argc, vp),"/ i", &gExitCode);
gQuitting = true;
// exit(0);

View File

@ -395,13 +395,15 @@ bool PACResolveToString(const nsCString &aHostName,
static
bool PACDnsResolve(JSContext *cx, unsigned int argc, JS::Value *vp)
{
JS::CallArgs args = CallArgsFromVp(argc, vp);
if (NS_IsMainThread()) {
NS_WARNING("DNS Resolution From PAC on Main Thread. How did that happen?");
return false;
}
JS::Rooted<JSString*> arg1(cx);
if (!JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "S", arg1.address()))
if (!JS_ConvertArguments(cx, args, "S", arg1.address()))
return false;
nsDependentJSString hostName;
@ -411,10 +413,10 @@ bool PACDnsResolve(JSContext *cx, unsigned int argc, JS::Value *vp)
return false;
if (PACResolveToString(NS_ConvertUTF16toUTF8(hostName), dottedDecimal, 0)) {
JSString *dottedDecimalString = JS_NewStringCopyZ(cx, dottedDecimal.get());
JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(dottedDecimalString));
args.rval().setString(dottedDecimalString);
}
else {
JS_SET_RVAL(cx, vp, JSVAL_NULL);
args.rval().setNull();
}
return true;
@ -441,8 +443,10 @@ bool PACMyIpAddress(JSContext *cx, unsigned int argc, JS::Value *vp)
static
bool PACProxyAlert(JSContext *cx, unsigned int argc, JS::Value *vp)
{
JS::CallArgs args = CallArgsFromVp(argc, vp);
JS::Rooted<JSString*> arg1(cx);
if (!JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "S", arg1.address()))
if (!JS_ConvertArguments(cx, args, "S", arg1.address()))
return false;
nsDependentJSString message;
@ -455,7 +459,7 @@ bool PACProxyAlert(JSContext *cx, unsigned int argc, JS::Value *vp)
alertMessage += message;
PACLogToConsole(alertMessage);
JS_SET_RVAL(cx, vp, JSVAL_VOID); /* return undefined */
args.rval().setUndefined(); /* return undefined */
return true;
}