1
0
mirror of https://github.com/janet-lang/janet synced 2025-05-04 16:34:15 +00:00

Address #1337 (leet!).

Changes a few scheduling details and adds a 0 byte explicitly to
symbols created via gensym.
This commit is contained in:
Calvin Rose 2023-12-16 16:15:46 -06:00
parent a0cb7514f1
commit a10b4f61d8
3 changed files with 33 additions and 28 deletions

View File

@ -2031,33 +2031,35 @@ void janet_ev_default_threaded_callback(JanetEVGenericMessage return_value) {
if (return_value.fiber == NULL) { if (return_value.fiber == NULL) {
return; return;
} }
switch (return_value.tag) { if (janet_fiber_can_resume(return_value.fiber)) {
default: switch (return_value.tag) {
case JANET_EV_TCTAG_NIL: default:
janet_schedule(return_value.fiber, janet_wrap_nil()); case JANET_EV_TCTAG_NIL:
break; janet_schedule(return_value.fiber, janet_wrap_nil());
case JANET_EV_TCTAG_INTEGER: break;
janet_schedule(return_value.fiber, janet_wrap_integer(return_value.argi)); case JANET_EV_TCTAG_INTEGER:
break; janet_schedule(return_value.fiber, janet_wrap_integer(return_value.argi));
case JANET_EV_TCTAG_STRING: break;
case JANET_EV_TCTAG_STRINGF: case JANET_EV_TCTAG_STRING:
janet_schedule(return_value.fiber, janet_cstringv((const char *) return_value.argp)); case JANET_EV_TCTAG_STRINGF:
if (return_value.tag == JANET_EV_TCTAG_STRINGF) janet_free(return_value.argp); janet_schedule(return_value.fiber, janet_cstringv((const char *) return_value.argp));
break; if (return_value.tag == JANET_EV_TCTAG_STRINGF) janet_free(return_value.argp);
case JANET_EV_TCTAG_KEYWORD: break;
janet_schedule(return_value.fiber, janet_ckeywordv((const char *) return_value.argp)); case JANET_EV_TCTAG_KEYWORD:
break; janet_schedule(return_value.fiber, janet_ckeywordv((const char *) return_value.argp));
case JANET_EV_TCTAG_ERR_STRING: break;
case JANET_EV_TCTAG_ERR_STRINGF: case JANET_EV_TCTAG_ERR_STRING:
janet_cancel(return_value.fiber, janet_cstringv((const char *) return_value.argp)); case JANET_EV_TCTAG_ERR_STRINGF:
if (return_value.tag == JANET_EV_TCTAG_STRINGF) janet_free(return_value.argp); janet_cancel(return_value.fiber, janet_cstringv((const char *) return_value.argp));
break; if (return_value.tag == JANET_EV_TCTAG_STRINGF) janet_free(return_value.argp);
case JANET_EV_TCTAG_ERR_KEYWORD: break;
janet_cancel(return_value.fiber, janet_ckeywordv((const char *) return_value.argp)); case JANET_EV_TCTAG_ERR_KEYWORD:
break; janet_cancel(return_value.fiber, janet_ckeywordv((const char *) return_value.argp));
case JANET_EV_TCTAG_BOOLEAN: break;
janet_schedule(return_value.fiber, janet_wrap_boolean(return_value.argi)); case JANET_EV_TCTAG_BOOLEAN:
break; janet_schedule(return_value.fiber, janet_wrap_boolean(return_value.argi));
break;
}
} }
janet_gcunroot(janet_wrap_fiber(return_value.fiber)); janet_gcunroot(janet_wrap_fiber(return_value.fiber));
} }

View File

@ -529,7 +529,9 @@ static void janet_proc_wait_cb(JanetEVGenericMessage args) {
JanetString s = janet_formatc("command failed with non-zero exit code %d", status); JanetString s = janet_formatc("command failed with non-zero exit code %d", status);
janet_cancel(args.fiber, janet_wrap_string(s)); janet_cancel(args.fiber, janet_wrap_string(s));
} else { } else {
janet_schedule(args.fiber, janet_wrap_integer(status)); if (janet_fiber_can_resume(args.fiber)) {
janet_schedule(args.fiber, janet_wrap_integer(status));
}
} }
} }
} }

View File

@ -233,6 +233,7 @@ const uint8_t *janet_symbol_gen(void) {
head->length = sizeof(janet_vm.gensym_counter) - 1; head->length = sizeof(janet_vm.gensym_counter) - 1;
head->hash = hash; head->hash = hash;
sym = (uint8_t *)(head->data); sym = (uint8_t *)(head->data);
sym[head->length] = 0;
memcpy(sym, janet_vm.gensym_counter, sizeof(janet_vm.gensym_counter)); memcpy(sym, janet_vm.gensym_counter, sizeof(janet_vm.gensym_counter));
janet_symcache_put((const uint8_t *)sym, bucket); janet_symcache_put((const uint8_t *)sym, bucket);
return (const uint8_t *)sym; return (const uint8_t *)sym;