mirror of
https://github.com/janet-lang/janet
synced 2024-12-26 00:10:27 +00:00
Don't use CLOCK_MONOTONIC for pthread stuff.
Also fix marshalling functions without full sourcemapping information, as well as thread/receive ignoring bad messages. Instead, thread/receive will error on bad messages.
This commit is contained in:
parent
617ec7f565
commit
3bb8f1ac8d
@ -720,6 +720,9 @@ static JanetAssembleResult janet_asm1(JanetAssembler *parent, Janet source, int
|
|||||||
janet_asm_error(&a, "invalid assembly");
|
janet_asm_error(&a, "invalid assembly");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add final flags */
|
||||||
|
janet_def_addflags(def);
|
||||||
|
|
||||||
/* Finish everything and return funcdef */
|
/* Finish everything and return funcdef */
|
||||||
janet_asm_deinit(&a);
|
janet_asm_deinit(&a);
|
||||||
result.error = NULL;
|
result.error = NULL;
|
||||||
|
@ -698,6 +698,29 @@ JanetSlot janetc_value(JanetFopts opts, Janet x) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add function flags to janet functions */
|
||||||
|
void janet_def_addflags(JanetFuncDef *def) {
|
||||||
|
int32_t set_flags = 0;
|
||||||
|
int32_t unset_flags = 0;
|
||||||
|
/* pos checks */
|
||||||
|
if (def->name) set_flags |= JANET_FUNCDEF_FLAG_HASNAME;
|
||||||
|
if (def->source) set_flags |= JANET_FUNCDEF_FLAG_HASSOURCE;
|
||||||
|
if (def->defs) set_flags |= JANET_FUNCDEF_FLAG_HASDEFS;
|
||||||
|
if (def->environments) set_flags |= JANET_FUNCDEF_FLAG_HASENVS;
|
||||||
|
if (def->sourcemap) set_flags |= JANET_FUNCDEF_FLAG_HASSOURCEMAP;
|
||||||
|
if (def->closure_bitset) set_flags |= JANET_FUNCDEF_FLAG_HASCLOBITSET;
|
||||||
|
/* negative checks */
|
||||||
|
if (!def->name) unset_flags |= JANET_FUNCDEF_FLAG_HASNAME;
|
||||||
|
if (!def->source) unset_flags |= JANET_FUNCDEF_FLAG_HASSOURCE;
|
||||||
|
if (!def->defs) unset_flags |= JANET_FUNCDEF_FLAG_HASDEFS;
|
||||||
|
if (!def->environments) unset_flags |= JANET_FUNCDEF_FLAG_HASENVS;
|
||||||
|
if (!def->sourcemap) unset_flags |= JANET_FUNCDEF_FLAG_HASSOURCEMAP;
|
||||||
|
if (!def->closure_bitset) unset_flags |= JANET_FUNCDEF_FLAG_HASCLOBITSET;
|
||||||
|
/* Update flags */
|
||||||
|
def->flags |= set_flags;
|
||||||
|
def->flags &= ~unset_flags;
|
||||||
|
}
|
||||||
|
|
||||||
/* Compile a funcdef */
|
/* Compile a funcdef */
|
||||||
JanetFuncDef *janetc_pop_funcdef(JanetCompiler *c) {
|
JanetFuncDef *janetc_pop_funcdef(JanetCompiler *c) {
|
||||||
JanetScope *scope = c->scope;
|
JanetScope *scope = c->scope;
|
||||||
@ -761,12 +784,14 @@ JanetFuncDef *janetc_pop_funcdef(JanetCompiler *c) {
|
|||||||
/* Register allocator preallocates some registers [240-255, high 16 bits of chunk index 7], we can ignore those. */
|
/* Register allocator preallocates some registers [240-255, high 16 bits of chunk index 7], we can ignore those. */
|
||||||
if (scope->ua.count > 7) chunks[7] &= 0xFFFFU;
|
if (scope->ua.count > 7) chunks[7] &= 0xFFFFU;
|
||||||
def->closure_bitset = chunks;
|
def->closure_bitset = chunks;
|
||||||
def->flags |= JANET_FUNCDEF_FLAG_HASCLOBITSET;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pop the scope */
|
/* Pop the scope */
|
||||||
janetc_popscope(c);
|
janetc_popscope(c);
|
||||||
|
|
||||||
|
/* Finalize some flags */
|
||||||
|
janet_def_addflags(def);
|
||||||
|
|
||||||
return def;
|
return def;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -741,6 +741,7 @@ static void janet_quick_asm(
|
|||||||
JANET_OUT_OF_MEMORY;
|
JANET_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
memcpy(def->bytecode, bytecode, bytecode_size);
|
memcpy(def->bytecode, bytecode, bytecode_size);
|
||||||
|
janet_def_addflags(def);
|
||||||
janet_def(env, name, janet_wrap_function(janet_thunk(def)), doc);
|
janet_def(env, name, janet_wrap_function(janet_thunk(def)), doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -214,15 +214,6 @@ static void marshal_one_env(MarshalState *st, JanetFuncEnv *env, int flags) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add function flags to janet functions */
|
|
||||||
static void janet_func_addflags(JanetFuncDef *def) {
|
|
||||||
if (def->name) def->flags |= JANET_FUNCDEF_FLAG_HASNAME;
|
|
||||||
if (def->source) def->flags |= JANET_FUNCDEF_FLAG_HASSOURCE;
|
|
||||||
if (def->defs) def->flags |= JANET_FUNCDEF_FLAG_HASDEFS;
|
|
||||||
if (def->environments) def->flags |= JANET_FUNCDEF_FLAG_HASENVS;
|
|
||||||
if (def->sourcemap) def->flags |= JANET_FUNCDEF_FLAG_HASSOURCEMAP;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Marshal a sequence of u32s */
|
/* Marshal a sequence of u32s */
|
||||||
static void janet_marshal_u32s(MarshalState *st, const uint32_t *u32s, int32_t n) {
|
static void janet_marshal_u32s(MarshalState *st, const uint32_t *u32s, int32_t n) {
|
||||||
for (int32_t i = 0; i < n; i++) {
|
for (int32_t i = 0; i < n; i++) {
|
||||||
@ -243,7 +234,6 @@ static void marshal_one_def(MarshalState *st, JanetFuncDef *def, int flags) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
janet_func_addflags(def);
|
|
||||||
/* Add to lookup */
|
/* Add to lookup */
|
||||||
janet_v_push(st->seen_defs, def);
|
janet_v_push(st->seen_defs, def);
|
||||||
pushint(st, def->flags);
|
pushint(st, def->flags);
|
||||||
@ -900,7 +890,7 @@ static const uint8_t *unmarshal_one_def(
|
|||||||
for (int32_t i = 0; i < bytecode_length; i++) {
|
for (int32_t i = 0; i < bytecode_length; i++) {
|
||||||
current += readint(st, &data);
|
current += readint(st, &data);
|
||||||
def->sourcemap[i].line = current;
|
def->sourcemap[i].line = current;
|
||||||
def->sourcemap[i].column = readnat(st, &data);
|
def->sourcemap[i].column = readint(st, &data);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
def->sourcemap = NULL;
|
def->sourcemap = NULL;
|
||||||
@ -908,11 +898,12 @@ static const uint8_t *unmarshal_one_def(
|
|||||||
|
|
||||||
/* Unmarshal closure bitset if needed */
|
/* Unmarshal closure bitset if needed */
|
||||||
if (def->flags & JANET_FUNCDEF_FLAG_HASCLOBITSET) {
|
if (def->flags & JANET_FUNCDEF_FLAG_HASCLOBITSET) {
|
||||||
def->closure_bitset = malloc(sizeof(uint32_t) * def->slotcount);
|
size_t n = (size_t)(def->slotcount + 31) >> 5;
|
||||||
|
def->closure_bitset = malloc(sizeof(uint32_t) * n);
|
||||||
if (NULL == def->closure_bitset) {
|
if (NULL == def->closure_bitset) {
|
||||||
JANET_OUT_OF_MEMORY;
|
JANET_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
data = janet_unmarshal_u32s(st, data, def->closure_bitset, (def->slotcount + 31) >> 5);
|
data = janet_unmarshal_u32s(st, data, def->closure_bitset, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Validate */
|
/* Validate */
|
||||||
|
@ -375,8 +375,12 @@ int janet_thread_receive(Janet *msg_out, double timeout) {
|
|||||||
|
|
||||||
/* Handle errors */
|
/* Handle errors */
|
||||||
if (setjmp(buf)) {
|
if (setjmp(buf)) {
|
||||||
/* Cleanup jmp_buf, keep lock */
|
/* Cleanup jmp_buf, return error.
|
||||||
|
* Do not ignore bad messages as before. */
|
||||||
janet_vm_jmp_buf = old_buf;
|
janet_vm_jmp_buf = old_buf;
|
||||||
|
*msg_out = *janet_vm_return_reg;
|
||||||
|
janet_mailbox_unlock(mailbox);
|
||||||
|
return 2;
|
||||||
} else {
|
} else {
|
||||||
JanetBuffer *msgbuf = mailbox->messages + mailbox->messageFirst;
|
JanetBuffer *msgbuf = mailbox->messages + mailbox->messageFirst;
|
||||||
mailbox->messageCount--;
|
mailbox->messageCount--;
|
||||||
@ -411,7 +415,6 @@ int janet_thread_receive(Janet *msg_out, double timeout) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int janet_thread_getter(void *p, Janet key, Janet *out);
|
static int janet_thread_getter(void *p, Janet key, Janet *out);
|
||||||
@ -664,6 +667,8 @@ static Janet cfun_thread_receive(int32_t argc, Janet *argv) {
|
|||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
janet_panicf("timeout after %f seconds", wait);
|
janet_panicf("timeout after %f seconds", wait);
|
||||||
|
case 2:
|
||||||
|
janet_panicf("failed to receive message: %v", out);
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
@ -621,7 +621,7 @@ int janet_gettime(struct timespec *spec) {
|
|||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
int janet_gettime(struct timespec *spec) {
|
int janet_gettime(struct timespec *spec) {
|
||||||
return clock_gettime(CLOCK_MONOTONIC, spec);
|
return clock_gettime(CLOCK_REALTIME, spec);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
@ -80,6 +80,7 @@ Janet janet_dict_get(const JanetKV *buckets, int32_t cap, Janet key);
|
|||||||
void janet_memempty(JanetKV *mem, int32_t count);
|
void janet_memempty(JanetKV *mem, int32_t count);
|
||||||
void *janet_memalloc_empty(int32_t count);
|
void *janet_memalloc_empty(int32_t count);
|
||||||
JanetTable *janet_get_core_table(const char *name);
|
JanetTable *janet_get_core_table(const char *name);
|
||||||
|
void janet_def_addflags(JanetFuncDef *def);
|
||||||
const void *janet_strbinsearch(
|
const void *janet_strbinsearch(
|
||||||
const void *tab,
|
const void *tab,
|
||||||
size_t tabcount,
|
size_t tabcount,
|
||||||
|
Loading…
Reference in New Issue
Block a user