forked from cory/tildefriends
I just decided. Braces on their own lines.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3668 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
167
src/serialize.c
167
src/serialize.c
@ -48,7 +48,8 @@ static int32_t _serialize_readInt32(const char** buffer, size_t* size);
|
||||
static int64_t _serialize_readInt64(const char** buffer, size_t* size);
|
||||
static double _serialize_readDouble(const char** buffer, size_t* size);
|
||||
|
||||
void tf_serialize_store(tf_task_t* task, tf_taskstub_t* to, void** out_buffer, size_t* out_size, JSValue value) {
|
||||
void tf_serialize_store(tf_task_t* task, tf_taskstub_t* to, void** out_buffer, size_t* out_size, JSValue value)
|
||||
{
|
||||
buffer_t tmp = { 0 };
|
||||
_serialize_store(task, to, &tmp, value);
|
||||
tmp.data = realloc(tmp.data, tmp.size);
|
||||
@ -56,12 +57,15 @@ void tf_serialize_store(tf_task_t* task, tf_taskstub_t* to, void** out_buffer, s
|
||||
*out_size = tmp.size;
|
||||
}
|
||||
|
||||
JSValue tf_serialize_load(tf_task_t* task, tf_taskstub_t* from, const char* buffer, size_t size) {
|
||||
JSValue tf_serialize_load(tf_task_t* task, tf_taskstub_t* from, const char* buffer, size_t size)
|
||||
{
|
||||
return _serialize_load(task, from, buffer, size);
|
||||
}
|
||||
|
||||
static void _buffer_append(buffer_t* buffer, const void* data, size_t size) {
|
||||
if (buffer->capacity < buffer->size + size) {
|
||||
static void _buffer_append(buffer_t* buffer, const void* data, size_t size)
|
||||
{
|
||||
if (buffer->capacity < buffer->size + size)
|
||||
{
|
||||
size_t new_capacity = (size + buffer->capacity) * 2;
|
||||
buffer->data = realloc(buffer->data, new_capacity);
|
||||
buffer->capacity = new_capacity;
|
||||
@ -70,54 +74,64 @@ static void _buffer_append(buffer_t* buffer, const void* data, size_t size) {
|
||||
buffer->size += size;
|
||||
}
|
||||
|
||||
void _serialize_writeInt8(buffer_t* buffer, int8_t value) {
|
||||
void _serialize_writeInt8(buffer_t* buffer, int8_t value)
|
||||
{
|
||||
_buffer_append(buffer, &value, sizeof(value));
|
||||
}
|
||||
|
||||
void _serialize_writeInt32(buffer_t* buffer, int32_t value) {
|
||||
void _serialize_writeInt32(buffer_t* buffer, int32_t value)
|
||||
{
|
||||
_buffer_append(buffer, &value, sizeof(value));
|
||||
}
|
||||
|
||||
void _serialize_writeInt64(buffer_t* buffer, int64_t value) {
|
||||
void _serialize_writeInt64(buffer_t* buffer, int64_t value)
|
||||
{
|
||||
_buffer_append(buffer, &value, sizeof(value));
|
||||
}
|
||||
|
||||
void _serialize_writeDouble(buffer_t* buffer, double value) {
|
||||
void _serialize_writeDouble(buffer_t* buffer, double value)
|
||||
{
|
||||
_buffer_append(buffer, &value, sizeof(value));
|
||||
}
|
||||
|
||||
static void _serialize_read(const char** buffer, size_t* size, void* target, size_t target_size) {
|
||||
static void _serialize_read(const char** buffer, size_t* size, void* target, size_t target_size)
|
||||
{
|
||||
assert(*size >= target_size);
|
||||
memcpy(target, *buffer, target_size);
|
||||
*buffer += target_size;
|
||||
*size -= target_size;
|
||||
}
|
||||
|
||||
static int8_t _serialize_readInt8(const char** buffer, size_t* size) {
|
||||
static int8_t _serialize_readInt8(const char** buffer, size_t* size)
|
||||
{
|
||||
int8_t result;
|
||||
_serialize_read(buffer, size, &result, sizeof(result));
|
||||
return result;
|
||||
}
|
||||
|
||||
int32_t _serialize_readInt32(const char** buffer, size_t* size) {
|
||||
int32_t _serialize_readInt32(const char** buffer, size_t* size)
|
||||
{
|
||||
int32_t result;
|
||||
_serialize_read(buffer, size, &result, sizeof(result));
|
||||
return result;
|
||||
}
|
||||
|
||||
int64_t _serialize_readInt64(const char** buffer, size_t* size) {
|
||||
int64_t _serialize_readInt64(const char** buffer, size_t* size)
|
||||
{
|
||||
int64_t result;
|
||||
_serialize_read(buffer, size, &result, sizeof(result));
|
||||
return result;
|
||||
}
|
||||
|
||||
double _serialize_readDouble(const char** buffer, size_t* size) {
|
||||
double _serialize_readDouble(const char** buffer, size_t* size)
|
||||
{
|
||||
double result;
|
||||
_serialize_read(buffer, size, &result, sizeof(result));
|
||||
return result;
|
||||
}
|
||||
|
||||
static bool _serialize_store(tf_task_t* task, tf_taskstub_t* to, buffer_t* buffer, JSValue value) {
|
||||
static bool _serialize_store(tf_task_t* task, tf_taskstub_t* to, buffer_t* buffer, JSValue value)
|
||||
{
|
||||
return _serialize_storeInternal(task, to, buffer, value, 0);
|
||||
}
|
||||
|
||||
@ -129,16 +143,25 @@ static bool _serialize_storeInternal(tf_task_t* task, tf_taskstub_t* to, buffer_
|
||||
size_t element_size;
|
||||
JSValue typed;
|
||||
uint8_t* bytes;
|
||||
if (JS_IsUndefined(value)) {
|
||||
if (JS_IsUndefined(value))
|
||||
{
|
||||
_serialize_writeInt32(buffer, kUndefined);
|
||||
} else if (JS_IsUninitialized(value)) {
|
||||
}
|
||||
else if (JS_IsUninitialized(value))
|
||||
{
|
||||
_serialize_writeInt32(buffer, kUninitialized);
|
||||
} else if (JS_IsNull(value)) {
|
||||
}
|
||||
else if (JS_IsNull(value))
|
||||
{
|
||||
_serialize_writeInt32(buffer, kNull);
|
||||
} else if (JS_IsBool(value)) {
|
||||
}
|
||||
else if (JS_IsBool(value))
|
||||
{
|
||||
_serialize_writeInt32(buffer, kBoolean);
|
||||
_serialize_writeInt8(buffer, JS_ToBool(tf_task_get_context(task), value) ? 1 : 0);
|
||||
} else if (JS_IsNumber(value)) {
|
||||
}
|
||||
else if (JS_IsNumber(value))
|
||||
{
|
||||
int64_t result = 0;
|
||||
if (JS_ToInt64(tf_task_get_context(task), &result, value) == 0)
|
||||
{
|
||||
@ -149,7 +172,9 @@ static bool _serialize_storeInternal(tf_task_t* task, tf_taskstub_t* to, buffer_
|
||||
{
|
||||
fprintf(stderr, "Unable to store integer.\n");
|
||||
}
|
||||
} else if (JS_IsNumber(value)) {
|
||||
}
|
||||
else if (JS_IsNumber(value))
|
||||
{
|
||||
double result = 0.0;
|
||||
if (JS_ToFloat64(tf_task_get_context(task), &result, value) == 0)
|
||||
{
|
||||
@ -160,68 +185,93 @@ static bool _serialize_storeInternal(tf_task_t* task, tf_taskstub_t* to, buffer_
|
||||
{
|
||||
fprintf(stderr, "Unable to store number.\n");
|
||||
}
|
||||
} else if (JS_IsString(value)) {
|
||||
}
|
||||
else if (JS_IsString(value))
|
||||
{
|
||||
size_t len = 0;
|
||||
const char* result = JS_ToCStringLen(tf_task_get_context(task), &len, value);
|
||||
_serialize_writeInt32(buffer, kString);
|
||||
_serialize_writeInt32(buffer, (int32_t)len);
|
||||
_buffer_append(buffer, result, len);
|
||||
JS_FreeCString(tf_task_get_context(task), result);
|
||||
} else if ((bytes = tf_try_get_array_buffer(tf_task_get_context(task), &size, value)) != 0) {
|
||||
}
|
||||
else if ((bytes = tf_try_get_array_buffer(tf_task_get_context(task), &size, value)) != 0)
|
||||
{
|
||||
_serialize_writeInt32(buffer, kArrayBuffer);
|
||||
_serialize_writeInt32(buffer, (int32_t)size);
|
||||
_buffer_append(buffer, bytes, size);
|
||||
} else if (!JS_IsException((typed = tf_try_get_typed_array_buffer(tf_task_get_context(task), value, &offset, &size, &element_size)))) {
|
||||
}
|
||||
else if (!JS_IsException((typed = tf_try_get_typed_array_buffer(tf_task_get_context(task), value, &offset, &size, &element_size))))
|
||||
{
|
||||
size_t total_size;
|
||||
uint8_t* bytes = tf_try_get_array_buffer(tf_task_get_context(task), &total_size, typed);
|
||||
_serialize_writeInt32(buffer, kArrayBuffer);
|
||||
_serialize_writeInt32(buffer, (int32_t)size);
|
||||
_buffer_append(buffer, bytes, size);
|
||||
} else if (JS_IsArray(tf_task_get_context(task), value)) {
|
||||
}
|
||||
else if (JS_IsArray(tf_task_get_context(task), value))
|
||||
{
|
||||
_serialize_writeInt32(buffer, kArray);
|
||||
JSValue length_val = JS_GetPropertyStr(tf_task_get_context(task), value, "length");
|
||||
int length;
|
||||
if (JS_ToInt32(tf_task_get_context(task), &length, length_val) == 0) {
|
||||
if (JS_ToInt32(tf_task_get_context(task), &length, length_val) == 0)
|
||||
{
|
||||
_serialize_writeInt32(buffer, length);
|
||||
for (int i = 0; i < length; ++i) {
|
||||
for (int i = 0; i < length; ++i)
|
||||
{
|
||||
_serialize_storeInternal(task, to, buffer, JS_GetPropertyUint32(tf_task_get_context(task), value, i), depth + 1);
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
_serialize_writeInt32(buffer, 0);
|
||||
}
|
||||
} else if (JS_IsFunction(tf_task_get_context(task), value)) {
|
||||
}
|
||||
else if (JS_IsFunction(tf_task_get_context(task), value))
|
||||
{
|
||||
_serialize_writeInt32(buffer, kFunction);
|
||||
exportid_t exportId = tf_task_export_function(task, to, value);
|
||||
_serialize_writeInt32(buffer, exportId);
|
||||
} else if (JS_IsException(value)) {
|
||||
}
|
||||
else if (JS_IsException(value))
|
||||
{
|
||||
JSValue exception = JS_GetException(context);
|
||||
JSValue error = JS_NewObject(context);
|
||||
JSValue message = JS_GetPropertyStr(context, exception, "message");
|
||||
if (!JS_IsException(message)) {
|
||||
if (!JS_IsException(message))
|
||||
{
|
||||
JS_SetPropertyStr(context, error, "message", message);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
JS_FreeValue(context, message);
|
||||
}
|
||||
if (JS_IsError(context, exception)) {
|
||||
if (JS_IsError(context, exception))
|
||||
{
|
||||
JSValue stack = JS_GetPropertyStr(context, exception, "stack");
|
||||
if (!JS_IsUndefined(stack)) {
|
||||
if (!JS_IsUndefined(stack))
|
||||
{
|
||||
JS_SetPropertyStr(context, error, "stack", JS_DupValue(context, stack));
|
||||
}
|
||||
}
|
||||
_serialize_writeInt32(buffer, kException);
|
||||
_serialize_storeInternal(task, to, buffer, error, depth + 1);
|
||||
JS_FreeValue(context, error);
|
||||
} else if (JS_IsError(tf_task_get_context(task), value)) {
|
||||
}
|
||||
else if (JS_IsError(tf_task_get_context(task), value))
|
||||
{
|
||||
_serialize_writeInt32(buffer, kError);
|
||||
JSPropertyEnum* ptab;
|
||||
uint32_t plen;
|
||||
JS_GetOwnPropertyNames(tf_task_get_context(task), &ptab, &plen, value, JS_GPN_STRING_MASK);
|
||||
_serialize_writeInt32(buffer, plen);
|
||||
for (uint32_t i = 0; i < plen; ++i) {
|
||||
for (uint32_t i = 0; i < plen; ++i)
|
||||
{
|
||||
JSValue key = JS_AtomToString(tf_task_get_context(task), ptab[i].atom);
|
||||
JSPropertyDescriptor desc;
|
||||
JSValue key_value = JS_NULL;
|
||||
if (JS_GetOwnProperty(tf_task_get_context(task), &desc, value, ptab[i].atom) == 1) {
|
||||
if (JS_GetOwnProperty(tf_task_get_context(task), &desc, value, ptab[i].atom) == 1)
|
||||
{
|
||||
key_value = desc.value;
|
||||
}
|
||||
_serialize_storeInternal(task, to, buffer, key, depth + 1);
|
||||
@ -229,21 +279,26 @@ static bool _serialize_storeInternal(tf_task_t* task, tf_taskstub_t* to, buffer_
|
||||
JS_FreeValue(tf_task_get_context(task), key);
|
||||
JS_FreeValue(tf_task_get_context(task), key_value);
|
||||
}
|
||||
for (uint32_t i = 0; i < plen; ++i) {
|
||||
for (uint32_t i = 0; i < plen; ++i)
|
||||
{
|
||||
JS_FreeAtom(tf_task_get_context(task), ptab[i].atom);
|
||||
}
|
||||
js_free(tf_task_get_context(task), ptab);
|
||||
} else if (JS_IsObject(value)) {
|
||||
}
|
||||
else if (JS_IsObject(value))
|
||||
{
|
||||
_serialize_writeInt32(buffer, kObject);
|
||||
JSPropertyEnum* ptab;
|
||||
uint32_t plen;
|
||||
JS_GetOwnPropertyNames(tf_task_get_context(task), &ptab, &plen, value, JS_GPN_STRING_MASK);
|
||||
_serialize_writeInt32(buffer, plen);
|
||||
for (uint32_t i = 0; i < plen; ++i) {
|
||||
for (uint32_t i = 0; i < plen; ++i)
|
||||
{
|
||||
JSValue key = JS_AtomToString(tf_task_get_context(task), ptab[i].atom);
|
||||
JSPropertyDescriptor desc;
|
||||
JSValue key_value = JS_NULL;
|
||||
if (JS_GetOwnProperty(tf_task_get_context(task), &desc, value, ptab[i].atom) == 1) {
|
||||
if (JS_GetOwnProperty(tf_task_get_context(task), &desc, value, ptab[i].atom) == 1)
|
||||
{
|
||||
key_value = desc.value;
|
||||
}
|
||||
_serialize_storeInternal(task, to, buffer, key, depth + 1);
|
||||
@ -251,11 +306,14 @@ static bool _serialize_storeInternal(tf_task_t* task, tf_taskstub_t* to, buffer_
|
||||
JS_FreeValue(tf_task_get_context(task), key);
|
||||
JS_FreeValue(tf_task_get_context(task), key_value);
|
||||
}
|
||||
for (uint32_t i = 0; i < plen; ++i) {
|
||||
for (uint32_t i = 0; i < plen; ++i)
|
||||
{
|
||||
JS_FreeAtom(tf_task_get_context(task), ptab[i].atom);
|
||||
}
|
||||
js_free(tf_task_get_context(task), ptab);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "Unknown JSValue type: %d.\n", JS_VALUE_GET_TAG(value));
|
||||
abort();
|
||||
}
|
||||
@ -263,18 +321,24 @@ static bool _serialize_storeInternal(tf_task_t* task, tf_taskstub_t* to, buffer_
|
||||
return true;
|
||||
}
|
||||
|
||||
static JSValue _serialize_load(tf_task_t* task, tf_taskstub_t* from, const char* buffer, size_t size) {
|
||||
static JSValue _serialize_load(tf_task_t* task, tf_taskstub_t* from, const char* buffer, size_t size)
|
||||
{
|
||||
return _serialize_loadInternal(task, from, &buffer, &size, 0);
|
||||
}
|
||||
|
||||
static JSValue _serialize_loadInternal(tf_task_t* task, tf_taskstub_t* from, const char** buffer, size_t* size, int depth) {
|
||||
if (*size < sizeof(size)) {
|
||||
static JSValue _serialize_loadInternal(tf_task_t* task, tf_taskstub_t* from, const char** buffer, size_t* size, int depth)
|
||||
{
|
||||
if (*size < sizeof(size))
|
||||
{
|
||||
return JS_UNDEFINED;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
int32_t type = _serialize_readInt32(buffer, size);
|
||||
JSValue result = JS_UNDEFINED;
|
||||
|
||||
switch (type) {
|
||||
switch (type)
|
||||
{
|
||||
case kUndefined:
|
||||
result = JS_UNDEFINED;
|
||||
break;
|
||||
@ -316,7 +380,8 @@ static JSValue _serialize_loadInternal(tf_task_t* task, tf_taskstub_t* from, con
|
||||
{
|
||||
int32_t length = _serialize_readInt32(buffer, size);
|
||||
result = JS_NewArray(tf_task_get_context(task));
|
||||
for (int i = 0; i < length; ++i) {
|
||||
for (int i = 0; i < length; ++i)
|
||||
{
|
||||
JS_SetPropertyUint32(tf_task_get_context(task), result, i, _serialize_loadInternal(task, from, buffer, size, depth + 1));
|
||||
}
|
||||
}
|
||||
@ -332,7 +397,8 @@ static JSValue _serialize_loadInternal(tf_task_t* task, tf_taskstub_t* from, con
|
||||
_serialize_readInt32(buffer, size);
|
||||
JSValue error = JS_NewError(tf_task_get_context(task));
|
||||
int32_t length = _serialize_readInt32(buffer, size);
|
||||
for (int i = 0; i < length; ++i) {
|
||||
for (int i = 0; i < length; ++i)
|
||||
{
|
||||
JSValue key = _serialize_loadInternal(task, from, buffer, size, depth + 1);
|
||||
JSValue value = _serialize_loadInternal(task, from, buffer, size, depth + 1);
|
||||
const char* key_str = JS_ToCString(tf_task_get_context(task), key);
|
||||
@ -348,7 +414,8 @@ static JSValue _serialize_loadInternal(tf_task_t* task, tf_taskstub_t* from, con
|
||||
{
|
||||
int32_t length = _serialize_readInt32(buffer, size);
|
||||
result = JS_NewObject(tf_task_get_context(task));
|
||||
for (int i = 0; i < length; ++i) {
|
||||
for (int i = 0; i < length; ++i)
|
||||
{
|
||||
JSValue key = _serialize_loadInternal(task, from, buffer, size, depth + 1);
|
||||
JSValue value = _serialize_loadInternal(task, from, buffer, size, depth + 1);
|
||||
const char* key_str = JS_ToCString(tf_task_get_context(task), key);
|
||||
|
Reference in New Issue
Block a user