Skip to content

Commit b59d520

Browse files
committed
Implement wrappers for sq_item/sq_setitem
1 parent 37096d2 commit b59d520

File tree

1 file changed

+90
-5
lines changed

1 file changed

+90
-5
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/hpy/HPyExternalFunctionNodes.java

Lines changed: 90 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,13 @@
6464
import com.oracle.graal.python.builtins.objects.cext.hpy.HPyExternalFunctionNodesFactory.HPyCheckHandleResultNodeGen;
6565
import com.oracle.graal.python.builtins.objects.cext.hpy.HPyExternalFunctionNodesFactory.HPyCheckPrimitiveResultNodeGen;
6666
import com.oracle.graal.python.builtins.objects.cext.hpy.HPyExternalFunctionNodesFactory.HPyExternalFunctionInvokeNodeGen;
67+
import com.oracle.graal.python.builtins.objects.common.IndexNodes.NormalizeIndexNode;
6768
import com.oracle.graal.python.builtins.objects.exception.PBaseException;
6869
import com.oracle.graal.python.builtins.objects.function.PArguments;
6970
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
7071
import com.oracle.graal.python.builtins.objects.function.PKeyword;
7172
import com.oracle.graal.python.builtins.objects.function.Signature;
73+
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
7274
import com.oracle.graal.python.nodes.ErrorMessages;
7375
import com.oracle.graal.python.nodes.IndirectCallNode;
7476
import com.oracle.graal.python.nodes.PGuards;
@@ -645,7 +647,7 @@ public Signature getSignature() {
645647
}
646648
}
647649

648-
static final class HPyMethSSizeArgFuncRoot extends HPyMethodDescriptorRootNode {
650+
static class HPyMethSSizeArgFuncRoot extends HPyMethodDescriptorRootNode {
649651
private static final Signature SIGNATURE = new Signature(2, false, -1, false, new String[]{"$self", "n"}, KEYWORDS_HIDDEN_CALLABLE, true);
650652

651653
@Child private ReadIndexedArgumentNode readArg1Node;
@@ -659,7 +661,7 @@ protected Object[] prepareCArguments(VirtualFrame frame) {
659661
return new Object[]{getSelf(frame), getArg1(frame)};
660662
}
661663

662-
private Object getArg1(VirtualFrame frame) {
664+
protected Object getArg1(VirtualFrame frame) {
663665
if (readArg1Node == null) {
664666
CompilerDirectives.transferToInterpreterAndInvalidate();
665667
readArg1Node = insert(ReadIndexedArgumentNode.create(1));
@@ -673,6 +675,58 @@ public Signature getSignature() {
673675
}
674676
}
675677

678+
/**
679+
* Implements semantics of {@code typeobject.c: wrap_sq_item}.
680+
*/
681+
static final class HPyMethSqItemWrapperRoot extends HPyMethSSizeArgFuncRoot {
682+
683+
@Child private GetIndexNode getIndexNode;
684+
685+
public HPyMethSqItemWrapperRoot(PythonLanguage language, String name) {
686+
super(language, name);
687+
}
688+
689+
@Override
690+
protected Object[] prepareCArguments(VirtualFrame frame) {
691+
Object self = getSelf(frame);
692+
return new Object[]{self, getIndex(self, getArg1(frame))};
693+
}
694+
695+
private int getIndex(Object self, Object index) {
696+
if (getIndexNode == null) {
697+
CompilerDirectives.transferToInterpreterAndInvalidate();
698+
getIndexNode = insert(GetIndexNode.create());
699+
}
700+
return getIndexNode.execute(self, index);
701+
}
702+
}
703+
704+
/**
705+
* Implements semantics of {@code typeobject.c: wrap_sq_setitem}.
706+
*/
707+
static final class HPyMethSqSetitemWrapperRoot extends HPyMethSSizeObjArgProcRoot {
708+
709+
@Child private GetIndexNode getIndexNode;
710+
711+
public HPyMethSqSetitemWrapperRoot(PythonLanguage language, String name) {
712+
super(language, name);
713+
}
714+
715+
@Override
716+
protected Object[] prepareCArguments(VirtualFrame frame) {
717+
Object self = getSelf(frame);
718+
return new Object[]{self, getIndex(self, getArg1(frame)), getArg2(frame)};
719+
}
720+
721+
private int getIndex(Object self, Object index) {
722+
if (getIndexNode == null) {
723+
CompilerDirectives.transferToInterpreterAndInvalidate();
724+
getIndexNode = insert(GetIndexNode.create());
725+
}
726+
return getIndexNode.execute(self, index);
727+
}
728+
}
729+
676730
static final class HPyMethSSizeSSizeArgFuncRoot extends HPyMethodDescriptorRootNode {
677731
private static final Signature SIGNATURE = new Signature(3, false, -1, false, new String[]{"$self", "n", "m"}, KEYWORDS_HIDDEN_CALLABLE, true);
678732

@@ -771,7 +825,7 @@ public Signature getSignature() {
771825
}
772826
}
773827

774-
static final class HPyMethSSizeObjArgProcRoot extends HPyMethodDescriptorRootNode {
828+
static class HPyMethSSizeObjArgProcRoot extends HPyMethodDescriptorRootNode {
775829
private static final Signature SIGNATURE = new Signature(3, false, -1, false, new String[]{"$self", "arg0", "arg1"}, KEYWORDS_HIDDEN_CALLABLE, true);
776830

777831
@Child private ReadIndexedArgumentNode readArg1Node;
@@ -786,15 +840,15 @@ protected Object[] prepareCArguments(VirtualFrame frame) {
786840
return new Object[]{getSelf(frame), getArg1(frame), getArg2(frame)};
787841
}
788842

789-
private Object getArg1(VirtualFrame frame) {
843+
protected Object getArg1(VirtualFrame frame) {
790844
if (readArg1Node == null) {
791845
CompilerDirectives.transferToInterpreterAndInvalidate();
792846
readArg1Node = insert(ReadIndexedArgumentNode.create(1));
793847
}
794848
return readArg1Node.execute(frame);
795849
}
796850

797-
private Object getArg2(VirtualFrame frame) {
851+
protected Object getArg2(VirtualFrame frame) {
798852
if (readArg2Node == null) {
799853
CompilerDirectives.transferToInterpreterAndInvalidate();
800854
readArg2Node = insert(ReadIndexedArgumentNode.create(2));
@@ -1040,4 +1094,35 @@ Object doObject(PythonContext context, @SuppressWarnings("unused") GraalHPyConte
10401094
throw raiseNode.raise(SystemError, "function '%s' did not return an integer.", name);
10411095
}
10421096
}
1097+
1098+
/**
1099+
* Implements semantics of function {@code typeobject.c: getindex}.
1100+
*/
1101+
static final class GetIndexNode extends Node {
1102+
1103+
@Child private PythonObjectLibrary indexLib = PythonObjectLibrary.getFactory().createDispatched(3);
1104+
@Child private PythonObjectLibrary selfLib;
1105+
@Child private NormalizeIndexNode normalizeIndexNode;
1106+
1107+
public int execute(Object self, Object indexObj) {
1108+
int index = indexLib.asSize(indexObj);
1109+
if (index < 0) {
1110+
// 'selfLib' acts as an implicit profile for 'index < 0'
1111+
if (selfLib == null) {
1112+
CompilerDirectives.transferToInterpreterAndInvalidate();
1113+
selfLib = insert(PythonObjectLibrary.getFactory().createDispatched(1));
1114+
}
1115+
if (normalizeIndexNode == null) {
1116+
CompilerDirectives.transferToInterpreterAndInvalidate();
1117+
normalizeIndexNode = insert(NormalizeIndexNode.create(false));
1118+
}
1119+
return normalizeIndexNode.execute(index, selfLib.length(self));
1120+
}
1121+
return index;
1122+
}
1123+
1124+
public static GetIndexNode create() {
1125+
return new GetIndexNode();
1126+
}
1127+
}
10431128
}

0 commit comments

Comments
 (0)