diff options
author | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-07-22 21:54:46 +0000 |
---|---|---|
committer | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-07-22 21:54:46 +0000 |
commit | 48da622d4ad0b4acfe9005dd318ac3f20b4e8672 (patch) | |
tree | 9eed593702dc2fbd7f93689f53605241560f51e9 /builtins.c | |
parent | 0f347162b74d945f509955b6c57e506ab800db7b (diff) |
Big commit changing the way the system is loaded at startup.
1) The loader and system modules are loaded by the C directly into the user module
2) The system module is then loaded with the loader from the user module
3) The loader module is then loaded with the loader from the user module
4) The repl is then loaded with the loader from the loader module
5) The user module is cleared
Diffstat (limited to 'builtins.c')
-rw-r--r-- | builtins.c | 54 |
1 files changed, 28 insertions, 26 deletions
@@ -10,7 +10,7 @@ #define Throw(What) do{\ Goal *g = gmalloc(sizeof(Goal)); \ g->goal = What; \ - g->module = usermodule; \ + g->module = getmodule(L"user"); \ g->catcher = nil; \ g->next = goalstack; \ goalstack = g; \ @@ -63,13 +63,14 @@ BuiltinProto(builtinputchar); BuiltinProto(builtincharcode); BuiltinProto(builtinchoicestacksize); BuiltinProto(builtincollectgarbage); -BuiltinProto(builtinloadmodulefromfile); BuiltinProto(builtinflushoutput); BuiltinProto(builtinstreamproperties); BuiltinProto(builtinsetstreamposition); BuiltinProto(builtinop); BuiltinProto(builtincurrentops); BuiltinProto(builtinnewemptymodule); +BuiltinProto(builtindeletemodule); +BuiltinProto(builtinactivatesystemmodule); BuiltinProto(builtinhalt); int compareterms(Term *, Term *); @@ -186,8 +187,6 @@ findbuiltin(Term *goal) return builtinchoicestacksize; if(Match(L"$collect_garbage", 0)) return builtincollectgarbage; - if(Match(L"$load_module_from_file", 1)) - return builtinloadmodulefromfile; if(Match(L"flush_output", 1)) return builtinflushoutput; if(Match(L"stream_properties", 1)) @@ -200,6 +199,10 @@ findbuiltin(Term *goal) return builtincurrentops; if(Match(L"$new_empty_module", 1)) return builtinnewemptymodule; + if(Match(L"$delete_module", 1)) + return builtindeletemodule; + if(Match(L"$activate_system_module", 0)) + return builtinactivatesystemmodule; if(Match(L"$halt", 1)) return builtinhalt; @@ -1492,27 +1495,6 @@ builtincollectgarbage(Term *goal, Binding **bindings, Module *module) } int -builtinloadmodulefromfile(Term *goal, Binding **bindings, Module *module) -{ - USED(bindings); - USED(module); - Term *file = goal->children; - - if(file->tag == VariableTerm) - Throw(instantiationerror()); - if(file->tag != AtomTerm) - Throw(typeerror(L"atom", file)); - - char *filestr = smprint("%S", file->text); - Module *m = parsemodule(filestr); - free(filestr); - if(m) - return 1; - else - return 0; -} - -int builtinflushoutput(Term *goal, Binding **bindings, Module *module) { USED(bindings); @@ -1574,7 +1556,7 @@ builtinop(Term *goal, Binding **bindings, Module *module) Term *specifier = priority->next; Term *operator = specifier->next; - if(runestrcmp(operator->text, L",") == 0) + if(runestrcmp(operator->text, L",") == 0 && runestrcmp(module->name, L"system") != 0) Throw(permissionerror(L"modify", L"operator", operator)); int type = 0; @@ -1654,6 +1636,26 @@ builtinnewemptymodule(Term *goal, Binding **bindings, Module *module) } int +builtindeletemodule(Term *goal, Binding **bindings, Module *module) +{ + USED(bindings); + USED(module); + Rune *name = goal->children->text; + removemodule(name); + return 1; +} + +int +builtinactivatesystemmodule(Term *goal, Binding **bindings, Module *module) +{ + USED(bindings); + USED(module); + USED(goal); + systemmoduleloaded = 1; + return 1; +} + +int builtinhalt(Term *goal, Binding **bindings, Module *module) { USED(bindings); |