From ef0b63e32ba909249cba576048c3503e129e7d60 Mon Sep 17 00:00:00 2001 From: Lukas Stadler <lukas.stadler@oracle.com> Date: Tue, 7 Feb 2017 18:44:19 +0100 Subject: [PATCH] check that arguments are not null --- .../r/nodes/access/AccessArgumentNode.java | 6 +++++- .../r/nodes/function/PromiseHelperNode.java | 17 +++++------------ 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java index d14ca391d6..c61c9a292e 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -129,6 +129,10 @@ public final class AccessArgumentNode extends RNode { } private Object doArgument(VirtualFrame frame, Object arg) { + if (arg == null) { + CompilerDirectives.transferToInterpreter(); + throw RInternalError.shouldNotReachHere("null argument in slot " + index + " of " + getRootNode()); + } if (hasDefaultArg) { if (isMissingProfile.profile(arg == RMissing.instance) || isEmptyProfile.profile(arg == REmpty.instance)) { return doArgumentInternal(frame); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseHelperNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseHelperNode.java index 75bf2c9831..5dfa524184 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseHelperNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseHelperNode.java @@ -27,7 +27,6 @@ import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -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.FrameSlotTypeException; @@ -194,9 +193,7 @@ public class PromiseHelperNode extends RBaseNode { if (isInOriginFrame(frame, promise)) { return promiseClosureCache.execute(frame, promise.getClosure()); } else { - Frame promiseFrame = promiseFrameProfile.profile(promise.getFrame()); - assert promiseFrame != null; - return promiseClosureCache.execute(wrapPromiseFrame(frame, promiseFrame), promise.getClosure()); + return promiseClosureCache.execute(wrapPromiseFrame(frame, promiseFrameProfile.profile(promise.getFrame())), promise.getClosure()); } } finally { promise.resetUnderEvaluation(); @@ -266,20 +263,16 @@ public class PromiseHelperNode extends RBaseNode { if (promise.isInOriginFrame(frame)) { return promise.getClosure().eval(frame.materialize()); } else { - Frame promiseFrame = promise.getFrame(); - assert promiseFrame != null; - - promiseFrame = wrapPromiseFrame(frame, promiseFrame); - return promise.getClosure().eval(promiseFrame.materialize()); + return promise.getClosure().eval(wrapPromiseFrame(frame, promise.getFrame())); } } finally { promise.resetUnderEvaluation(); } } - private static VirtualEvalFrame wrapPromiseFrame(VirtualFrame frame, Frame promiseFrame) { - return VirtualEvalFrame.create(promiseFrame.materialize(), RArguments.getFunction(promiseFrame), - RCaller.createForPromise(RArguments.getCall(promiseFrame), frame)); + private static VirtualEvalFrame wrapPromiseFrame(VirtualFrame frame, MaterializedFrame promiseFrame) { + assert promiseFrame != null; + return VirtualEvalFrame.create(promiseFrame, RArguments.getFunction(promiseFrame), RCaller.createForPromise(RArguments.getCall(promiseFrame), frame)); } private static Object generateValueEagerSlowPath(VirtualFrame frame, int state, EagerPromiseBase promise) { -- GitLab