1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2026-01-04 09:33:30 +00:00

1. Added DynamicBuffer support

2. Changed MemoryStream to use DynamicBuffer instead of native buffer, fixing smbios issue on linux
This commit is contained in:
Bryan Roe
2020-08-07 10:40:52 -07:00
parent c9aaeecca5
commit 1ffe14f22c
3 changed files with 25 additions and 28 deletions

View File

@@ -51,6 +51,12 @@ typedef struct Duktape_EventLoopDispatchData
void *user;
}Duktape_EventLoopDispatchData;
void* Duktape_DynamicBuffer_Resize(duk_context *ctx, duk_idx_t idx, duk_size_t bufSize)
{
void *buffer = ILibMemory_FromRaw(duk_resize_buffer(ctx, idx, bufSize + sizeof(ILibMemory_Header)));
ILibMemory_Size(buffer) = bufSize;
return(buffer);
}
void Duktape_RunOnEventLoop_AbortSink(void *chain, void *user)
{
Duktape_EventLoopDispatchData *tmp = (Duktape_EventLoopDispatchData*)user;

View File

@@ -157,6 +157,9 @@ char *ILibDuktape_String_UTF8ToWide(duk_context *ctx, char *str);
void ILibDuktape_String_UTF8ToWideEx(duk_context *ctx, char *str);
#define Duktape_PushBuffer(ctx, bufSize) ILibMemory_Init(duk_push_fixed_buffer(ctx, (duk_size_t)(bufSize) + sizeof(ILibMemory_Header)), (bufSize), 0, ILibMemory_Types_OTHER)
#define Duktape_PushDynamicBuffer(ctx, bufSize) ILibMemory_Init(duk_push_dynamic_buffer(ctx, (duk_size_t)(bufSize) + sizeof(ILibMemory_Header)), (bufSize), 0, ILibMemory_Types_OTHER)
void* Duktape_DynamicBuffer_Resize(duk_context *ctx, duk_idx_t idx, duk_size_t bufSize);
void Duktape_Console_Log(duk_context *ctx, void *chain, ILibDuktape_LogTypes logType, char *msg, duk_size_t msgLen);
typedef void(*ILibDuktape_NativeUncaughtExceptionHandler)(duk_context *ctx, char *msg, void *user);

View File

@@ -22,6 +22,7 @@ limitations under the License.
#define ILibDuktape_MemoryStream_Internal "\xFF_MemoryStream_Internal"
#define ILibDuktape_MemoryStream_MemoryBuffer "\xFF_MemoryStream_MemoryBuffer"
#ifdef __DOXY__
/*!
@@ -58,28 +59,28 @@ typedef struct ILibDuktape_MemoryStream
char *buffer;
size_t bufferLen;
size_t bufferSize;
}ILibDuktape_MemoryStream;
ILibTransport_DoneState ILibDuktape_MemoryStream_OnWrite(struct ILibDuktape_DuplexStream *stream, char *buffer, int bufferLen, void *user)
{
ILibDuktape_MemoryStream *ms = (ILibDuktape_MemoryStream*)user;
if (ms->bufferSize - ms->bufferLen < (size_t)bufferLen)
if (ILibMemory_Size(ms->buffer) - ms->bufferLen < (size_t)bufferLen)
{
if ((size_t)bufferLen > ms->bufferSize)
duk_push_heapptr(ms->ctx, stream->ParentObject); // [obj]
duk_get_prop_string(ms->ctx, -1, ILibDuktape_MemoryStream_MemoryBuffer);// [obj][buffer]
if ((size_t)bufferLen > ILibMemory_Size(ms->buffer))
{
if ((ms->buffer = (char*)realloc(ms->buffer, ms->bufferSize + bufferLen)) == NULL) { ILIBCRITICALEXITMSG(254, "OUT OF MEMORY"); }
ms->bufferSize += bufferLen;
ms->buffer = Duktape_DynamicBuffer_Resize(ms->ctx, -1, ILibMemory_Size(ms->buffer) + (duk_size_t)bufferLen);
}
else
{
if((ms->buffer = (char*)realloc(ms->buffer, 2*ms->bufferSize)) == NULL) { ILIBCRITICALEXITMSG(254, "OUT OF MEMORY"); }
ms->bufferSize = (2 * ms->bufferSize);
ms->buffer = Duktape_DynamicBuffer_Resize(ms->ctx, -1, 2 * ILibMemory_Size(ms->buffer));
}
duk_pop_2(ms->ctx); // ...
}
memcpy_s(ms->buffer + ms->bufferLen, ms->bufferSize - ms->bufferLen, buffer, bufferLen);
memcpy_s(ms->buffer + ms->bufferLen, ILibMemory_Size(ms->buffer) - ms->bufferLen, buffer, bufferLen);
ms->bufferLen += bufferLen;
return(ILibTransport_DoneState_COMPLETE);
@@ -91,24 +92,12 @@ void ILibDuktape_MemoryStream_OnEnd(struct ILibDuktape_DuplexStream *stream, voi
}
duk_ret_t ILibDuktape_MemoryStream_buffer(duk_context *ctx)
{
duk_push_this(ctx);
duk_get_prop_string(ctx, -1, ILibDuktape_MemoryStream_Internal);
ILibDuktape_MemoryStream *ms = (ILibDuktape_MemoryStream*)Duktape_GetBuffer(ctx, -1, NULL);
duk_push_external_buffer(ctx);
duk_config_buffer(ctx, -1, ms->buffer, ms->bufferLen);
duk_push_buffer_object(ctx, -1, 0, ms->bufferLen, DUK_BUFOBJ_NODEJS_BUFFER);
duk_push_this(ctx); // [ms]
ILibDuktape_MemoryStream *ms = (ILibDuktape_MemoryStream*)Duktape_GetBufferProperty(ctx, -1, ILibDuktape_MemoryStream_Internal);
duk_get_prop_string(ctx, -1, ILibDuktape_MemoryStream_MemoryBuffer);// [ms][buffer]
duk_push_buffer_object(ctx, -1, sizeof(ILibMemory_Header), ms->bufferLen, DUK_BUFOBJ_NODEJS_BUFFER);
return(1);
}
duk_ret_t ILibDuktape_MemoryStream_Finalizer(duk_context *ctx)
{
duk_get_prop_string(ctx, 0, ILibDuktape_MemoryStream_Internal);
ILibDuktape_MemoryStream *ms = (ILibDuktape_MemoryStream*)Duktape_GetBuffer(ctx, -1, NULL);
free(ms->buffer);
return(0);
}
duk_ret_t ILibDuktape_MemoryStream_writeBE(duk_context *ctx)
{
@@ -156,13 +145,12 @@ duk_ret_t ILibDuktape_MemoryStream_new(duk_context *ctx)
ILibDuktape_WriteID(ctx, "memoryStream");
ms = (ILibDuktape_MemoryStream*)Duktape_PushBuffer(ctx, sizeof(ILibDuktape_MemoryStream));
duk_put_prop_string(ctx, -2, ILibDuktape_MemoryStream_Internal); // [ms]
ms->buffer = (char*)ILibMemory_Allocate(initial, 0, NULL, NULL);
ms->bufferSize = (size_t)initial;
ms->buffer = Duktape_PushDynamicBuffer(ctx, (duk_size_t)initial);
duk_put_prop_string(ctx, -2, ILibDuktape_MemoryStream_MemoryBuffer);
ms->ctx = ctx;
ms->s = ILibDuktape_DuplexStream_Init(ctx, ILibDuktape_MemoryStream_OnWrite, ILibDuktape_MemoryStream_OnEnd, NULL, NULL, ms);
ILibDuktape_CreateEventWithGetter(ctx, "buffer", ILibDuktape_MemoryStream_buffer);
ILibDuktape_CreateFinalizer(ctx, ILibDuktape_MemoryStream_Finalizer);
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "size", 4, "writeUInt32BE", ILibDuktape_MemoryStream_writeBE, 1);
ILibDuktape_CreateInstanceMethodWithIntProperty(ctx, "size", 2, "writeUInt16BE", ILibDuktape_MemoryStream_writeBE, 1);