0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-29 02:02:38 +01:00

ircd::js: Add a branch in trap::function handler for constructors.

This commit is contained in:
Jason Volk 2016-11-25 22:53:31 -08:00
parent a149d56afa
commit 7fd111487d
2 changed files with 35 additions and 11 deletions

View file

@ -37,6 +37,7 @@ struct trap::function
protected: protected:
virtual value on_call(object::handle callee, value::handle that, const args &); virtual value on_call(object::handle callee, value::handle that, const args &);
virtual value on_new(object::handle callee, const args &);
private: private:
static function &from(JSObject *const &); static function &from(JSObject *const &);

View file

@ -688,19 +688,34 @@ noexcept try
const struct args args(argc, argv); const struct args args(argc, argv);
const object func(args.callee()); const object func(args.callee());
const value that(args.computeThis(c));
auto &trap(from(func)); auto &trap(from(func));
log.debug("trap(%p) this(%p) %s() call argv[%u]", if(args.isConstructing())
(const void *)&trap, {
(const void *)that.address(), log.debug("trap(%p) %s() ctor argv[%u]",
trap.name.c_str(), (const void *)&trap,
argc); trap.name.c_str(),
argc);
args.rval().set(trap.on_call(func, that, args)); const value that(trap.on_new(func, args));
log.debug("trap(%p) this(%p) %s() leave", args.rval().set(that);
(const void *)&trap, log.debug("trap(%p) this(%p) %s() leave",
(const void *)that.address(), (const void *)&trap,
trap.name.c_str()); (const void *)that.address(),
trap.name.c_str());
} else {
const value that(args.computeThis(c));
log.debug("trap(%p) this(%p) %s() call argv[%u]",
(const void *)&trap,
(const void *)that.address(),
trap.name.c_str(),
argc);
args.rval().set(trap.on_call(func, that, args));
log.debug("trap(%p) this(%p) %s() leave",
(const void *)&trap,
(const void *)that.address(),
trap.name.c_str());
}
return true; return true;
} }
@ -742,6 +757,14 @@ ircd::js::trap::function::on_call(object::handle obj,
return lambda(obj, val, args); return lambda(obj, val, args);
} }
ircd::js::value
ircd::js::trap::function::on_new(object::handle obj,
const args &args)
{
value ud;
return on_call(obj, ud, args);
}
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// //
// ircd/js/trap.h // ircd/js/trap.h