mirror of https://github.com/mono/CppSharp.git
c-sharpdotnetmonobindingsbridgecclangcpluspluscppsharpglueinteropparserparsingpinvokeswigsyntax-treevisitorsxamarinxamarin-bindings
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.
265 lines
6.3 KiB
265 lines
6.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"
|