From 84383d41d885e421d6d0e822e54d822a4722f1e6 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Sun, 6 Nov 2016 14:40:03 -0800 Subject: [PATCH] ircd::js: Fix unconditional cast of `this` to `object` type in trap::on_call handlers. --- include/ircd/js/trap.h | 2 +- ircd/js.cc | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/include/ircd/js/trap.h b/include/ircd/js/trap.h index 9c5cc7b08..011a8c2d3 100644 --- a/include/ircd/js/trap.h +++ b/include/ircd/js/trap.h @@ -36,7 +36,7 @@ class trap std::map children; // Override these to define JS objects in C - virtual value on_call(object::handle, object::handle, const args &); + virtual value on_call(object::handle, value::handle, const args &); virtual value on_set(object::handle, id::handle, value::handle); virtual value on_get(object::handle, id::handle, value::handle); virtual void on_add(object::handle, id::handle, value::handle); diff --git a/ircd/js.cc b/ircd/js.cc index 2777d7af9..354a1d697 100644 --- a/ircd/js.cc +++ b/ircd/js.cc @@ -734,13 +734,13 @@ noexcept try assert(!pending_exception(*cx)); const struct args args(argc, argv); - object that(args.computeThis(c)); + value that(args.computeThis(c)); object func(args.callee()); - auto &trap_that(from(that)); + //auto &trap_that(from(that)); auto &trap_func(from(func)); - trap_that.debug("call: '%s'", trap_func.name().c_str()); + //trap_that.debug("call: '%s'", trap_func.name().c_str()); trap_func.debug("call"); args.rval().set(trap_func.on_call(func, that, args)); @@ -1091,6 +1091,9 @@ ircd::js::trap::on_get(object::handle obj, id::handle id, value::handle val) { + if(!undefined(val)) + return val; + const string name(id); const auto it(children.find(name)); if(it == end(children)) @@ -1110,7 +1113,7 @@ ircd::js::trap::on_set(object::handle, ircd::js::value ircd::js::trap::on_call(object::handle, - object::handle, + value::handle, const args &) { return {};