Skip to content

Commit

Permalink
Let Main register Base in the Loader
Browse files Browse the repository at this point in the history
  • Loading branch information
eregon committed May 24, 2017
1 parent edcd7e5 commit afd7638
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 9 deletions.
1 change: 1 addition & 0 deletions lib/main/init/Init.oz
Expand Up @@ -359,6 +359,7 @@ define

%% Link or apply root functor (i.e. application)
proc {Main}
{Boot.registerBase Base}
if {Not {PropertyTestGet 'oz.dotoz' _}} then {OnLoad} end
AppFunctor = {GetOrFalse 'application.functor'}
in
Expand Down
14 changes: 14 additions & 0 deletions vm/src/org/mozartoz/truffle/nodes/builtins/BootBuiltins.java
Expand Up @@ -4,6 +4,7 @@

import org.mozartoz.truffle.nodes.OzNode;
import org.mozartoz.truffle.nodes.builtins.VirtualStringBuiltinsFactory.ToAtomNodeFactory;
import org.mozartoz.truffle.translator.Loader;

import com.oracle.truffle.api.dsl.CreateCast;
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
Expand Down Expand Up @@ -42,4 +43,17 @@ Object getNative(Object name) {

}

@Builtin(proc = true, deref = ALL)
@GenerateNodeFactory
@NodeChild("base")
public static abstract class RegisterBaseNode extends OzNode {

@Specialization
Object registerBase(DynamicObject base) {
Loader.getInstance().registerBase(base);
return unit;
}

}

}
14 changes: 5 additions & 9 deletions vm/src/org/mozartoz/truffle/translator/Loader.java
Expand Up @@ -40,7 +40,6 @@
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.RootCallTarget;
import com.oracle.truffle.api.frame.FrameSlot;
import com.oracle.truffle.api.frame.MaterializedFrame;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.source.Source;
import com.oracle.truffle.api.source.SourceSection;
Expand Down Expand Up @@ -154,6 +153,11 @@ public DynamicObject loadBase() {
return base;
}

public void registerBase(DynamicObject base) {
assert this.base == null || this.base == base;
this.base = base;
}

private RootCallTarget parseBase() {
tick("enter parseBase");
Program program = BootCompiler.buildBaseEnvProgram(
Expand Down Expand Up @@ -231,7 +235,6 @@ public void runFunctor(Source source, String... args) {
throw t;
}
tick("deserialized Main");
base = getBaseFromMain(main);
} else {
eagerLoad = true;
try {
Expand Down Expand Up @@ -282,13 +285,6 @@ private Object applyInitFunctor(Object initFunctor) {
return execute(ApplyFunctor.apply(language, initFunctor, imports, "Init.apply"));
}

private DynamicObject getBaseFromMain(OzProc main) {
MaterializedFrame topFrame = OzArguments.getParentFrame(main.declarationFrame);
FrameSlot baseSlot = topFrame.getFrameDescriptor().getSlots().get(0);
assert baseSlot.getIdentifier().toString().contains("<Base>");
return (DynamicObject) topFrame.getValue(baseSlot);
}

// Shutdown

private List<Process> childProcesses = new LinkedList<>();
Expand Down

0 comments on commit afd7638

Please sign in to comment.