summaryrefslogtreecommitdiff
path: root/builtins.c
diff options
context:
space:
mode:
Diffstat (limited to 'builtins.c')
-rw-r--r--builtins.c54
1 files changed, 28 insertions, 26 deletions
diff --git a/builtins.c b/builtins.c
index 79c71f0..6dda64f 100644
--- a/builtins.c
+++ b/builtins.c
@@ -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);