mirror of
https://github.com/janet-lang/janet
synced 2025-08-03 20:43:55 +00:00
Rename fiber.resume and fiber.yield to
resume and yield.
This commit is contained in:
parent
eba6242978
commit
2a87dada47
@ -956,18 +956,18 @@ onvalue."
|
|||||||
(chunks buf p)
|
(chunks buf p)
|
||||||
(:= len (length buf))
|
(:= len (length buf))
|
||||||
(loop [i :range [0 len]]
|
(loop [i :range [0 len]]
|
||||||
(fiber.yield (get buf i))))
|
(yield (get buf i))))
|
||||||
0))
|
0))
|
||||||
|
|
||||||
# Fiber stream of values
|
# Fiber stream of values
|
||||||
(def vals (coro
|
(def vals (coro
|
||||||
(while going
|
(while going
|
||||||
(switch (parser.status p)
|
(switch (parser.status p)
|
||||||
:full (fiber.yield (parser.produce p))
|
:full (yield (parser.produce p))
|
||||||
:error (onerr "parse" (parser.error p))
|
:error (onerr "parse" (parser.error p))
|
||||||
(switch (fiber.status chars)
|
(switch (fiber.status chars)
|
||||||
:new (parser.byte p (fiber.resume chars))
|
:new (parser.byte p (resume chars))
|
||||||
:pending (parser.byte p (fiber.resume chars))
|
:pending (parser.byte p (resume chars))
|
||||||
(:= going false))))
|
(:= going false))))
|
||||||
(when (not= :root (parser.status p))
|
(when (not= :root (parser.status p))
|
||||||
(onerr "parse" "unexpected end of source"))))
|
(onerr "parse" "unexpected end of source"))))
|
||||||
@ -982,7 +982,7 @@ onvalue."
|
|||||||
(do
|
(do
|
||||||
(:= good false)
|
(:= good false)
|
||||||
(onerr "compile" (get res :error))))) :a))
|
(onerr "compile" (get res :error))))) :a))
|
||||||
(def res (fiber.resume f))
|
(def res (resume f))
|
||||||
(when good
|
(when good
|
||||||
(def sig (fiber.status f))
|
(def sig (fiber.status f))
|
||||||
(if going
|
(if going
|
||||||
@ -993,7 +993,7 @@ onvalue."
|
|||||||
# Run loop
|
# Run loop
|
||||||
(def oldenv *env*)
|
(def oldenv *env*)
|
||||||
(:= *env* env)
|
(:= *env* env)
|
||||||
(while going (eval1 (fiber.resume vals)))
|
(while going (eval1 (resume vals)))
|
||||||
(:= *env* oldenv)
|
(:= *env* oldenv)
|
||||||
|
|
||||||
env)
|
env)
|
||||||
|
@ -58,6 +58,26 @@ static const DstReg cfuns[] = {
|
|||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Utility for inline assembly */
|
||||||
|
static DstFunction *dst_quick_asm(
|
||||||
|
int32_t arity,
|
||||||
|
int varargs,
|
||||||
|
int32_t slots,
|
||||||
|
const uint32_t *bytecode,
|
||||||
|
size_t bytecode_size) {
|
||||||
|
DstFuncDef *def = dst_funcdef_alloc();
|
||||||
|
def->arity = arity;
|
||||||
|
def->flags = varargs ? DST_FUNCDEF_FLAG_VARARG : 0;
|
||||||
|
def->slotcount = slots;
|
||||||
|
def->bytecode = malloc(bytecode_size);
|
||||||
|
def->bytecode_length = bytecode_size / sizeof(uint32_t);
|
||||||
|
if (!def->bytecode) {
|
||||||
|
DST_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
memcpy(def->bytecode, bytecode, bytecode_size);
|
||||||
|
return dst_thunk(def);
|
||||||
|
}
|
||||||
|
|
||||||
DstTable *dst_stl_env(int flags) {
|
DstTable *dst_stl_env(int flags) {
|
||||||
static uint32_t error_asm[] = {
|
static uint32_t error_asm[] = {
|
||||||
DOP_ERROR
|
DOP_ERROR
|
||||||
@ -70,6 +90,15 @@ DstTable *dst_stl_env(int flags) {
|
|||||||
DOP_SIGNAL | (2 << 24),
|
DOP_SIGNAL | (2 << 24),
|
||||||
DOP_RETURN_NIL
|
DOP_RETURN_NIL
|
||||||
};
|
};
|
||||||
|
static uint32_t yield_asm[] = {
|
||||||
|
DOP_SIGNAL | (3 << 24),
|
||||||
|
DOP_RETURN
|
||||||
|
};
|
||||||
|
static uint32_t resume_asm[] = {
|
||||||
|
DOP_RESUME | (1 << 24),
|
||||||
|
DOP_RETURN
|
||||||
|
};
|
||||||
|
|
||||||
DstTable *env = dst_table(0);
|
DstTable *env = dst_table(0);
|
||||||
Dst ret = dst_wrap_table(env);
|
Dst ret = dst_wrap_table(env);
|
||||||
|
|
||||||
@ -79,6 +108,8 @@ DstTable *dst_stl_env(int flags) {
|
|||||||
dst_env_def(env, "debug", dst_wrap_function(dst_quick_asm(0, 0, 1, debug_asm, sizeof(debug_asm))));
|
dst_env_def(env, "debug", dst_wrap_function(dst_quick_asm(0, 0, 1, debug_asm, sizeof(debug_asm))));
|
||||||
dst_env_def(env, "error", dst_wrap_function(dst_quick_asm(1, 0, 1, error_asm, sizeof(error_asm))));
|
dst_env_def(env, "error", dst_wrap_function(dst_quick_asm(1, 0, 1, error_asm, sizeof(error_asm))));
|
||||||
dst_env_def(env, "apply1", dst_wrap_function(dst_quick_asm(2, 0, 2, apply_asm, sizeof(apply_asm))));
|
dst_env_def(env, "apply1", dst_wrap_function(dst_quick_asm(2, 0, 2, apply_asm, sizeof(apply_asm))));
|
||||||
|
dst_env_def(env, "yield", dst_wrap_function(dst_quick_asm(1, 0, 2, yield_asm, sizeof(yield_asm))));
|
||||||
|
dst_env_def(env, "resume", dst_wrap_function(dst_quick_asm(2, 0, 2, resume_asm, sizeof(resume_asm))));
|
||||||
|
|
||||||
dst_env_def(env, "VERSION", dst_cstringv(DST_VERSION));
|
dst_env_def(env, "VERSION", dst_cstringv(DST_VERSION));
|
||||||
|
|
||||||
|
@ -241,18 +241,3 @@ DstFunction *dst_thunk(DstFuncDef *def) {
|
|||||||
dst_assert(def->environments_length == 0, "tried to create thunk that needs upvalues");
|
dst_assert(def->environments_length == 0, "tried to create thunk that needs upvalues");
|
||||||
return func;
|
return func;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Utility for inline assembly */
|
|
||||||
DstFunction *dst_quick_asm(int32_t arity, int varargs, int32_t slots, const uint32_t *bytecode, size_t bytecode_size) {
|
|
||||||
DstFuncDef *def = dst_funcdef_alloc();
|
|
||||||
def->arity = arity;
|
|
||||||
def->flags = varargs ? DST_FUNCDEF_FLAG_VARARG : 0;
|
|
||||||
def->slotcount = slots;
|
|
||||||
def->bytecode = malloc(bytecode_size);
|
|
||||||
def->bytecode_length = bytecode_size / sizeof(uint32_t);
|
|
||||||
if (!def->bytecode) {
|
|
||||||
DST_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
memcpy(def->bytecode, bytecode, bytecode_size);
|
|
||||||
return dst_thunk(def);
|
|
||||||
}
|
|
||||||
|
@ -438,21 +438,7 @@ static const DstReg cfuns[] = {
|
|||||||
|
|
||||||
/* Module entry point */
|
/* Module entry point */
|
||||||
int dst_lib_fiber(DstArgs args) {
|
int dst_lib_fiber(DstArgs args) {
|
||||||
static uint32_t yield_asm[] = {
|
|
||||||
DOP_SIGNAL | (3 << 24),
|
|
||||||
DOP_RETURN
|
|
||||||
};
|
|
||||||
static uint32_t resume_asm[] = {
|
|
||||||
DOP_RESUME | (1 << 24),
|
|
||||||
DOP_RETURN
|
|
||||||
};
|
|
||||||
DstTable *env = dst_env_arg(args);
|
DstTable *env = dst_env_arg(args);
|
||||||
dst_env_cfuns(env, cfuns);
|
dst_env_cfuns(env, cfuns);
|
||||||
dst_env_def(env, "fiber.yield",
|
|
||||||
dst_wrap_function(dst_quick_asm(1, 0, 2,
|
|
||||||
yield_asm, sizeof(yield_asm))));
|
|
||||||
dst_env_def(env, "fiber.resume",
|
|
||||||
dst_wrap_function(dst_quick_asm(2, 0, 2,
|
|
||||||
resume_asm, sizeof(resume_asm))));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -84,10 +84,6 @@ static int os_exit(DstArgs args) {
|
|||||||
DST_MAXARITY(args, 1);
|
DST_MAXARITY(args, 1);
|
||||||
if (args.n == 0) {
|
if (args.n == 0) {
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
} else if (dst_checktype(args.v[0], DST_TRUE)
|
|
||||||
|| dst_checktype(args.v[0], DST_FALSE)) {
|
|
||||||
exit(dst_unwrap_boolean(args.v[0]) ? EXIT_SUCCESS : EXIT_FAILURE);
|
|
||||||
return 0;
|
|
||||||
} else if (dst_checktype(args.v[0], DST_INTEGER)) {
|
} else if (dst_checktype(args.v[0], DST_INTEGER)) {
|
||||||
exit(dst_unwrap_integer(args.v[0]));
|
exit(dst_unwrap_integer(args.v[0]));
|
||||||
} else {
|
} else {
|
||||||
|
@ -922,8 +922,8 @@ int dst_init() {
|
|||||||
dst_vm_next_collection = 0;
|
dst_vm_next_collection = 0;
|
||||||
/* Setting memoryInterval to zero forces
|
/* Setting memoryInterval to zero forces
|
||||||
* a collection pretty much every cycle, which is
|
* a collection pretty much every cycle, which is
|
||||||
* horrible for performance, but helps ensure
|
* incredibly horrible for performance, but can help ensure
|
||||||
* there are no memory bugs during dev */
|
* there are no memory bugs during development */
|
||||||
dst_vm_gc_interval = 0x10000;
|
dst_vm_gc_interval = 0x10000;
|
||||||
dst_symcache_init();
|
dst_symcache_init();
|
||||||
/* Initialize gc roots */
|
/* Initialize gc roots */
|
||||||
|
@ -168,12 +168,6 @@ void dst_gcunlock(int handle);
|
|||||||
DstFuncDef *dst_funcdef_alloc(void);
|
DstFuncDef *dst_funcdef_alloc(void);
|
||||||
DstFunction *dst_thunk(DstFuncDef *def);
|
DstFunction *dst_thunk(DstFuncDef *def);
|
||||||
int dst_verify(DstFuncDef *def);
|
int dst_verify(DstFuncDef *def);
|
||||||
DstFunction *dst_quick_asm(
|
|
||||||
int32_t arity,
|
|
||||||
int varargs,
|
|
||||||
int32_t slots,
|
|
||||||
const uint32_t *bytecode,
|
|
||||||
size_t bytecode_size);
|
|
||||||
|
|
||||||
/* Misc */
|
/* Misc */
|
||||||
int dst_equals(Dst x, Dst y);
|
int dst_equals(Dst x, Dst y);
|
||||||
|
@ -149,18 +149,18 @@
|
|||||||
(def afiber (fiber.new (fn [x]
|
(def afiber (fiber.new (fn [x]
|
||||||
(error (string "hello, " x))) :e))
|
(error (string "hello, " x))) :e))
|
||||||
|
|
||||||
(def afiber-result (fiber.resume afiber "world!"))
|
(def afiber-result (resume afiber "world!"))
|
||||||
|
|
||||||
(assert (= afiber-result "hello, world!") "fiber error result")
|
(assert (= afiber-result "hello, world!") "fiber error result")
|
||||||
(assert (= (fiber.status afiber) :error) "fiber error status")
|
(assert (= (fiber.status afiber) :error) "fiber error status")
|
||||||
|
|
||||||
# yield tests
|
# yield tests
|
||||||
|
|
||||||
(def t (fiber.new (fn [] (fiber.yield 1) (fiber.yield 2) 3)))
|
(def t (fiber.new (fn [] (yield 1) (yield 2) 3)))
|
||||||
|
|
||||||
(assert (= 1 (fiber.resume t)) "initial transfer to new fiber")
|
(assert (= 1 (resume t)) "initial transfer to new fiber")
|
||||||
(assert (= 2 (fiber.resume t)) "second transfer to fiber")
|
(assert (= 2 (resume t)) "second transfer to fiber")
|
||||||
(assert (= 3 (fiber.resume t)) "return from fiber")
|
(assert (= 3 (resume t)) "return from fiber")
|
||||||
(assert (= (fiber.status t) :dead) "finished fiber is dead")
|
(assert (= (fiber.status t) :dead) "finished fiber is dead")
|
||||||
|
|
||||||
# Var arg tests
|
# Var arg tests
|
||||||
@ -192,7 +192,7 @@
|
|||||||
(def 🦊 :fox)
|
(def 🦊 :fox)
|
||||||
(def 🐮 :cow)
|
(def 🐮 :cow)
|
||||||
(assert (= (string "🐼" 🦊 🐮) "🐼:fox:cow") "emojis 🙉 :)")
|
(assert (= (string "🐼" 🦊 🐮) "🐼:fox:cow") "emojis 🙉 :)")
|
||||||
(assert (not= 🦊 :🦊) "utf8 strings are not symbols and vice versa")
|
(assert (not= 🦊 "🦊") "utf8 strings are not symbols and vice versa")
|
||||||
|
|
||||||
# Symbols with @ character
|
# Symbols with @ character
|
||||||
|
|
||||||
|
@ -80,16 +80,16 @@
|
|||||||
(defn fiberstuff []
|
(defn fiberstuff []
|
||||||
(++ myvar)
|
(++ myvar)
|
||||||
(def f (fiber.new (fn [] (++ myvar) (debug) (++ myvar))))
|
(def f (fiber.new (fn [] (++ myvar) (debug) (++ myvar))))
|
||||||
(fiber.resume f)
|
(resume f)
|
||||||
(++ myvar))
|
(++ myvar))
|
||||||
|
|
||||||
(def myfiber (fiber.new fiberstuff :dey))
|
(def myfiber (fiber.new fiberstuff :dey))
|
||||||
|
|
||||||
(assert (= myvar 0) "fiber creation does not call fiber function")
|
(assert (= myvar 0) "fiber creation does not call fiber function")
|
||||||
(fiber.resume myfiber)
|
(resume myfiber)
|
||||||
(assert (= myvar 2) "fiber debug statement breaks at proper point")
|
(assert (= myvar 2) "fiber debug statement breaks at proper point")
|
||||||
(assert (= (fiber.status myfiber) :debug) "fiber enters debug state")
|
(assert (= (fiber.status myfiber) :debug) "fiber enters debug state")
|
||||||
(fiber.resume myfiber)
|
(resume myfiber)
|
||||||
(assert (= myvar 4) "fiber resumes properly from debug state")
|
(assert (= myvar 4) "fiber resumes properly from debug state")
|
||||||
(assert (= (fiber.status myfiber) :dead) "fiber properly dies from debug state")
|
(assert (= (fiber.status myfiber) :dead) "fiber properly dies from debug state")
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user