Skip to content

Commit dea38d6

Browse files
committed
Separate classmethod_descriptor from classmethod
Fixes #166
1 parent ae4736f commit dea38d6

File tree

8 files changed

+171
-5
lines changed

8 files changed

+171
-5
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@
142142
import com.oracle.graal.python.builtins.objects.memoryview.BufferBuiltins;
143143
import com.oracle.graal.python.builtins.objects.memoryview.MemoryviewBuiltins;
144144
import com.oracle.graal.python.builtins.objects.method.AbstractMethodBuiltins;
145+
import com.oracle.graal.python.builtins.objects.method.BuiltinClassmethodBuiltins;
145146
import com.oracle.graal.python.builtins.objects.method.BuiltinMethodBuiltins;
146147
import com.oracle.graal.python.builtins.objects.method.ClassmethodBuiltins;
147148
import com.oracle.graal.python.builtins.objects.method.DecoratedMethodBuiltins;
@@ -349,6 +350,7 @@ private static PythonBuiltins[] initializeBuiltins() {
349350
new AbstractMethodBuiltins(),
350351
new MethodBuiltins(),
351352
new BuiltinMethodBuiltins(),
353+
new BuiltinClassmethodBuiltins(),
352354
new CodeBuiltins(),
353355
new FrameBuiltins(),
354356
new MappingproxyBuiltins(),

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltinClassType.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public enum PythonBuiltinClassType implements TruffleObject {
6969
PIterator("iterator", false),
7070
PBuiltinFunction("method_descriptor", false),
7171
PBuiltinMethod("builtin_function_or_method", false),
72+
PBuiltinClassMethod("classmethod_descriptor", false),
7273
PByteArray("bytearray", BuiltinNames.BUILTINS),
7374
PBytes("bytes", BuiltinNames.BUILTINS),
7475
PCell("cell", false),

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public void initialize(PythonCore core) {
9797
callable = core.factory().createGetSetDescriptor(get, set, builtin.name(), null, builtin.allowsDelete());
9898
} else if (builtin.isClassmethod()) {
9999
assert !builtin.isStaticmethod();
100-
callable = core.factory().createClassmethodFromCallableObj(function);
100+
callable = core.factory().createBuiltinClassmethodFromCallableObj(function);
101101
} else if (builtin.isStaticmethod()) {
102102
callable = core.factory().createStaticmethodFromCallableObj(function);
103103
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
/*
2+
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* The Universal Permissive License (UPL), Version 1.0
6+
*
7+
* Subject to the condition set forth below, permission is hereby granted to any
8+
* person obtaining a copy of this software, associated documentation and/or
9+
* data (collectively the "Software"), free of charge and under any and all
10+
* copyright rights in the Software, and any and all patent rights owned or
11+
* freely licensable by each licensor hereunder covering either (i) the
12+
* unmodified Software as contributed to or provided by such licensor, or (ii)
13+
* the Larger Works (as defined below), to deal in both
14+
*
15+
* (a) the Software, and
16+
*
17+
* (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
18+
* one is included with the Software each a "Larger Work" to which the Software
19+
* is contributed by such licensors),
20+
*
21+
* without restriction, including without limitation the rights to copy, create
22+
* derivative works of, display, perform, and distribute the Software and make,
23+
* use, sell, offer for sale, import, export, have made, and have sold the
24+
* Software and the Larger Work(s), and to sublicense the foregoing rights on
25+
* either these or other terms.
26+
*
27+
* This license is subject to the following condition:
28+
*
29+
* The above copyright notice and either this complete permission notice or at a
30+
* minimum a reference to the UPL must be included in all copies or substantial
31+
* portions of the Software.
32+
*
33+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
39+
* SOFTWARE.
40+
*/
41+
package com.oracle.graal.python.builtins.objects.method;
42+
43+
import static com.oracle.graal.python.nodes.BuiltinNames.GETATTR;
44+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DOC__;
45+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__NAME__;
46+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__QUALNAME__;
47+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__TEXT_SIGNATURE__;
48+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__OBJCLASS__;
49+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REDUCE__;
50+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
51+
52+
import java.util.List;
53+
54+
import com.oracle.graal.python.PythonLanguage;
55+
import com.oracle.graal.python.builtins.Builtin;
56+
import com.oracle.graal.python.builtins.CoreFunctions;
57+
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
58+
import com.oracle.graal.python.builtins.PythonBuiltins;
59+
import com.oracle.graal.python.builtins.objects.module.PythonModule;
60+
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
61+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
62+
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
63+
import com.oracle.graal.python.runtime.PythonContext;
64+
import com.oracle.truffle.api.dsl.CachedContext;
65+
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
66+
import com.oracle.truffle.api.dsl.NodeFactory;
67+
import com.oracle.truffle.api.dsl.Specialization;
68+
import com.oracle.truffle.api.frame.VirtualFrame;
69+
import com.oracle.truffle.api.library.CachedLibrary;
70+
71+
@CoreFunctions(extendClasses = PythonBuiltinClassType.PBuiltinClassMethod)
72+
public class BuiltinClassmethodBuiltins extends PythonBuiltins {
73+
74+
@Override
75+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
76+
return BuiltinClassmethodBuiltinsFactory.getFactories();
77+
}
78+
79+
@Builtin(name = __NAME__, maxNumOfPositionalArgs = 1, isGetter = true)
80+
@GenerateNodeFactory
81+
abstract static class NameNode extends PythonUnaryBuiltinNode {
82+
@Specialization(limit = "3")
83+
static Object name(VirtualFrame frame, PDecoratedMethod self,
84+
@CachedLibrary("self.getCallable()") PythonObjectLibrary lib) {
85+
return lib.lookupAttributeStrict(self.getCallable(), frame, __NAME__);
86+
}
87+
}
88+
89+
@Builtin(name = __QUALNAME__, maxNumOfPositionalArgs = 1, isGetter = true)
90+
@GenerateNodeFactory
91+
abstract static class QualnameNode extends PythonUnaryBuiltinNode {
92+
@Specialization(limit = "3")
93+
static Object name(VirtualFrame frame, PDecoratedMethod self,
94+
@CachedLibrary("self.getCallable()") PythonObjectLibrary lib) {
95+
return lib.lookupAttributeStrict(self.getCallable(), frame, __QUALNAME__);
96+
}
97+
}
98+
99+
@Builtin(name = __OBJCLASS__, maxNumOfPositionalArgs = 1, isGetter = true)
100+
@GenerateNodeFactory
101+
abstract static class ObjclassNode extends PythonUnaryBuiltinNode {
102+
@Specialization(limit = "3")
103+
static Object name(VirtualFrame frame, PDecoratedMethod self,
104+
@CachedLibrary("self.getCallable()") PythonObjectLibrary lib) {
105+
return lib.lookupAttributeStrict(self.getCallable(), frame, __OBJCLASS__);
106+
}
107+
}
108+
109+
@Builtin(name = __DOC__, maxNumOfPositionalArgs = 1, isGetter = true)
110+
@GenerateNodeFactory
111+
abstract static class DocNode extends PythonUnaryBuiltinNode {
112+
@Specialization(limit = "3")
113+
static Object name(VirtualFrame frame, PDecoratedMethod self,
114+
@CachedLibrary("self.getCallable()") PythonObjectLibrary lib) {
115+
return lib.lookupAttributeStrict(self.getCallable(), frame, __DOC__);
116+
}
117+
}
118+
119+
@Builtin(name = __TEXT_SIGNATURE__, maxNumOfPositionalArgs = 1, isGetter = true)
120+
@GenerateNodeFactory
121+
abstract static class TextSignatureNode extends PythonUnaryBuiltinNode {
122+
@Specialization(limit = "3")
123+
static Object name(VirtualFrame frame, PDecoratedMethod self,
124+
@CachedLibrary("self.getCallable()") PythonObjectLibrary lib) {
125+
return lib.lookupAttributeStrict(self.getCallable(), frame, __TEXT_SIGNATURE__);
126+
}
127+
}
128+
129+
@Builtin(name = __REPR__, maxNumOfPositionalArgs = 1, isGetter = true)
130+
@GenerateNodeFactory
131+
abstract static class ReprNode extends PythonUnaryBuiltinNode {
132+
@Specialization(limit = "3")
133+
static Object name(VirtualFrame frame, PDecoratedMethod self,
134+
@CachedLibrary("self.getCallable()") PythonObjectLibrary lib) {
135+
return lib.lookupAttributeStrict(self.getCallable(), frame, __REPR__);
136+
}
137+
}
138+
139+
@Builtin(name = __REDUCE__, maxNumOfPositionalArgs = 1)
140+
@GenerateNodeFactory
141+
abstract static class ReduceNode extends PythonUnaryBuiltinNode {
142+
@Specialization
143+
Object name(VirtualFrame frame, PDecoratedMethod self,
144+
@CachedContext(PythonLanguage.class) PythonContext context,
145+
@CachedLibrary(limit = "3") PythonObjectLibrary lib) {
146+
PythonModule builtins = context.getCore().getBuiltins();
147+
Object gettattr = lib.lookupAttributeStrict(builtins, frame, GETATTR);
148+
Object type = lib.lookupAttributeStrict(self, frame, __OBJCLASS__);
149+
Object name = lib.lookupAttributeStrict(self, frame, __NAME__);
150+
return factory().createTuple(new Object[]{gettattr, factory().createTuple(new Object[]{type, name})});
151+
}
152+
}
153+
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/ClassmethodBuiltins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
import com.oracle.truffle.api.frame.VirtualFrame;
7373
import com.oracle.truffle.api.profiles.BranchProfile;
7474

75-
@CoreFunctions(extendClasses = {PythonBuiltinClassType.PClassmethod})
75+
@CoreFunctions(extendClasses = {PythonBuiltinClassType.PClassmethod, PythonBuiltinClassType.PBuiltinClassMethod})
7676
public class ClassmethodBuiltins extends PythonBuiltins {
7777

7878
@Override

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/method/PDecoratedMethod.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4545
import com.oracle.graal.python.builtins.objects.function.Signature;
4646
import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
47+
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
4748
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
4849
import com.oracle.truffle.api.CompilerDirectives;
4950
import com.oracle.truffle.api.object.Shape;
@@ -72,7 +73,11 @@ public void setCallable(Object callable) {
7273
this.callable = callable;
7374
}
7475

76+
@SuppressWarnings("unchecked")
7577
public Object boundToObject(PythonBuiltinClassType binding, PythonObjectFactory factory) {
78+
if (PythonObjectLibrary.getUncached().getLazyPythonClass(this) != PythonBuiltinClassType.PStaticmethod && callable instanceof BoundBuiltinCallable) {
79+
return factory.createBuiltinClassmethodFromCallableObj(((BoundBuiltinCallable<Object>) callable).boundToObject(binding, factory));
80+
}
7681
return this;
7782
}
7883

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeNodes.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,16 @@
7676
import com.oracle.graal.python.PythonLanguage;
7777
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
7878
import com.oracle.graal.python.builtins.objects.PNone;
79+
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
80+
import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass;
81+
import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr;
7982
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
8083
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.GetTypeMemberNode;
8184
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PCallCapiFunction;
8285
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToSulongNode;
8386
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.GetTypeMemberNodeGen;
8487
import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbols;
8588
import com.oracle.graal.python.builtins.objects.cext.capi.NativeMember;
86-
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
87-
import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass;
88-
import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr;
8989
import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyDef;
9090
import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes.GetDictStorageNode;
9191
import com.oracle.graal.python.builtins.objects.common.HashingStorage;
@@ -1609,6 +1609,7 @@ private static long getBuiltinTypeItemsize(PythonBuiltinClassType cls) {
16091609
case PSocket:
16101610
case PStaticmethod:
16111611
case PClassmethod:
1612+
case PBuiltinClassMethod:
16121613
case PScandirIterator:
16131614
case PDirEntry:
16141615
case PLZMACompressor:

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,10 @@ public PDecoratedMethod createClassmethodFromCallableObj(Object callable) {
468468
return trace(new PDecoratedMethod(PythonBuiltinClassType.PClassmethod, PythonBuiltinClassType.PClassmethod.getInstanceShape(getLanguage()), callable));
469469
}
470470

471+
public PDecoratedMethod createBuiltinClassmethodFromCallableObj(Object callable) {
472+
return trace(new PDecoratedMethod(PythonBuiltinClassType.PBuiltinClassMethod, PythonBuiltinClassType.PBuiltinClassMethod.getInstanceShape(getLanguage()), callable));
473+
}
474+
471475
public PDecoratedMethod createStaticmethod(Object cls) {
472476
return trace(new PDecoratedMethod(cls, getShape(cls)));
473477
}

0 commit comments

Comments
 (0)