Skip to content

Commit 7257ccf

Browse files
committed
Add SequenceStorage Nodes
1 parent aeae1d4 commit 7257ccf

15 files changed

+251
-132
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/MarshalModuleBuiltins.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import com.oracle.graal.python.builtins.objects.common.HashingStorage.DictEntry;
5757
import com.oracle.graal.python.builtins.objects.common.HashingStorageLibrary;
5858
import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetObjectArrayNode;
59+
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
5960
import com.oracle.graal.python.builtins.objects.complex.PComplex;
6061
import com.oracle.graal.python.builtins.objects.dict.PDict;
6162
import com.oracle.graal.python.builtins.objects.floats.PFloat;
@@ -402,9 +403,10 @@ void handlePTuple(VirtualFrame frame, PTuple t, int version, DataOutputStream bu
402403
}
403404

404405
@Specialization
405-
void handlePList(VirtualFrame frame, PList l, int version, DataOutputStream buffer) {
406+
void handlePList(VirtualFrame frame, PList l, int version, DataOutputStream buffer,
407+
@Cached SequenceStorageNodes.GetInternalObjectArrayNode getArray) {
406408
writeByte(TYPE_LIST, version, buffer);
407-
Object[] items = l.getSequenceStorage().getInternalArray();
409+
Object[] items = getArray.execute(l.getSequenceStorage());
408410
writeInt(items.length, version, buffer);
409411
for (int i = 0; i < items.length; i++) {
410412
getRecursiveNode().execute(frame, items[i], version, buffer);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PosixSubprocessModuleBuiltins.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import com.oracle.graal.python.builtins.objects.PNone;
6060
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
6161
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
62+
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
6263
import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum;
6364
import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum.ErrorAndMessagePair;
6465
import com.oracle.graal.python.builtins.objects.function.PArguments;
@@ -101,18 +102,18 @@ abstract static class ForkExecNode extends PythonBuiltinNode {
101102
@Child private BytesNodes.ToBytesNode toBytes = BytesNodes.ToBytesNode.create();
102103

103104
@Specialization
104-
@SuppressWarnings("try")
105105
int forkExec(VirtualFrame frame, PList args, @SuppressWarnings("unused") PList execList, @SuppressWarnings("unused") boolean closeFds,
106106
@SuppressWarnings("unused") PList fdsToKeep, String cwd, PList env,
107107
int p2cread, int p2cwrite, int c2pread, int c2pwrite,
108108
int errread, int errwrite, @SuppressWarnings("unused") int errpipe_read, int errpipe_write,
109-
@SuppressWarnings("unused") boolean restore_signals, @SuppressWarnings("unused") boolean call_setsid, @SuppressWarnings("unused") PNone preexec_fn) {
109+
@SuppressWarnings("unused") boolean restore_signals, @SuppressWarnings("unused") boolean call_setsid, @SuppressWarnings("unused") PNone preexec_fn,
110+
@Cached SequenceStorageNodes.CopyInternalArrayNode copy) {
110111

111112
PythonContext context = getContext();
112113
Object state = IndirectCallContext.enter(frame, context, this);
113114
try {
114115
return forkExec(args, execList, closeFds, fdsToKeep, cwd, env, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, restore_signals, call_setsid,
115-
preexec_fn);
116+
preexec_fn, copy);
116117
} finally {
117118
IndirectCallContext.exit(frame, context, state);
118119
}
@@ -123,15 +124,16 @@ private synchronized int forkExec(PList args, @SuppressWarnings("unused") PList
123124
@SuppressWarnings("unused") PList fdsToKeep, String cwd, PList env,
124125
int p2cread, int p2cwrite, int c2pread, int c2pwrite,
125126
int errread, int errwrite, @SuppressWarnings("unused") int errpipe_read, int errpipe_write,
126-
@SuppressWarnings("unused") boolean restore_signals, @SuppressWarnings("unused") boolean call_setsid, @SuppressWarnings("unused") PNone preexec_fn) {
127+
@SuppressWarnings("unused") boolean restore_signals, @SuppressWarnings("unused") boolean call_setsid, @SuppressWarnings("unused") PNone preexec_fn,
128+
@Cached SequenceStorageNodes.CopyInternalArrayNode copy) {
127129
PythonContext context = getContext();
128130
PosixResources resources = context.getResources();
129131
if (!context.isExecutableAccessAllowed()) {
130132
return -1;
131133
}
132134

133135
ArrayList<String> argStrings = new ArrayList<>();
134-
Object[] copyOfInternalArray = args.getSequenceStorage().getCopyOfInternalArray();
136+
Object[] copyOfInternalArray = copy.execute(args.getSequenceStorage());
135137
for (Object o : copyOfInternalArray) {
136138
if (o instanceof String) {
137139
argStrings.add((String) o);
@@ -249,6 +251,7 @@ int forkExecDefault(VirtualFrame frame, Object args, Object executable_list, Obj
249251
@Cached CastToListNode castFdsToKeep,
250252
@Cached CastToJavaStringNode castCwd,
251253
@Cached CastToListNode castEnv,
254+
@Cached SequenceStorageNodes.CopyInternalArrayNode copy,
252255
@CachedLibrary(limit = "3") PythonObjectLibrary lib) {
253256

254257
String actualCwd;
@@ -281,7 +284,7 @@ int forkExecDefault(VirtualFrame frame, Object args, Object executable_list, Obj
281284
lib.asSizeWithState(errpipe_read, PArguments.getThreadState(frame)),
282285
lib.asSizeWithState(errpipe_write, PArguments.getThreadState(frame)),
283286
lib.isTrueWithState(restore_signals, PArguments.getThreadState(frame)),
284-
lib.isTrueWithState(call_setsid, PArguments.getThreadState(frame)), preexec_fn);
287+
lib.isTrueWithState(call_setsid, PArguments.getThreadState(frame)), preexec_fn, copy);
285288
}
286289
}
287290
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceNodes.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,23 @@ static Object[] doGeneric(Object seq,
125125
@Cached SequenceStorageNodes.ToArrayNode toArrayNode) {
126126
return toArrayNode.execute(getSequenceStorageNode.execute(seq));
127127
}
128+
}
129+
130+
@GenerateUncached
131+
public abstract static class SetSequenceStorageNode extends Node {
132+
133+
public abstract void execute(PSequence s, SequenceStorage storage);
134+
135+
@Specialization(guards = "s.getClass() == cachedClass")
136+
static void doSpecial(PSequence s, SequenceStorage storage,
137+
@Cached("s.getClass()") Class<? extends PSequence> cachedClass) {
138+
cachedClass.cast(s).setSequenceStorage(storage);
139+
}
128140

129-
public static GetObjectArrayNode create() {
130-
return SequenceNodesFactory.GetObjectArrayNodeGen.create();
141+
@Specialization(replaces = "doSpecial")
142+
@CompilerDirectives.TruffleBoundary
143+
static void doGeneric(PSequence s, SequenceStorage storage) {
144+
s.setSequenceStorage(storage);
131145
}
132146
}
133147
}

0 commit comments

Comments
 (0)