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:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user