Tools and libraries to glue C/C++ APIs to high-level languages
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

270 lines
7.3 KiB

// ----------------------------------------------------------------------------
// <auto-generated>
// This is autogenerated code by CppSharp.
// Do not edit this file or all your changes will be lost after re-generation.
// </auto-generated>
// ----------------------------------------------------------------------------
extern "C"
{
#include <quickjs.h>
#include <cutils.h>
#if defined(__GNUC__) || defined(__clang__)
#define js_force_inline inline __attribute__((always_inline))
#else
#define js_force_inline inline
#endif
#define countof(x) (sizeof(x) / sizeof((x)[0]))
enum
{
__JS_ATOM_NULL = JS_ATOM_NULL,
#define DEF(name, str) JS_ATOM_##name,
#include <quickjs-atom.h>
#undef DEF
JS_ATOM_END,
};
struct JS_SignalContext
{
// TODO: List
JSValue function;
JSValue link;
JSContext* ctx;
};
typedef int JS_EventId;
typedef int JS_ClassId;
typedef DynBuf JS_EventMap;
struct JS_EventEntry
{
JS_EventId eventId;
JSValue value;
};
static JS_EventMap* JS_Interop_InitEventMap(JS_EventMap* map)
{
dbuf_init(map);
return map;
}
static void JS_Interop_FreeEventMap(JSContext* ctx, JS_EventMap* map)
{
JS_EventEntry* events = (JS_EventEntry*)map->buf;
int numEvents = (map->size / sizeof(JS_EventEntry));
for (int i = 0; i < numEvents; i++)
if (!JS_IsUndefined(events[i].value))
JS_FreeValue(ctx, events[i].value);
dbuf_free(map);
}
static int JS_Interop_BinarySearch(JS_EventEntry* arr, int l, int r, JS_EventId id)
{
if (r >= l)
{
int mid = l + (r - l) / 2;
// If the element is present at the middle itself
if (arr[mid].eventId == id)
return mid;
// If element is smaller than mid, then it can only be present in left subarray
if (arr[mid].eventId > id)
return JS_Interop_BinarySearch(arr, l, mid - 1, id);
// Else the element can only be present in right subarray
return JS_Interop_BinarySearch(arr, mid + 1, r, id);
}
// We reach here when element is not present in array
return -1;
}
static JSValue JS_Interop_FindEvent(JS_EventMap* map, JS_EventId eventId)
{
JS_EventEntry* events = (JS_EventEntry*)map->buf;
int numEvents = (map->size / sizeof(JS_EventEntry));
if (numEvents == 0)
return JS_UNDEFINED;
int index = JS_Interop_BinarySearch(events, 0, numEvents, eventId);
return index >= 0 ? events[index].value : JS_UNDEFINED;
}
static int JS_Interop_InsertEvent(JS_EventMap* map, JS_EventId eventId, JSValue value)
{
JS_EventEntry* events = (JS_EventEntry*)map->buf;
int numEvents = (map->size / sizeof(JS_EventEntry));
int index = 0;
for (int i = 0; i < numEvents; i++)
{
if (events[i].eventId == eventId)
{
index = -1;
break;
}
if (events[i].eventId > eventId)
{
index = i;
break;
}
index++;
}
if (index == -1)
return -1;
JS_EventEntry entry;
entry.eventId = eventId;
entry.value = value;
dbuf_write(map, index * sizeof(JS_EventEntry), (const uint8_t*)&entry,
sizeof(JS_EventEntry));
return 0;
}
static JSValue JS_Interop_InvokeConstructor(JSContext* ctx, JS_ClassId eventId, JSValue argv[], int argc)
{
// TODO: Error handling.
JSValue proto = JS_GetClassProto(ctx, eventId);
JSValue ctor = JS_GetProperty(ctx, proto, JS_ATOM_constructor);
JSValue instance = JS_CallConstructor(ctx, ctor, argc, argv);
JS_FreeValue(ctx, ctor);
JS_FreeValue(ctx, proto);
return instance;
}
enum JS_Interop_InstanceKind
{
JS_INTEROP_INSTANCE_RAW_POINTER = 1,
JS_INTEROP_INSTANCE_SIGNAL_CONTEXT,
};
struct JS_Interop_ClassData
{
void* instance;
JSContext* ctx;
JS_EventMap events;
};
static JSValue JS_Interop_InitObject(JSContext* ctx, JSValue obj, JS_Interop_InstanceKind kind, void* instance)
{
switch (kind)
{
case JS_INTEROP_INSTANCE_RAW_POINTER:
JS_SetOpaque(obj, instance);
return obj;
case JS_INTEROP_INSTANCE_SIGNAL_CONTEXT:
JS_Interop_ClassData* data = (JS_Interop_ClassData*)js_mallocz(ctx,
sizeof(JS_Interop_ClassData));
data->ctx = ctx;
data->instance = instance;
JS_Interop_InitEventMap(&data->events);
JS_SetOpaque(obj, data);
return obj;
}
return JS_UNDEFINED;
}
static JSValue JS_Interop_CleanupObject(JSValue obj, JS_Interop_InstanceKind kind)
{
switch (kind)
{
case JS_INTEROP_INSTANCE_SIGNAL_CONTEXT:
{
JS_Interop_ClassData* data = (JS_Interop_ClassData*)JS_GetOpaque(obj, JS_GetClassID(obj));
if (data)
{
JS_Interop_FreeEventMap(data->ctx, &data->events);
js_free(data->ctx, data);
}
break;
}
case JS_INTEROP_INSTANCE_RAW_POINTER:
break;
}
return JS_UNDEFINED;
}
static void* JS_Interop_GetInstance(JSValue obj, JS_ClassId classId, JS_Interop_InstanceKind kind)
{
switch (kind)
{
case JS_INTEROP_INSTANCE_RAW_POINTER:
return JS_GetOpaque(obj, classId);
case JS_INTEROP_INSTANCE_SIGNAL_CONTEXT:
JS_Interop_ClassData* data = (JS_Interop_ClassData*)JS_GetOpaque(obj, classId);
return data != nullptr ? data->instance : nullptr;
}
return nullptr;
}
static JSValue JS_Interop_CreateFromInstance(JSContext* ctx, JS_ClassId classId, JS_Interop_InstanceKind kind, void* instance)
{
if (instance == nullptr)
return JS_NULL;
// TODO: Error handling.
JSValue obj = JS_NewObjectClass(ctx, classId);
JS_Interop_InitObject(ctx, obj, kind, instance);
return obj;
}
static inline JS_BOOL JS_IsInt(JSValueConst v)
{
return JS_IsNumber(v);
}
static inline JS_BOOL JS_IsInt8(JSValueConst v)
{
return JS_IsInt(v);
}
static inline JS_BOOL JS_IsUInt8(JSValueConst v)
{
return JS_IsInt(v);
}
static inline JS_BOOL JS_IsInt16(JSValueConst v)
{
return JS_IsInt(v);
}
static inline JS_BOOL JS_IsUInt16(JSValueConst v)
{
return JS_IsInt(v);
}
static inline JS_BOOL JS_IsInt32(JSValueConst v)
{
return JS_IsInt(v);
}
static inline JS_BOOL JS_IsUInt32(JSValueConst v)
{
return JS_IsInt(v);
}
static inline JS_BOOL JS_IsFloat(JSValueConst v)
{
int tag = JS_VALUE_GET_TAG(v);
return JS_TAG_IS_FLOAT64(tag);
}
void register_CppSharp_QuickJS(JSContext* ctx, JSModuleDef* m, bool set, int phase);
#undef js_force_inline
} // extern "C"