Skip to content

Commit 0ccaf70

Browse files
committed
Delegate operations to 'nativememoryview' object.
1 parent 2e6c0e0 commit 0ccaf70

File tree

3 files changed

+44
-9
lines changed

3 files changed

+44
-9
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ public final class NativeMemberNames {
103103
public static final String IM_FUNC = "im_func";
104104
public static final String IM_SELF = "im_self";
105105
public static final String SQ_REPEAT = "sq_repeat";
106+
public static final String MEMORYVIEW_FLAGS = "flags";
106107

107108
@CompilationFinal(dimensions = 1) public static final String[] values;
108109
static {

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

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
import com.oracle.graal.python.builtins.objects.str.PString;
7373
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
7474
import com.oracle.graal.python.builtins.objects.type.PythonClass;
75+
import com.oracle.graal.python.nodes.BuiltinNames;
7576
import com.oracle.graal.python.nodes.PBaseNode;
7677
import com.oracle.graal.python.nodes.PGuards;
7778
import com.oracle.graal.python.nodes.SpecialAttributeNames;
@@ -162,7 +163,7 @@ public Object access(PythonNativeWrapper object, String key) {
162163
@ImportStatic({NativeMemberNames.class, SpecialMethodNames.class, SpecialAttributeNames.class})
163164
@TypeSystemReference(PythonArithmeticTypes.class)
164165
abstract static class ReadNativeMemberNode extends PBaseNode {
165-
@Child GetClassNode getClass = GetClassNode.create();
166+
@Child GetClassNode getClassNode;
166167
@Child private ToSulongNode toSulongNode;
167168
@Child private HashingStorageNodes.GetItemNode getItemNode;
168169
@Child private CExtNodes.SizeofWCharNode sizeofWcharNode;
@@ -186,7 +187,7 @@ int doObRefcnt(@SuppressWarnings("unused") Object o, @SuppressWarnings("unused")
186187

187188
@Specialization(guards = "eq(OB_TYPE, key)")
188189
Object doObType(Object object, @SuppressWarnings("unused") String key) {
189-
return getToSulongNode().execute(getClass.execute(object));
190+
return getToSulongNode().execute(getClass(object));
190191
}
191192

192193
@Specialization(guards = "eq(OB_SIZE, key)")
@@ -425,6 +426,12 @@ Object doImFunc(PBuiltinMethod object, @SuppressWarnings("unused") String key) {
425426
return getToSulongNode().execute(object.getFunction());
426427
}
427428

429+
// @Specialization(guards = {"isMemoryView(object)", "eq(MEMORYVIEW_FLAGS)" })
430+
// Object doImFunc(PythonObject object, @SuppressWarnings("unused") String key,
431+
// @Cached("create()") ReadAttributeFromObjectNode readAttrNode) {
432+
// return readAttrNode.execute(object, NativeMemberNames.MEMORYVIEW_FLAGS);
433+
// }
434+
428435
@Fallback
429436
Object doGeneric(Object object, String key) {
430437
// This is the preliminary generic case: There are native members we know that they
@@ -443,6 +450,11 @@ protected boolean eq(String expected, String actual) {
443450
return expected.equals(actual);
444451
}
445452

453+
protected boolean isMemoryView(Object obj) {
454+
// TODO
455+
return getClass(obj).getName().equals(BuiltinNames.MEMORYVIEW);
456+
}
457+
446458
public static ReadNativeMemberNode create() {
447459
return ReadNativeMemberNodeGen.create();
448460
}
@@ -470,6 +482,14 @@ private int sizeofWchar() {
470482
}
471483
return (int) sizeofWcharNode.execute();
472484
}
485+
486+
private PythonClass getClass(Object obj) {
487+
if (getClassNode == null) {
488+
CompilerDirectives.transferToInterpreterAndInvalidate();
489+
getClassNode = insert(GetClassNode.create());
490+
}
491+
return getClassNode.execute(obj);
492+
}
473493
}
474494

475495
@Resolve(message = "WRITE")

graalpython/lib-graalpython/memoryview.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,27 @@
3737
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3838
# SOFTWARE.
3939

40-
# memoryview is implemented in C
41-
import sys
40+
# memoryview is mainly implemented in C
4241

43-
class memoryview():
44-
def __new__(cls, *args, **kwargs):
42+
def make_init():
43+
def __memoryview_init(self, *args, **kwargs):
4544
import _memoryview
46-
sys.modules['builtins'].memoryview = _memoryview.nativememoryview
47-
return _memoryview.nativememoryview(*args, **kwargs)
45+
self.__c_memoryview = _memoryview.nativememoryview(*args, **kwargs)
4846

49-
sys.modules['builtins'].memoryview = memoryview
47+
return __memoryview_init
48+
49+
def make_getitem():
50+
def __memoryview_getitem(self, *args, **kwargs):
51+
import _memoryview
52+
res = _memoryview.nativememoryview(*args, **kwargs)
53+
return memoryview(res) if isinstance(res, _memoryview.nativememoryview) else res
54+
return __memoryview_getitem
55+
56+
memoryview.__init__ = make_init()
57+
memoryview.__repr__ = lambda self: self.__c_memoryview.__repr__()
58+
memoryview.__len__ = lambda self: self.__c_memoryview.__len__()
59+
memoryview.__getitem__ = make_getitem()
60+
memoryview.__setitem__ = lambda self, key, value: self.__c_memoryview.__setitem__(key, value)
61+
62+
del make_init
63+
del make_getitem

0 commit comments

Comments
 (0)