1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
/* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
// SPDX-License-Identifier: MIT OR LGPL-2.0-or-later
// SPDX-FileCopyrightText: 2008 litl, LLC
#ifndef GI_UNION_H_
#define GI_UNION_H_
#include <config.h>
#include <girepository.h>
#include <glib-object.h>
#include <js/TypeDecls.h>
#include "gi/cwrapper.h"
#include "gi/wrapperutils.h"
#include "cjs/macros.h"
#include "util/log.h"
namespace JS {
class CallArgs;
}
struct JSClass;
struct JSClassOps;
class UnionPrototype;
class UnionInstance;
class UnionBase
: public GIWrapperBase<UnionBase, UnionPrototype, UnionInstance> {
friend class CWrapperPointerOps<UnionBase>;
friend class GIWrapperBase<UnionBase, UnionPrototype, UnionInstance>;
protected:
explicit UnionBase(UnionPrototype* proto = nullptr)
: GIWrapperBase(proto) {}
static constexpr GjsDebugTopic DEBUG_TOPIC = GJS_DEBUG_GBOXED;
static constexpr const char* DEBUG_TAG = "union";
static const JSClassOps class_ops;
static const JSClass klass;
};
class UnionPrototype : public GIWrapperPrototype<UnionBase, UnionPrototype,
UnionInstance, GIUnionInfo> {
friend class GIWrapperPrototype<UnionBase, UnionPrototype, UnionInstance,
GIUnionInfo>;
friend class GIWrapperBase<UnionBase, UnionPrototype, UnionInstance>;
static constexpr InfoType::Tag info_type_tag = InfoType::Union;
explicit UnionPrototype(GIUnionInfo* info, GType gtype);
~UnionPrototype(void);
GJS_JSAPI_RETURN_CONVENTION
bool resolve_impl(JSContext* cx, JS::HandleObject obj, JS::HandleId id,
bool* resolved);
// Overrides GIWrapperPrototype::constructor_nargs().
[[nodiscard]] unsigned constructor_nargs(void) const { return 0; }
public:
GJS_JSAPI_RETURN_CONVENTION
static bool define_class(JSContext* cx, JS::HandleObject in_object,
GIUnionInfo* info);
};
class UnionInstance
: public GIWrapperInstance<UnionBase, UnionPrototype, UnionInstance> {
friend class GIWrapperInstance<UnionBase, UnionPrototype, UnionInstance>;
friend class GIWrapperBase<UnionBase, UnionPrototype, UnionInstance>;
explicit UnionInstance(UnionPrototype* prototype, JS::HandleObject obj);
~UnionInstance(void);
GJS_JSAPI_RETURN_CONVENTION
bool constructor_impl(JSContext* cx, JS::HandleObject obj,
const JS::CallArgs& args);
public:
GJS_JSAPI_RETURN_CONVENTION
static JSObject* new_for_c_union(JSContext* cx, GIUnionInfo* info,
void* gboxed);
/*
* UnionInstance::copy_union:
*
* Allocate a new union pointer using g_boxed_copy(), from a raw union
* pointer.
*/
void copy_union(void* ptr) { m_ptr = g_boxed_copy(gtype(), ptr); }
GJS_JSAPI_RETURN_CONVENTION
static void* copy_ptr(JSContext* cx, GType gtype, void* ptr);
};
#endif // GI_UNION_H_
|