--HG--
extra : rebase_source : d30077db8a0b524243a41e667de22ba0b963b2de
This commit is contained in:
Jeff Walden 2016-09-30 13:11:53 -07:00
Родитель bc403f8efa
Коммит 5d99b819c6
11 изменённых файлов: 30 добавлений и 28 удалений

Просмотреть файл

@ -115,7 +115,7 @@ Instance::callImport(JSContext* cx, uint32_t funcImportIndex, unsigned argc, con
const FuncImport& fi = metadata().funcImports[funcImportIndex];
InvokeArgs args(cx);
if (!args.init(argc))
if (!args.init(cx, argc))
return false;
bool hasI64Arg = false;

Просмотреть файл

@ -39,11 +39,7 @@ InitArgsFromArrayLike(JSContext* cx, HandleValue v, InvokeArgs* args)
return false;
// Allocate space for the arguments.
if (len > ARGS_LENGTH_MAX) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_TOO_MANY_FUN_APPLY_ARGS);
return false;
}
if (!args->init(len))
if (!args->init(cx, len))
return false;
// Steps 6-8.

Просмотреть файл

@ -338,7 +338,7 @@ class NodeBuilder
template <typename... Arguments>
MOZ_MUST_USE bool callback(HandleValue fun, Arguments&&... args) {
InvokeArgs iargs(cx);
if (!iargs.init(sizeof...(args) - 2 + size_t(saveLoc)))
if (!iargs.init(cx, sizeof...(args) - 2 + size_t(saveLoc)))
return false;
return callbackHelper(fun, iargs, 0, Forward<Arguments>(args)...);

Просмотреть файл

@ -71,7 +71,7 @@ InvokeFunction(JSContext* cx, HandleObject obj, bool constructing, uint32_t argc
}
ConstructArgs cargs(cx);
if (!cargs.init(argc))
if (!cargs.init(cx, argc))
return false;
for (uint32_t i = 0; i < argc; i++)
@ -102,7 +102,7 @@ InvokeFunction(JSContext* cx, HandleObject obj, bool constructing, uint32_t argc
}
InvokeArgs args(cx);
if (!args.init(argc))
if (!args.init(cx, argc))
return false;
for (size_t i = 0; i < argc; i++)

Просмотреть файл

@ -143,7 +143,7 @@ MSG_DEF(JSMSG_DEPRECATED_USAGE, 1, JSEXN_REFERENCEERR, "deprecated {0} us
MSG_DEF(JSMSG_NOT_SCRIPTED_FUNCTION, 1, JSEXN_TYPEERR, "{0} is not a scripted function")
MSG_DEF(JSMSG_NO_REST_NAME, 0, JSEXN_SYNTAXERR, "no parameter name after ...")
MSG_DEF(JSMSG_PARAMETER_AFTER_REST, 0, JSEXN_SYNTAXERR, "parameter after rest parameter")
MSG_DEF(JSMSG_TOO_MANY_FUN_APPLY_ARGS, 0, JSEXN_RANGEERR, "arguments array passed to Function.prototype.apply is too large")
MSG_DEF(JSMSG_TOO_MANY_ARGUMENTS, 0, JSEXN_RANGEERR, "too many arguments provided for a function call")
// CSP
MSG_DEF(JSMSG_CSP_BLOCKED_EVAL, 0, JSEXN_ERR, "call to eval() blocked by CSP")

Просмотреть файл

@ -1239,7 +1239,7 @@ js::fun_call(JSContext* cx, unsigned argc, Value* vp)
argCount--; // strip off provided |this|
InvokeArgs iargs(cx);
if (!iargs.init(argCount))
if (!iargs.init(cx, argCount))
return false;
for (size_t i = 0; i < argCount; i++)
@ -1279,7 +1279,7 @@ js::fun_apply(JSContext* cx, unsigned argc, Value* vp)
// Step 3-6.
ScriptFrameIter iter(cx);
MOZ_ASSERT(iter.numActualArgs() <= ARGS_LENGTH_MAX);
if (!args2.init(iter.numActualArgs()))
if (!args2.init(cx, iter.numActualArgs()))
return false;
// Steps 7-8.
@ -1300,13 +1300,10 @@ js::fun_apply(JSContext* cx, unsigned argc, Value* vp)
return false;
// Step 6.
if (length > ARGS_LENGTH_MAX) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_TOO_MANY_FUN_APPLY_ARGS);
if (!args2.init(cx, length))
return false;
}
if (!args2.init(length))
return false;
MOZ_ASSERT(length <= ARGS_LENGTH_MAX);
// Steps 7-8.
if (!GetElements(cx, aobj, length, args2.array()))

Просмотреть файл

@ -368,7 +368,7 @@ CrossCompartmentWrapper::nativeCall(JSContext* cx, IsAcceptableThis test, Native
{
AutoCompartment call(cx, wrapped);
InvokeArgs dstArgs(cx);
if (!dstArgs.init(srcArgs.length()))
if (!dstArgs.init(cx, srcArgs.length()))
return false;
Value* src = srcArgs.base();

Просмотреть файл

@ -1702,7 +1702,7 @@ CallMethodIfPresent(JSContext* cx, HandleObject obj, const char* name, size_t ar
return true;
InvokeArgs args(cx);
if (!args.init(argc))
if (!args.init(cx, argc))
return false;
for (size_t i = 0; i < argc; i++)
@ -9954,7 +9954,7 @@ DebuggerObject::call(JSContext* cx, HandleDebuggerObject object, HandleValue thi
{
InvokeArgs invokeArgs(cx);
ok = invokeArgs.init(args2.length());
ok = invokeArgs.init(cx, args2.length());
if (ok) {
for (size_t i = 0; i < args2.length(); ++i)
invokeArgs[i].set(args2[i]);

Просмотреть файл

@ -4735,6 +4735,8 @@ js::SpreadCallOperation(JSContext* cx, HandleScript script, jsbytecode* pc, Hand
JSOp op = JSOp(*pc);
bool constructing = op == JSOP_SPREADNEW || op == JSOP_SPREADSUPERCALL;
// {Construct,Invoke}Args::init does this too, but this gives us a better
// error message.
if (length > ARGS_LENGTH_MAX) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
constructing ? JSMSG_TOO_MANY_CON_SPREADARGS
@ -4770,7 +4772,7 @@ js::SpreadCallOperation(JSContext* cx, HandleScript script, jsbytecode* pc, Hand
return false;
ConstructArgs cargs(cx);
if (!cargs.init(length))
if (!cargs.init(cx, length))
return false;
if (!GetElements(cx, aobj, length, cargs.array()))
@ -4782,7 +4784,7 @@ js::SpreadCallOperation(JSContext* cx, HandleScript script, jsbytecode* pc, Hand
res.setObject(*obj);
} else {
InvokeArgs args(cx);
if (!args.init(length))
if (!args.init(cx, length))
return false;
if (!GetElements(cx, aobj, length, args.array()))

Просмотреть файл

@ -214,7 +214,7 @@ intrinsic_UnsafeCallWrappedFunction(JSContext* cx, unsigned argc, Value* vp)
MOZ_RELEASE_ASSERT(fun->as<JSFunction>().isSelfHostedOrIntrinsic());
InvokeArgs args2(cx);
if (!args2.init(args.length() - 2))
if (!args2.init(cx, args.length() - 2))
return false;
args2.setThis(args[1]);
@ -1715,7 +1715,7 @@ CallSelfHostedNonGenericMethod(JSContext* cx, const CallArgs& args)
MOZ_ASSERT(selfHostedFun.toObject().is<JSFunction>());
InvokeArgs args2(cx);
if (!args2.init(args.length() - 1))
if (!args2.init(cx, args.length() - 1))
return false;
for (size_t i = 0; i < args.length() - 1; i++)
@ -1914,7 +1914,7 @@ intrinsic_ConstructFunction(JSContext* cx, unsigned argc, Value* vp)
RootedArrayObject argsList(cx, &args[2].toObject().as<ArrayObject>());
uint32_t len = argsList->length();
ConstructArgs constructArgs(cx);
if (!constructArgs.init(len))
if (!constructArgs.init(cx, len))
return false;
for (uint32_t index = 0; index < len; index++)
constructArgs[index].set(argsList->getDenseElement(index));

Просмотреть файл

@ -23,6 +23,7 @@
#include "jit/Registers.h" // for RegisterDump
#endif
#include "js/RootingAPI.h"
#include "vm/ArgumentsObject.h"
#include "vm/SavedFrame.h"
struct JSCompartment;
@ -35,7 +36,6 @@ class AutoEntryMonitor;
namespace js {
class ArgumentsObject;
class InterpreterRegs;
class CallObject;
class FrameIter;
@ -948,7 +948,12 @@ class GenericArgsBase
explicit GenericArgsBase(JSContext* cx) : v_(cx) {}
public:
bool init(unsigned argc) {
bool init(JSContext* cx, unsigned argc) {
if (argc > ARGS_LENGTH_MAX) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_TOO_MANY_ARGUMENTS);
return false;
}
// callee, this, arguments[, new.target iff constructing]
size_t len = 2 + argc + uint32_t(Construct);
MOZ_ASSERT(len > argc); // no overflow
@ -968,6 +973,8 @@ template <MaybeConstruct Construct, size_t N>
class FixedArgsBase
: public mozilla::Conditional<Construct, AnyConstructArgs, AnyInvokeArgs>::Type
{
static_assert(N <= ARGS_LENGTH_MAX, "o/~ too many args o/~");
protected:
JS::AutoValueArray<2 + N + uint32_t(Construct)> v_;
@ -1024,7 +1031,7 @@ inline bool
FillArgumentsFromArraylike(JSContext* cx, Args& args, const Arraylike& arraylike)
{
uint32_t len = arraylike.length();
if (!args.init(len))
if (!args.init(cx, len))
return false;
for (uint32_t i = 0; i < len; i++)