From c999f119605a22f3f75d723e815626162a221d2d Mon Sep 17 00:00:00 2001 From: Julien Lopez <julien.lopez@lri.fr> Date: Thu, 16 Feb 2017 16:08:40 +0100 Subject: [PATCH] Override dollar operator for queries --- .../nodes/builtin/base/infix/AccessField.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/AccessField.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/AccessField.java index e41593722b..56d7bb579b 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/AccessField.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/AccessField.java @@ -32,6 +32,7 @@ import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.NodeChild; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.dsl.TypeSystemReference; +import com.oracle.truffle.api.frame.FrameDescriptor; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.profiles.BranchProfile; import com.oracle.truffle.api.profiles.ConditionProfile; @@ -46,12 +47,21 @@ import com.oracle.truffle.r.runtime.RError.Message; import com.oracle.truffle.r.runtime.RType; import com.oracle.truffle.r.runtime.builtins.RBuiltin; import com.oracle.truffle.r.runtime.builtins.RSpecialFactory; +import com.oracle.truffle.r.runtime.context.RContext; import com.oracle.truffle.r.runtime.data.RList; import com.oracle.truffle.r.runtime.data.RStringVector; import com.oracle.truffle.r.runtime.data.model.RAbstractListVector; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; +import com.oracle.truffle.r.runtime.env.REnvironment; import com.oracle.truffle.r.runtime.nodes.RNode; +import qir.ast.QIRLambda; +import qir.ast.QIRVariable; +import qir.ast.data.QIRTcons; +import qir.ast.data.QIRTdestr; +import qir.ast.data.QIRTnil; +import qir.ast.operator.QIRProject; + @TypeSystemReference(EmptyTypeSystemFlatLayout.class) @NodeChild(value = "arguments", type = RNode[].class) abstract class AccessFieldSpecial extends SpecialsUtils.ListFieldSpecialBase { @@ -108,6 +118,14 @@ public abstract class AccessField extends RBuiltinNode { if (!invalidAtomicVector.profile(container instanceof RAbstractListVector) && container instanceof RAbstractVector) { error.enter(); throw RError.error(this, RError.Message.DOLLAR_ATOMIC_VECTORS); + } else if (container instanceof REnvironment && ((REnvironment) container).get("queryId") != null) { + final Object queryId = ((REnvironment) container).get("queryId"); + if (queryId != null) { + final QIRVariable v = new QIRVariable(null, "t"); + RContext.queries.set((int) queryId, new QIRProject(getSourceSection(), + new QIRLambda(null, null, v, new QIRTcons(null, field, new QIRTdestr(null, v, field), QIRTnil.instance), new FrameDescriptor()), RContext.queries.get((int) queryId))); + return container; + } } return extract.applyAccessField(frame, container, field); } -- GitLab