Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions quickjs-libc.c
Original file line number Diff line number Diff line change
Expand Up @@ -3532,17 +3532,17 @@ static JSValue js_worker_postMessage(JSContext *ctx, JSValue this_val,
{
JSWorkerData *worker = JS_GetOpaque2(ctx, this_val, js_worker_class_id);
JSWorkerMessagePipe *ps;
size_t data_len, sab_tab_len, i;
size_t data_len, i;
uint8_t *data;
JSWorkerMessage *msg;
uint8_t **sab_tab;
JSSABTab sab_tab;

if (!worker)
return JS_EXCEPTION;

data = JS_WriteObject2(ctx, &data_len, argv[0],
JS_WRITE_OBJ_SAB | JS_WRITE_OBJ_REFERENCE,
&sab_tab, &sab_tab_len);
&sab_tab);
if (!data)
return JS_EXCEPTION;

Expand All @@ -3559,16 +3559,16 @@ static JSValue js_worker_postMessage(JSContext *ctx, JSValue this_val,
memcpy(msg->data, data, data_len);
msg->data_len = data_len;

if (sab_tab_len > 0) {
msg->sab_tab = malloc(sizeof(msg->sab_tab[0]) * sab_tab_len);
if (sab_tab.len > 0) {
msg->sab_tab = malloc(sizeof(msg->sab_tab[0]) * sab_tab.len);
if (!msg->sab_tab)
goto fail;
memcpy(msg->sab_tab, sab_tab, sizeof(msg->sab_tab[0]) * sab_tab_len);
memcpy(msg->sab_tab, sab_tab.tab, sizeof(msg->sab_tab[0]) * sab_tab.len);
}
msg->sab_tab_len = sab_tab_len;
msg->sab_tab_len = sab_tab.len;

js_free(ctx, data);
js_free(ctx, sab_tab);
js_free(ctx, sab_tab.tab);

/* increment the SAB reference counts */
for(i = 0; i < msg->sab_tab_len; i++) {
Expand Down Expand Up @@ -3599,7 +3599,7 @@ static JSValue js_worker_postMessage(JSContext *ctx, JSValue this_val,
free(msg);
}
js_free(ctx, data);
js_free(ctx, sab_tab);
js_free(ctx, sab_tab.tab);
return JS_EXCEPTION;

}
Expand Down
48 changes: 34 additions & 14 deletions quickjs.c
Original file line number Diff line number Diff line change
Expand Up @@ -33928,7 +33928,7 @@ static int JS_WriteObjectAtoms(BCWriterState *s)
}

uint8_t *JS_WriteObject2(JSContext *ctx, size_t *psize, JSValue obj,
int flags, uint8_t ***psab_tab, size_t *psab_tab_len)
int flags, JSSABTab *psab_tab)
{
BCWriterState ss, *s = &ss;

Expand All @@ -33955,30 +33955,30 @@ uint8_t *JS_WriteObject2(JSContext *ctx, size_t *psize, JSValue obj,
js_free(ctx, s->atom_to_idx);
js_free(ctx, s->idx_to_atom);
*psize = s->dbuf.size;
if (psab_tab)
*psab_tab = s->sab_tab;
else
if (psab_tab) {
psab_tab->tab = s->sab_tab;
psab_tab->len = s->sab_tab_len;
} else {
js_free(ctx, s->sab_tab);
if (psab_tab_len)
*psab_tab_len = s->sab_tab_len;
}
return s->dbuf.buf;
fail:
js_object_list_end(ctx, &s->object_list);
js_free(ctx, s->atom_to_idx);
js_free(ctx, s->idx_to_atom);
dbuf_free(&s->dbuf);
*psize = 0;
if (psab_tab)
*psab_tab = NULL;
if (psab_tab_len)
*psab_tab_len = 0;
if (psab_tab) {
psab_tab->tab = NULL;
psab_tab->len = 0;
}
return NULL;
}

uint8_t *JS_WriteObject(JSContext *ctx, size_t *psize, JSValue obj,
int flags)
{
return JS_WriteObject2(ctx, psize, obj, flags, NULL, NULL);
return JS_WriteObject2(ctx, psize, obj, flags, NULL);
}

typedef struct BCReaderState {
Expand All @@ -33995,7 +33995,10 @@ typedef struct BCReaderState {
JSObject **objects;
int objects_count;
int objects_size;

/* SAB references */
uint8_t **sab_tab;
int sab_tab_len;
int sab_tab_size;
/* used for DUMP_READ_OBJECT */
const uint8_t *ptr_last;
int level;
Expand Down Expand Up @@ -34903,6 +34906,11 @@ static JSValue JS_ReadSharedArrayBuffer(BCReaderState *s)
if (bc_get_u64(s, &u64))
return JS_EXCEPTION;
data_ptr = (uint8_t *)(uintptr_t)u64;
if (js_resize_array(s->ctx, (void **)&s->sab_tab, sizeof(s->sab_tab[0]),
&s->sab_tab_size, s->sab_tab_len + 1))
return JS_EXCEPTION;
/* keep the SAB pointer so that the user can clone it or free it */
s->sab_tab[s->sab_tab_len++] = data_ptr;
/* the SharedArrayBuffer is cloned */
obj = js_array_buffer_constructor3(ctx, JS_UNDEFINED, byte_length,
JS_CLASS_SHARED_ARRAY_BUFFER,
Expand Down Expand Up @@ -35156,8 +35164,8 @@ static void bc_reader_free(BCReaderState *s)
js_free(s->ctx, s->objects);
}

JSValue JS_ReadObject(JSContext *ctx, const uint8_t *buf, size_t buf_len,
int flags)
JSValue JS_ReadObject2(JSContext *ctx, const uint8_t *buf, size_t buf_len,
int flags, JSSABTab *psab_tab)
{
BCReaderState ss, *s = &ss;
JSValue obj;
Expand All @@ -35182,10 +35190,22 @@ JSValue JS_ReadObject(JSContext *ctx, const uint8_t *buf, size_t buf_len,
} else {
obj = JS_ReadObjectRec(s);
}
if (psab_tab) {
psab_tab->tab = s->sab_tab;
psab_tab->len = s->sab_tab_len;
} else {
js_free(ctx, s->sab_tab);
}
bc_reader_free(s);
return obj;
}

JSValue JS_ReadObject(JSContext *ctx, const uint8_t *buf, size_t buf_len,
int flags)
{
return JS_ReadObject2(ctx, buf, buf_len, flags, NULL);
}

/*******************************************************************/
/* runtime functions & objects */

Expand Down
10 changes: 9 additions & 1 deletion quickjs.h
Original file line number Diff line number Diff line change
Expand Up @@ -840,6 +840,12 @@ JS_EXTERN int JS_EnqueueJob(JSContext *ctx, JSJobFunc *job_func, int argc, JSVal
JS_EXTERN JS_BOOL JS_IsJobPending(JSRuntime *rt);
JS_EXTERN int JS_ExecutePendingJob(JSRuntime *rt, JSContext **pctx);

/* Structure to retrieve (de)serialized SharedArrayBuffer objects. */
typedef struct JSSABTab {
uint8_t **tab;
size_t len;
} JSSABTab;

/* Object Writer/Reader (currently only used to handle precompiled code) */
#define JS_WRITE_OBJ_BYTECODE (1 << 0) /* allow function/module */
#define JS_WRITE_OBJ_BSWAP (0) /* byte swapped output (obsolete, handled transparently) */
Expand All @@ -849,13 +855,15 @@ JS_EXTERN int JS_ExecutePendingJob(JSRuntime *rt, JSContext **pctx);
#define JS_WRITE_OBJ_STRIP_DEBUG (1 << 5) /* do not write debug information */
JS_EXTERN uint8_t *JS_WriteObject(JSContext *ctx, size_t *psize, JSValue obj, int flags);
JS_EXTERN uint8_t *JS_WriteObject2(JSContext *ctx, size_t *psize, JSValue obj,
int flags, uint8_t ***psab_tab, size_t *psab_tab_len);
int flags, JSSABTab *psab_tab);

#define JS_READ_OBJ_BYTECODE (1 << 0) /* allow function/module */
#define JS_READ_OBJ_ROM_DATA (0) /* avoid duplicating 'buf' data (obsolete, broken by ICs) */
#define JS_READ_OBJ_SAB (1 << 2) /* allow SharedArrayBuffer */
#define JS_READ_OBJ_REFERENCE (1 << 3) /* allow object references */
JS_EXTERN JSValue JS_ReadObject(JSContext *ctx, const uint8_t *buf, size_t buf_len, int flags);
JS_EXTERN JSValue JS_ReadObject2(JSContext *ctx, const uint8_t *buf, size_t buf_len,
int flags, JSSABTab *psab_tab);
/* instantiate and evaluate a bytecode function. Only used when
reading a script or module with JS_ReadObject() */
JS_EXTERN JSValue JS_EvalFunction(JSContext *ctx, JSValue fun_obj);
Expand Down