/* * 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_OBJECT_H namespace ircd { namespace js { namespace basic { template struct object :root { using handle = typename root::handle; using handle_mutable = typename root::handle_mutable; operator JS::Value() const; // new object object(const JSClass *const &, const handle &ctor, const JS::HandleValueArray &args); object(const JSClass *const &, const JS::CallArgs &args); object(const JSClass *const &, const object &proto); object(const JSClass *const &); template object(const root &); using root::root; object(const value &); object(JSObject *const &); object(JSObject &); object(); }; } // namespace basic using object = basic::object; using heap_object = basic::object; // // Implementation // namespace basic { template object::object() :object::root::type { JS_NewPlainObject(*cx) } { } template object::object(JSObject &obj) :object::root::type{&obj} { } template object::object(JSObject *const &obj) :object::root::type{obj} { if(unlikely(!this->get())) throw internal_error("NULL object"); } template object::object(const value &val) :object::root::type{} { if(!JS_ValueToObject(*cx, val, &(*this))) throw type_error("Value is not an Object"); } template template object::object(const root &o) :object{o.get()} { } template object::object(const JSClass *const &clasp) :object::root::type { JS_NewObject(*cx, clasp) } { } template object::object(const JSClass *const &clasp, const object &proto) :object::root::type { JS_NewObjectWithGivenProto(*cx, clasp, proto) } { } template object::object(const JSClass *const &clasp, const JS::CallArgs &args) :object::root::type { JS_NewObjectForConstructor(*cx, clasp, args) } { } template object::object(const JSClass *const &clasp, const object::handle &ctor, const JS::HandleValueArray &args) :object::root::type { JS_New(*cx, ctor, args) } { } template object::operator JS::Value() const { return this->get()? JS::ObjectValue(*this->get()) : JS::NullValue(); } } // namespace basic } // namespace js } // namespace ircd