Skip to content

Commit c9ac564

Browse files
committed
Add factory method for memoryview
1 parent e86eb5a commit c9ac564

File tree

5 files changed

+35
-30
lines changed

5 files changed

+35
-30
lines changed

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

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3330,7 +3330,7 @@ public final IntrinsifiedPMemoryView execute(Object object) {
33303330
// TODO arrays should support buffer protocol too, but their implementation would be
33313331
// complex, because they don't have an underlying byte array
33323332
@Specialization
3333-
static IntrinsifiedPMemoryView fromBytes(@SuppressWarnings("unused") Object cls, PBytes object,
3333+
IntrinsifiedPMemoryView fromBytes(@SuppressWarnings("unused") Object cls, PBytes object,
33343334
@Shared("getQueue") @Cached MemoryViewNodes.GetBufferReferences getQueue,
33353335
@Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode,
33363336
@Cached SequenceStorageNodes.LenNode lenNode) {
@@ -3339,7 +3339,7 @@ static IntrinsifiedPMemoryView fromBytes(@SuppressWarnings("unused") Object cls,
33393339
}
33403340

33413341
@Specialization
3342-
static IntrinsifiedPMemoryView fromByteArray(@SuppressWarnings("unused") Object cls, PByteArray object,
3342+
IntrinsifiedPMemoryView fromByteArray(@SuppressWarnings("unused") Object cls, PByteArray object,
33433343
@Shared("getQueue") @Cached MemoryViewNodes.GetBufferReferences getQueue,
33443344
@Cached SequenceNodes.GetSequenceStorageNode getSequenceStorageNode,
33453345
@Cached SequenceStorageNodes.LenNode lenNode) {
@@ -3351,9 +3351,8 @@ static IntrinsifiedPMemoryView fromByteArray(@SuppressWarnings("unused") Object
33513351
IntrinsifiedPMemoryView fromMemoryView(@SuppressWarnings("unused") Object cls, IntrinsifiedPMemoryView object,
33523352
@Shared("getQueue") @Cached MemoryViewNodes.GetBufferReferences getQueue) {
33533353
object.checkReleased(this);
3354-
return new IntrinsifiedPMemoryView(PythonBuiltinClassType.PMemoryView, PythonBuiltinClassType.PMemoryView.getInstanceShape(),
3355-
getQueue.execute(), object.getManagedBuffer(), object.getOwner(), object.getLength(),
3356-
object.isReadOnly(), object.getItemSize(), object.getFormatString(), object.getDimensions(),
3354+
return factory().createMemoryView(getQueue.execute(), object.getManagedBuffer(), object.getOwner(), object.getLength(),
3355+
object.isReadOnly(), object.getItemSize(), object.getFormat(), object.getFormatString(), object.getDimensions(),
33573356
object.getBufferPointer(), object.getOffset(), object.getBufferShape(), object.getBufferStrides(),
33583357
object.getBufferSuboffsets(), object.getFlags());
33593358
}
@@ -3371,16 +3370,14 @@ IntrinsifiedPMemoryView error(@SuppressWarnings("unused") Object cls, Object obj
33713370
throw raise(TypeError, ErrorMessages.MEMORYVIEW_A_BYTES_LIKE_OBJECT_REQUIRED_NOT_P, object);
33723371
}
33733372

3374-
private static IntrinsifiedPMemoryView fromManaged(Object object, int itemsize, int length, boolean readonly, String format, boolean needsRelease,
3373+
private IntrinsifiedPMemoryView fromManaged(Object object, int itemsize, int length, boolean readonly, String format, boolean needsRelease,
33753374
MemoryViewNodes.BufferReferences refQueue) {
3376-
// TODO factory
33773375
ManagedBuffer managedBuffer = null;
33783376
if (needsRelease) {
33793377
// TODO We should lock the underlying storage for resizing
33803378
managedBuffer = ManagedBuffer.createForManaged(object);
33813379
}
3382-
return new IntrinsifiedPMemoryView(PythonBuiltinClassType.PMemoryView, PythonBuiltinClassType.PMemoryView.getInstanceShape(),
3383-
refQueue, managedBuffer, object, length * itemsize, readonly, itemsize, format, 1,
3380+
return factory().createMemoryView(refQueue, managedBuffer, object, length * itemsize, readonly, itemsize, format, 1,
33843381
null, 0, new int[]{length}, new int[]{itemsize}, null,
33853382
IntrinsifiedPMemoryView.FLAG_C | IntrinsifiedPMemoryView.FLAG_FORTRAN);
33863383
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1621,8 +1621,9 @@ Object wrap(VirtualFrame frame, Object bufferStructPointer, Object ownerObj, Obj
16211621
if (!lib.isNull(bufferStructPointer)) {
16221622
managedBuffer = ManagedBuffer.createForNative(bufferStructPointer);
16231623
}
1624-
IntrinsifiedPMemoryView memoryview = new IntrinsifiedPMemoryView(PythonBuiltinClassType.PMemoryView, PythonBuiltinClassType.PMemoryView.getInstanceShape(),
1625-
getQueue.execute(), managedBuffer, owner, len, readonly, itemsize, format, ndim, bufPointer, 0, shape, strides, suboffsets, flags);
1624+
IntrinsifiedPMemoryView memoryview = factory().createMemoryView(getQueue.execute(), managedBuffer, owner, len, readonly, itemsize,
1625+
IntrinsifiedPMemoryView.BufferFormat.fromString(format),
1626+
format, ndim, bufPointer, 0, shape, strides, suboffsets, flags);
16261627
return toNewRefNode.execute(memoryview);
16271628
} catch (PException e) {
16281629
transformToNative(frame, e);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/memoryview/IntrinsifiedPMemoryView.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,14 @@ public class IntrinsifiedPMemoryView extends PythonBuiltinObject {
4949
private int cachedHash = -1;
5050

5151
public IntrinsifiedPMemoryView(Object cls, Shape instanceShape, MemoryViewNodes.BufferReferences references, ManagedBuffer managedBuffer, Object owner,
52-
int len, boolean readonly, int itemsize, String formatString, int ndim, Object bufPointer,
52+
int len, boolean readonly, int itemsize, BufferFormat format, String formatString, int ndim, Object bufPointer,
5353
int offset, int[] shape, int[] strides, int[] suboffsets, int flags) {
5454
super(cls, instanceShape);
5555
this.owner = owner;
5656
this.len = len;
5757
this.readonly = readonly;
5858
this.itemsize = itemsize;
59-
this.format = BufferFormat.fromString(formatString);
59+
this.format = format;
6060
this.formatString = formatString;
6161
this.ndim = ndim;
6262
this.bufPointer = bufPointer;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/memoryview/MemoryViewBuiltins.java

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -172,10 +172,8 @@ Object getitemSlice(IntrinsifiedPMemoryView self, PSlice slice,
172172
int[] suboffsets = self.getBufferSuboffsets();
173173
int lenght = self.getLength() - (shape[0] - newShape[0]) * self.getItemSize();
174174
int flags = initFlagsNode.execute(self.getDimensions(), self.getItemSize(), newShape, newStrides, suboffsets);
175-
// TODO factory
176-
return new IntrinsifiedPMemoryView(PythonBuiltinClassType.PMemoryView, PythonBuiltinClassType.PMemoryView.getInstanceShape(),
177-
getQueue.execute(), self.getManagedBuffer(), self.getOwner(), lenght, self.isReadOnly(),
178-
self.getItemSize(), self.getFormatString(), self.getDimensions(), self.getBufferPointer(),
175+
return factory().createMemoryView(getQueue.execute(), self.getManagedBuffer(), self.getOwner(), lenght, self.isReadOnly(),
176+
self.getItemSize(), self.getFormat(), self.getFormatString(), self.getDimensions(), self.getBufferPointer(),
179177
self.getOffset() + sliceInfo.start * strides[0], newShape, newStrides, suboffsets, flags);
180178
}
181179

@@ -220,8 +218,7 @@ Object setitem(VirtualFrame frame, IntrinsifiedPMemoryView self, PSlice slice, O
220218
}
221219
IntrinsifiedPMemoryView srcView = createMemoryView.execute(object);
222220
IntrinsifiedPMemoryView destView = (IntrinsifiedPMemoryView) getItemNode.execute(frame, self, slice);
223-
// TODO format skip @
224-
if (srcView.getDimensions() != destView.getDimensions() || srcView.getBufferShape()[0] != destView.getBufferShape()[0] || !srcView.getFormatString().equals(destView.getFormatString())) {
221+
if (srcView.getDimensions() != destView.getDimensions() || srcView.getBufferShape()[0] != destView.getBufferShape()[0] || srcView.getFormat() != destView.getFormat()) {
225222
throw raise(ValueError, ErrorMessages.MEMORYVIEW_DIFFERENT_STRUCTURES);
226223
}
227224
// The intermediate array is necessary for overlapping views (where src and dest are the
@@ -516,10 +513,8 @@ public static abstract class ToReadonlyNode extends PythonUnaryBuiltinNode {
516513
IntrinsifiedPMemoryView toreadonly(IntrinsifiedPMemoryView self,
517514
@Cached MemoryViewNodes.GetBufferReferences getQueue) {
518515
self.checkReleased(this);
519-
// TODO factory
520-
return new IntrinsifiedPMemoryView(PythonBuiltinClassType.PMemoryView, PythonBuiltinClassType.PMemoryView.getInstanceShape(),
521-
getQueue.execute(), self.getManagedBuffer(), self.getOwner(), self.getLength(), true,
522-
self.getItemSize(), self.getFormatString(), self.getDimensions(), self.getBufferPointer(),
516+
return factory().createMemoryView(getQueue.execute(), self.getManagedBuffer(), self.getOwner(), self.getLength(), true,
517+
self.getItemSize(), self.getFormat(), self.getFormatString(), self.getDimensions(), self.getBufferPointer(),
523518
self.getOffset(), self.getBufferShape(), self.getBufferStrides(), self.getBufferSuboffsets(), self.getFlags());
524519
}
525520
}
@@ -615,10 +610,8 @@ private IntrinsifiedPMemoryView doCast(IntrinsifiedPMemoryView self, String form
615610
}
616611
newStrides = IntrinsifiedPMemoryView.initStridesFromShape(ndim, itemsize, shape);
617612
}
618-
// TODO factory
619-
return new IntrinsifiedPMemoryView(PythonBuiltinClassType.PMemoryView, PythonBuiltinClassType.PMemoryView.getInstanceShape(),
620-
refQueue, self.getManagedBuffer(), self.getOwner(), self.getLength(), self.isReadOnly(),
621-
itemsize, formatString, ndim, self.getBufferPointer(),
613+
return factory().createMemoryView(refQueue, self.getManagedBuffer(), self.getOwner(), self.getLength(), self.isReadOnly(),
614+
itemsize, format, formatString, ndim, self.getBufferPointer(),
622615
self.getOffset(), newShape, newStrides, null, flags);
623616
}
624617

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/object/PythonObjectFactory.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,10 @@
8989
import com.oracle.graal.python.builtins.objects.lzma.PLZMADecompressor;
9090
import com.oracle.graal.python.builtins.objects.map.PMap;
9191
import com.oracle.graal.python.builtins.objects.mappingproxy.PMappingproxy;
92+
import com.oracle.graal.python.builtins.objects.memoryview.IntrinsifiedPMemoryView;
93+
import com.oracle.graal.python.builtins.objects.memoryview.ManagedBuffer;
94+
import com.oracle.graal.python.builtins.objects.memoryview.MemoryViewNodes;
9295
import com.oracle.graal.python.builtins.objects.memoryview.PBuffer;
93-
import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView;
9496
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
9597
import com.oracle.graal.python.builtins.objects.method.PDecoratedMethod;
9698
import com.oracle.graal.python.builtins.objects.method.PMethod;
@@ -400,8 +402,20 @@ public PythonClass createPythonClass(Object metaclass, String name, boolean invo
400402
return trace(new PythonClass(getLanguage(), metaclass, getShape(metaclass), name, invokeMro, bases));
401403
}
402404

403-
public PMemoryView createMemoryView(Object cls, Object value) {
404-
return trace(new PMemoryView(cls, getShape(cls), value));
405+
public IntrinsifiedPMemoryView createMemoryView(MemoryViewNodes.BufferReferences references, ManagedBuffer managedBuffer, Object owner,
406+
int len, boolean readonly, int itemsize, IntrinsifiedPMemoryView.BufferFormat format, String formatString, int ndim, Object bufPointer,
407+
int offset, int[] shape, int[] strides, int[] suboffsets, int flags) {
408+
PythonBuiltinClassType cls = PythonBuiltinClassType.PMemoryView;
409+
return trace(new IntrinsifiedPMemoryView(cls, getShape(cls), references, managedBuffer, owner, len, readonly, itemsize, format, formatString,
410+
ndim, bufPointer, offset, shape, strides, suboffsets, flags));
411+
}
412+
413+
public IntrinsifiedPMemoryView createMemoryView(MemoryViewNodes.BufferReferences references, ManagedBuffer managedBuffer, Object owner,
414+
int len, boolean readonly, int itemsize, String formatString, int ndim, Object bufPointer,
415+
int offset, int[] shape, int[] strides, int[] suboffsets, int flags) {
416+
PythonBuiltinClassType cls = PythonBuiltinClassType.PMemoryView;
417+
return trace(new IntrinsifiedPMemoryView(cls, getShape(cls), references, managedBuffer, owner, len, readonly, itemsize,
418+
IntrinsifiedPMemoryView.BufferFormat.fromString(formatString), formatString, ndim, bufPointer, offset, shape, strides, suboffsets, flags));
405419
}
406420

407421
public final PMethod createMethod(Object cls, Object self, Object function) {

0 commit comments

Comments
 (0)