Skip to content
Snippets Groups Projects
Commit 37187357 authored by Florian Angerer's avatar Florian Angerer
Browse files

Initializing active binding for '.Random.seed' in REngine

programatically.
parent 944093c8
No related branches found
No related tags found
No related merge requests found
......@@ -36,6 +36,8 @@ import com.oracle.truffle.api.Truffle;
import com.oracle.truffle.api.TruffleLanguage.ContextReference;
import com.oracle.truffle.api.dsl.UnsupportedSpecializationException;
import com.oracle.truffle.api.frame.Frame;
import com.oracle.truffle.api.frame.FrameSlot;
import com.oracle.truffle.api.frame.FrameSlotKind;
import com.oracle.truffle.api.frame.MaterializedFrame;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.interop.TruffleObject;
......@@ -76,6 +78,7 @@ import com.oracle.truffle.r.runtime.RParserFactory;
import com.oracle.truffle.r.runtime.RProfile;
import com.oracle.truffle.r.runtime.RRuntime;
import com.oracle.truffle.r.runtime.RSource;
import com.oracle.truffle.r.runtime.RType;
import com.oracle.truffle.r.runtime.ReturnException;
import com.oracle.truffle.r.runtime.RootWithBody;
import com.oracle.truffle.r.runtime.SubstituteVirtualFrame;
......@@ -98,12 +101,15 @@ import com.oracle.truffle.r.runtime.data.RSymbol;
import com.oracle.truffle.r.runtime.data.RTypedValue;
import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
import com.oracle.truffle.r.runtime.env.REnvironment;
import com.oracle.truffle.r.runtime.env.frame.ActiveBinding;
import com.oracle.truffle.r.runtime.env.frame.FrameSlotChangeMonitor;
import com.oracle.truffle.r.runtime.interop.R2Foreign;
import com.oracle.truffle.r.runtime.interop.R2ForeignNodeGen;
import com.oracle.truffle.r.runtime.nodes.RCodeBuilder;
import com.oracle.truffle.r.runtime.nodes.RNode;
import com.oracle.truffle.r.runtime.nodes.RSyntaxElement;
import com.oracle.truffle.r.runtime.nodes.RSyntaxNode;
import com.oracle.truffle.r.runtime.rng.RRNG;
/**
* The engine for the FastR implementation. Handles parsing and evaluation. There is one instance of
......@@ -152,6 +158,7 @@ final class REngine implements Engine, Engine.Timings {
if (context.getKind() == RContext.ContextKind.SHARE_NOTHING) {
initializeNonShared();
}
initializeRNG();
}
private void initializeNonShared() {
......@@ -201,6 +208,15 @@ final class REngine implements Engine, Engine.Timings {
}
}
private void initializeRNG() {
assert REnvironment.globalEnv() != null;
RFunction fun = context.lookupBuiltin(".fastr.set.seed");
ActiveBinding dotRandomSeed = new ActiveBinding(RType.Any, fun);
Frame frame = REnvironment.globalEnv().getFrame();
FrameSlot slot = FrameSlotChangeMonitor.findOrAddFrameSlot(frame.getFrameDescriptor(), RRNG.RANDOM_SEED, FrameSlotKind.Object);
FrameSlotChangeMonitor.setActiveBinding(frame, slot, dotRandomSeed, false, null);
}
@Override
public void checkAndRunStartupShutdownFunction(String name, String... args) {
Object func = REnvironment.globalEnv().findFunction(name);
......
......@@ -27,5 +27,3 @@ eval(expression({
}
})
}), asNamespace("base"))
makeActiveBinding(".Random.seed", .fastr.set.seed, .GlobalEnv)
......@@ -39,10 +39,8 @@ import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.r.nodes.builtin.NodeWithArgumentCasts.Casts;
import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
import com.oracle.truffle.r.runtime.RError;
import com.oracle.truffle.r.runtime.RError.Message;
import com.oracle.truffle.r.runtime.builtins.RBuiltin;
import com.oracle.truffle.r.runtime.builtins.RBuiltinKind;
import com.oracle.truffle.r.runtime.context.RContext;
import com.oracle.truffle.r.runtime.data.RDataFactory;
import com.oracle.truffle.r.runtime.data.RIntVector;
......@@ -129,15 +127,26 @@ public class RNGFunctions {
return RNull.instance;
}
protected boolean isSetOperation(Object param) {
return !(param instanceof RMissing);
}
@Specialization(guards = {"isSetOperation(data)"})
@TruffleBoundary
protected RNull setSeed(Object data) {
RContext.getInstance().stateRNG.currentSeeds = data;
return RNull.instance;
}
@Specialization
@TruffleBoundary
protected Object getSeed(@SuppressWarnings("unused") RMissing data) {
int[] seeds = RContext.getInstance().stateRNG.currentSeeds;
if (seeds != null) {
return RDataFactory.createIntVector(seeds, RDataFactory.INCOMPLETE_VECTOR);
Object seeds = RContext.getInstance().stateRNG.currentSeeds;
if (seeds instanceof int[]) {
int[] seedsArr = (int[]) seeds;
return RDataFactory.createIntVector(seedsArr, RDataFactory.INCOMPLETE_VECTOR);
}
// throw error(RError.Message.UNKNOWN_OBJECT, ".Random.seed");
return RNull.instance;
return seeds;
}
}
......
......@@ -17,16 +17,11 @@ import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.r.runtime.RError;
import com.oracle.truffle.r.runtime.RRuntime;
import com.oracle.truffle.r.runtime.RType;
import com.oracle.truffle.r.runtime.context.RContext;
import com.oracle.truffle.r.runtime.data.RDataFactory;
import com.oracle.truffle.r.runtime.data.RIntVector;
import com.oracle.truffle.r.runtime.data.RMissing;
import com.oracle.truffle.r.runtime.data.RNull;
import com.oracle.truffle.r.runtime.data.RPromise;
import com.oracle.truffle.r.runtime.data.RTypedValue;
import com.oracle.truffle.r.runtime.env.REnvironment;
import com.oracle.truffle.r.runtime.env.frame.ActiveBinding;
import com.oracle.truffle.r.runtime.ffi.BaseRFFI;
import com.oracle.truffle.r.runtime.rng.mm.MarsagliaMulticarry;
import com.oracle.truffle.r.runtime.rng.mt.MersenneTwister;
......@@ -102,14 +97,14 @@ public class RRNG {
public static final Integer SAME_SEED = null;
private static final Kind DEFAULT_KIND = Kind.MERSENNE_TWISTER;
private static final NormKind DEFAULT_NORM_KIND = NormKind.INVERSION;
private static final String RANDOM_SEED = ".Random.seed";
public static final String RANDOM_SEED = ".Random.seed";
private static final double UINT_MAX = (double) Integer.MAX_VALUE * 2;
public static final class ContextStateImpl implements RContext.ContextState {
private RandomNumberGenerator currentGenerator;
private final RandomNumberGenerator[] allGenerators;
private NormKind currentNormKind;
public int[] currentSeeds;
public Object currentSeeds;
private ContextStateImpl() {
this.currentNormKind = DEFAULT_NORM_KIND;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment