Skip to content
Snippets Groups Projects
Commit c999f119 authored by Julien Lopez's avatar Julien Lopez
Browse files

Override dollar operator for queries

parent 55f540a3
No related branches found
No related tags found
No related merge requests found
......@@ -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);
}
......
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