0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-10-02 13:48:53 +02:00

ircd::js: Improve function information + decompile.

This commit is contained in:
Jason Volk 2016-10-23 22:43:10 -07:00
parent b69444138f
commit 9f85b39506

View file

@ -25,18 +25,20 @@
namespace ircd {
namespace js {
string decompile(const JS::Handle<JSFunction *> &, const bool &pretty = false);
string display_name(const JSFunction &);
string name(const JSFunction &);
struct function
:JS::Rooted<JSFunction *>
{
operator JSObject *() const;
explicit operator script() const;
explicit operator string() const;
value operator()(const object &, const JS::HandleValueArray &args) const;
value operator()(const object &) const;
string display_name() const;
string name() const;
// new function
function(JS::AutoObjectVector &stack,
const JS::CompileOptions &opts,
@ -53,9 +55,6 @@ struct function
function &operator=(function &&) noexcept;
};
string display_name(const function &);
string name(const function &);
inline
function::function()
:JS::Rooted<JSFunction *>{*cx}
@ -105,20 +104,11 @@ function::function(const value &val)
throw type_error("value is not a function");
}
inline string
function::name()
inline
function::operator string()
const
{
const auto ret(JS_GetFunctionId(*this));
return ret? string(ret) : string("<unnamed>");
}
inline string
function::display_name()
const
{
const auto ret(JS_GetFunctionDisplayId(*this));
return ret? string(ret) : string("<anonymous>");
return decompile(*this, true);
}
inline
@ -140,15 +130,26 @@ const
}
inline string
name(const function &f)
name(const JSFunction &f)
{
return f.name();
const auto ret(JS_GetFunctionId(const_cast<JSFunction *>(&f)));
return ret? string(ret) : string("<unnamed>");
}
inline string
display_name(const function &f)
display_name(const JSFunction &f)
{
return f.display_name();
const auto ret(JS_GetFunctionDisplayId(const_cast<JSFunction *>(&f)));
return ret? string(ret) : string("<anonymous>");
}
inline string
decompile(const JS::Handle<JSFunction *> &f,
const bool &pretty)
{
uint flags(0);
flags |= pretty? 0 : JS_DONT_PRETTY_PRINT;
return JS_DecompileFunction(*cx, f, flags);
}
} // namespace js