1 /*
2 * Copyright (c) 2021 Calvin Rose
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to
6 * deal in the Software without restriction, including without limitation the
7 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
8 * sell copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20 * IN THE SOFTWARE.
21 */
22 
23 #ifndef JANET_AMALG
24 #include "features.h"
25 #include <janet.h>
26 #include "state.h"
27 #endif
28 
29 JANET_THREAD_LOCAL JanetVM janet_vm;
30 
janet_local_vm(void)31 JanetVM *janet_local_vm(void) {
32     return &janet_vm;
33 }
34 
janet_vm_alloc(void)35 JanetVM *janet_vm_alloc(void) {
36     JanetVM *mem = janet_malloc(sizeof(JanetVM));
37     if (NULL == mem) {
38         JANET_OUT_OF_MEMORY;
39     }
40     return mem;
41 }
42 
janet_vm_free(JanetVM * vm)43 void janet_vm_free(JanetVM *vm) {
44     janet_free(vm);
45 }
46 
janet_vm_save(JanetVM * into)47 void janet_vm_save(JanetVM *into) {
48     *into = janet_vm;
49 }
50 
janet_vm_load(JanetVM * from)51 void janet_vm_load(JanetVM *from) {
52     janet_vm = *from;
53 }
54 
55 /* Trigger suspension of the Janet vm by trying to
56  * exit the interpeter loop when convenient. You can optionally
57  * use NULL to interrupt the current VM when convenient */
janet_interpreter_interrupt(JanetVM * vm)58 void janet_interpreter_interrupt(JanetVM *vm) {
59     vm = vm ? vm : &janet_vm;
60     vm->auto_suspend = 1;
61 }
62