diff --git a/include/ircd/js/get.h b/include/ircd/js/get.h new file mode 100644 index 000000000..ef84a9569 --- /dev/null +++ b/include/ircd/js/get.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2016 Charybdis Development Team + * Copyright (C) 2016 Jason Volk + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice is present in all copies. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once +#define HAVE_IRCD_JS_GET_H + +namespace ircd { +namespace js { + +inline bool +get(const JS::HandleObject &obj, + const char *const name, + JS::MutableHandleValue ret) +{ + return JS_GetProperty(*cx, obj, name, ret); +} + +inline bool +get(const JS::HandleObject &obj, + const JS::HandleId &id, + JS::MutableHandleValue ret) +{ + return JS_GetPropertyById(*cx, obj, id, ret); +} + +template +JS::Value +get(const JS::HandleObject &obj, + const key &k) +{ + JS::RootedValue ret(*cx); + get(obj, k, &ret); + return ret.get(); +} + +} // namespace js +} // namespace ircd diff --git a/include/ircd/js/js.h b/include/ircd/js/js.h index 79a50d403..7463a1cee 100644 --- a/include/ircd/js/js.h +++ b/include/ircd/js/js.h @@ -65,6 +65,8 @@ JSVersion version(const char *const &v) { return JS_StringToVersion(v); #include "error.h" #include "id.h" #include "string.h" +#include "priv.h" +#include "get.h" #include "for_each.h" #include "script.h" #include "debug.h" diff --git a/include/ircd/js/priv.h b/include/ircd/js/priv.h new file mode 100644 index 000000000..bedbca6bc --- /dev/null +++ b/include/ircd/js/priv.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2016 Charybdis Development Team + * Copyright (C) 2016 Jason Volk + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice is present in all copies. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once +#define HAVE_IRCD_JS_PRIV_H + +namespace ircd { +namespace js { + +IRCD_EXCEPTION(error, priv_error) + +template +T & +priv(const JS::HandleObject &obj, + const JSClass &jsc) +{ + const auto ret(JS_GetInstancePrivate(*cx, obj, &jsc, nullptr)); + if(!ret) + throw priv_error("Object has no private data"); + + return *static_cast(ret); +} + +template +T & +priv(const JS::HandleObject &obj) +{ + const auto jsc(JS_GetClass(obj)); + if(unlikely(!jsc)) + throw priv_error("Object has no JSClass"); + + return priv(obj, jsc); +} + +} // namespace js +} // namespace ircd