Skip to content
Snippets Groups Projects
Commit e6d1df39 authored by Mick Jordan's avatar Mick Jordan
Browse files

fix for sort.list

parent 09d9ad0d
Branches
No related tags found
No related merge requests found
......@@ -23,8 +23,10 @@
package com.oracle.truffle.r.nodes.builtin.base;
import static com.oracle.truffle.r.nodes.builtin.RBuiltinKind.*;
import com.oracle.truffle.api.CompilerDirectives.SlowPath;
import com.oracle.truffle.api.dsl.*;
import com.oracle.truffle.api.frame.*;
import com.oracle.truffle.r.nodes.*;
import com.oracle.truffle.r.nodes.access.*;
import com.oracle.truffle.r.nodes.builtin.*;
......@@ -48,6 +50,8 @@ public abstract class Order extends RBuiltinNode {
return new RNode[]{ConstantNode.create(RMissing.instance), ConstantNode.create(RMissing.instance)};
}
public abstract Object executeDoubleVector(VirtualFrame frame, RDoubleVector vec, RMissing tie);
@Child protected BooleanOperation eq = BinaryCompare.EQUAL.create();
@Child protected BooleanOperation lt = BinaryCompare.LESS_THAN.create();
@Child protected BooleanOperation le = BinaryCompare.LESS_EQUAL.create();
......
......@@ -26,7 +26,11 @@ import static com.oracle.truffle.r.nodes.builtin.RBuiltinKind.*;
import java.util.*;
import com.oracle.truffle.api.*;
import com.oracle.truffle.api.dsl.*;
import com.oracle.truffle.api.frame.*;
import com.oracle.truffle.r.nodes.*;
import com.oracle.truffle.r.nodes.access.*;
import com.oracle.truffle.r.nodes.builtin.*;
import com.oracle.truffle.r.runtime.*;
import com.oracle.truffle.r.runtime.data.*;
......@@ -42,19 +46,40 @@ public class SortFunctions {
@RBuiltin(name = "sort.list", kind = SUBSTITUTE)
// TODO Implement in R
public abstract static class SortList extends RBuiltinNode {
private static final String[] PARAMETER_NAMES = new String[]{"x", "partial", "na.last", "decreasing", "method"};
@Override
public Object[] getParameterNames() {
return PARAMETER_NAMES;
}
@Override
public RNode[] getParameterValues() {
return new RNode[]{ConstantNode.create(RMissing.instance), ConstantNode.create(RNull.instance), ConstantNode.create(RRuntime.LOGICAL_TRUE), ConstantNode.create(RRuntime.LOGICAL_FALSE),
ConstantNode.create(RMissing.instance)};
}
@Child Order doubleOrder;
@SuppressWarnings("unused")
@Specialization
public RDoubleVector sortList(RDoubleVector vec, byte decreasing) {
public RIntVector sortList(VirtualFrame frame, RDoubleVector vec, RNull partial, byte naLast, byte decreasing, RMissing method) {
controlVisibility();
double[] data = vec.getDataCopy();
Arrays.sort(data);
if (decreasing == RRuntime.LOGICAL_TRUE) {
double[] rdata = new double[data.length];
if (doubleOrder == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
doubleOrder = insert(OrderFactory.create(new RNode[2], getBuiltin()));
}
RIntVector result = (RIntVector) doubleOrder.executeDoubleVector(frame, vec, RMissing.instance);
if (RRuntime.fromLogical(decreasing)) {
int[] data = result.getDataWithoutCopying();
int[] rdata = new int[data.length];
for (int i = 0; i < data.length; i++) {
rdata[i] = data[data.length - (i + 1)];
}
data = rdata;
result.resetData(rdata);
}
return RDataFactory.createDoubleVector(data, RDataFactory.COMPLETE_VECTOR);
return result;
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment