/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- * vim: set ts=8 sts=2 et sw=2 tw=80: * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* * [SMDOC] JS::CallArgs API * * Helper classes encapsulating access to the callee, |this| value, arguments, * and argument count for a call/construct operation. * * JS::CallArgs encapsulates access to a JSNative's un-abstracted * |unsigned argc, Value* vp| arguments. The principal way to create a * JS::CallArgs is using JS::CallArgsFromVp: * * // If provided no arguments or a non-numeric first argument, return zero. * // Otherwise return |this| exactly as given, without boxing. * static bool * Func(JSContext* cx, unsigned argc, JS::Value* vp) * { * JS::CallArgs args = JS::CallArgsFromVp(argc, vp); * * // Guard against no arguments or a non-numeric arg0. * if (args.length() == 0 || !args[0].isNumber()) { * args.rval().setInt32(0); * return true; * } * * // Access to the callee must occur before accessing/setting * // the return value. * JSObject& callee = args.callee(); * args.rval().setObject(callee); * * // callee() and calleev() will now assert. * * // It's always fine to access thisv(). * HandleValue thisv = args.thisv(); * args.rval().set(thisv); * * // As the return value was last set to |this|, returns |this|. * return true; * } * * CallArgs is exposed publicly and used internally. Not all parts of its * public interface are meant to be used by embedders! See inline comments to * for details. * * It's possible (albeit deprecated) to manually index into |vp| to access the * callee, |this|, and arguments of a function, and to set its return value. * This does not have the error-handling or moving-GC correctness of CallArgs. * New code should use CallArgs instead whenever possible. * * The eventual plan is to change JSNative to take |const CallArgs&| directly, * for automatic assertion of correct use and to make calling functions more * efficient. Embedders should start internally switching away from using * |argc| and |vp| directly, except to create a |CallArgs|. Then, when an * eventual release making that change occurs, porting efforts will require * changing methods' signatures but won't require invasive changes to the * methods' implementations, potentially under time pressure.
*/
/* * Compute |this| for the |vp| inside a JSNative, either boxing primitives or * replacing with the global object as necessary.
*/ extern JS_PUBLIC_API bool ComputeThis(JSContext* cx, JS::Value* vp,
MutableHandleObject thisObject);
template <class WantUsedRval> class MOZ_STACK_CLASS MOZ_NON_PARAM CallArgsBase {
static_assert(std::is_same_v<WantUsedRval, IncludeUsedRval> ||
std::is_same_v<WantUsedRval, NoUsedRval>, "WantUsedRval can only be IncludeUsedRval or NoUsedRval");
/* * Returns the function being called, as a value. Must not be called after * rval() has been used!
*/
HandleValue calleev() const { this->assertUnusedRval(); return HandleValue::fromMarkedLocation(&argv_[-2]);
}
/* * Returns the function being called, as an object. Must not be called * after rval() has been used!
*/
JSObject& callee() const { return calleev().toObject(); }
// CALLING/CONSTRUCTING-DIFFERENTIATIONS
bool isConstructing() const { if (!argv_[-1].isMagic()) { returnfalse;
}
#ifdef JS_DEBUG if (!this->usedRval()) {
CheckIsValidConstructible(calleev());
} #endif
/* * Returns the |this| value passed to the function. This method must not * be called when the function is being called as a constructor via |new|. * The value may or may not be an object: it is the individual function's * responsibility to box the value if needed.
*/
HandleValue thisv() const { // Some internal code uses thisv() in constructing cases, so don't do // this yet. // MOZ_ASSERT(!argv_[-1].isMagic(JS_IS_CONSTRUCTING)); return HandleValue::fromMarkedLocation(&argv_[-1]);
}
/* * Returns the i-th zero-indexed argument, or |undefined| if there's no * such argument.
*/
HandleValue get(unsigned i) const { return i < length() ? HandleValue::fromMarkedLocation(&this->argv_[i])
: UndefinedHandleValue;
}
/* * Returns true if the i-th zero-indexed argument is present and is not * |undefined|.
*/ bool hasDefined(unsigned i) const { return i < argc_ && !this->argv_[i].isUndefined();
}
// RETURN VALUE
/* * Returns the currently-set return value. The initial contents of this * value are unspecified. Once this method has been called, callee() and * calleev() can no longer be used. (If you're compiling against a debug * build of SpiderMonkey, these methods will assert to aid debugging.) * * If the method you're implementing succeeds by returning true, you *must* * set this. (SpiderMonkey doesn't currently assert this, but it will do * so eventually.) You don't need to use or change this if your method * fails.
*/
MutableHandleValue rval() const { this->setUsedRval(); return MutableHandleValue::fromMarkedLocation(&argv_[-2]);
}
/* * Returns true if there are at least |required| arguments passed in. If * false, it reports an error message on the context.
*/
JS_PUBLIC_API inlinebool requireAtLeast(JSContext* cx, constchar* fnname, unsigned required) const;
public: // These methods are publicly exposed, but they are *not* to be used when // implementing a JSNative method and encapsulating access to |vp| within // it. You probably don't want to use these!
public: // These methods are publicly exposed, but we're unsure of the interfaces // (because they're hackish and drop assertions). Avoid using these if you // can.
public: /* * Helper for requireAtLeast to report the actual exception. Public * so we can call it from CallArgsBase and not need multiple * per-template instantiations of it.
*/ static JS_PUBLIC_API void reportMoreArgsNeeded(JSContext* cx, constchar* fnname, unsigned required, unsigned actual);
};
// This method is only intended for internal use in SpiderMonkey. We may // eventually move it to an internal header. Embedders should use // JS::CallArgsFromVp!
MOZ_ALWAYS_INLINE CallArgs CallArgsFromSp(unsigned stackSlots, Value* sp, bool constructing = false, bool ignoresReturnValue = false) { return CallArgs::create(stackSlots - constructing, sp - stackSlots,
constructing, ignoresReturnValue);
}
} // namespace JS
#endif/* js_CallArgs_h */
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.20 Sekunden
(vorverarbeitet am 2026-06-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.