Skip to content

Commit dd5a8d6

Browse files
committed
[GR-26989] Separate classmethod_descriptor
PullRequest: graalpython/1352
2 parents 3b2c287 + bd1a209 commit dd5a8d6

File tree

11 files changed

+181
-15
lines changed

11 files changed

+181
-15
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_locale.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
1+
# Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved.
22
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
33
#
44
# The Universal Permissive License (UPL), Version 1.0
@@ -59,9 +59,13 @@ def test_import():
5959
def test_get_setlocale():
6060
import locale
6161
current_locale = locale.getlocale(0)
62+
new_locale = ('en_GB', 'UTF-8')
6263
try:
63-
new_locale = ('en_GB', 'UTF-8')
64-
assert str(locale.setlocale(0, new_locale)) == '.'.join(new_locale)
64+
try:
65+
assert str(locale.setlocale(0, new_locale)) == '.'.join(new_locale)
66+
except locale.Error:
67+
# Skip when unavailable in the CI
68+
return
6569
assert locale.getlocale(0) == new_locale
6670
finally:
67-
assert str(locale.setlocale(0, current_locale)) == '.'.join(current_locale)
71+
locale.setlocale(0, current_locale)

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,149 @@
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.builtins.Builtin;
55+
import com.oracle.graal.python.builtins.CoreFunctions;
56+
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
57+
import com.oracle.graal.python.builtins.PythonBuiltins;
58+
import com.oracle.graal.python.builtins.objects.module.PythonModule;
59+
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
60+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
61+
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
62+
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
63+
import com.oracle.truffle.api.dsl.NodeFactory;
64+
import com.oracle.truffle.api.dsl.Specialization;
65+
import com.oracle.truffle.api.frame.VirtualFrame;
66+
import com.oracle.truffle.api.library.CachedLibrary;
67+
68+
@CoreFunctions(extendClasses = PythonBuiltinClassType.PBuiltinClassMethod)
69+
public class BuiltinClassmethodBuiltins extends PythonBuiltins {
70+
71+
@Override
72+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
73+
return BuiltinClassmethodBuiltinsFactory.getFactories();
74+
}
75+
76+
@Builtin(name = __NAME__, maxNumOfPositionalArgs = 1, isGetter = true)
77+
@GenerateNodeFactory
78+
abstract static class NameNode extends PythonUnaryBuiltinNode {
79+
@Specialization(limit = "3")
80+
static Object name(VirtualFrame frame, PDecoratedMethod self,
81+
@CachedLibrary("self.getCallable()") PythonObjectLibrary lib) {
82+
return lib.lookupAttributeStrict(self.getCallable(), frame, __NAME__);
83+
}
84+
}
85+
86+
@Builtin(name = __QUALNAME__, maxNumOfPositionalArgs = 1, isGetter = true)
87+
@GenerateNodeFactory
88+
abstract static class QualnameNode extends PythonUnaryBuiltinNode {
89+
@Specialization(limit = "3")
90+
static Object name(VirtualFrame frame, PDecoratedMethod self,
91+
@CachedLibrary("self.getCallable()") PythonObjectLibrary lib) {
92+
return lib.lookupAttributeStrict(self.getCallable(), frame, __QUALNAME__);
93+
}
94+
}
95+
96+
@Builtin(name = __OBJCLASS__, maxNumOfPositionalArgs = 1, isGetter = true)
97+
@GenerateNodeFactory
98+
abstract static class ObjclassNode extends PythonUnaryBuiltinNode {
99+
@Specialization(limit = "3")
100+
static Object name(VirtualFrame frame, PDecoratedMethod self,
101+
@CachedLibrary("self.getCallable()") PythonObjectLibrary lib) {
102+
return lib.lookupAttributeStrict(self.getCallable(), frame, __OBJCLASS__);
103+
}
104+
}
105+
106+
@Builtin(name = __DOC__, maxNumOfPositionalArgs = 1, isGetter = true)
107+
@GenerateNodeFactory
108+
abstract static class DocNode extends PythonUnaryBuiltinNode {
109+
@Specialization(limit = "3")
110+
static Object name(VirtualFrame frame, PDecoratedMethod self,
111+
@CachedLibrary("self.getCallable()") PythonObjectLibrary lib) {
112+
return lib.lookupAttributeStrict(self.getCallable(), frame, __DOC__);
113+
}
114+
}
115+
116+
@Builtin(name = __TEXT_SIGNATURE__, maxNumOfPositionalArgs = 1, isGetter = true)
117+
@GenerateNodeFactory
118+
abstract static class TextSignatureNode extends PythonUnaryBuiltinNode {
119+
@Specialization(limit = "3")
120+
static Object name(VirtualFrame frame, PDecoratedMethod self,
121+
@CachedLibrary("self.getCallable()") PythonObjectLibrary lib) {
122+
return lib.lookupAttributeStrict(self.getCallable(), frame, __TEXT_SIGNATURE__);
123+
}
124+
}
125+
126+
@Builtin(name = __REPR__, maxNumOfPositionalArgs = 1, isGetter = true)
127+
@GenerateNodeFactory
128+
abstract static class ReprNode extends PythonUnaryBuiltinNode {
129+
@Specialization(limit = "3")
130+
static Object name(VirtualFrame frame, PDecoratedMethod self,
131+
@CachedLibrary("self.getCallable()") PythonObjectLibrary lib) {
132+
return lib.lookupAttributeStrict(self.getCallable(), frame, __REPR__);
133+
}
134+
}
135+
136+
@Builtin(name = __REDUCE__, maxNumOfPositionalArgs = 1)
137+
@GenerateNodeFactory
138+
abstract static class ReduceNode extends PythonUnaryBuiltinNode {
139+
@Specialization
140+
Object name(VirtualFrame frame, PDecoratedMethod self,
141+
@CachedLibrary(limit = "3") PythonObjectLibrary lib) {
142+
PythonModule builtins = getContext().getCore().getBuiltins();
143+
Object gettattr = lib.lookupAttributeStrict(builtins, frame, GETATTR);
144+
Object type = lib.lookupAttributeStrict(self, frame, __OBJCLASS__);
145+
Object name = lib.lookupAttributeStrict(self, frame, __NAME__);
146+
return factory().createTuple(new Object[]{gettattr, factory().createTuple(new Object[]{type, name})});
147+
}
148+
}
149+
}

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/nodes/classes/ClassDefinitionPrologueNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -74,7 +74,7 @@ public void executeVoid(VirtualFrame frame) {
7474
Object moduleName = readGlobalNameNode.execute(frame);
7575
Object primary = readPrimaryArgNode.execute(frame);
7676

77-
setItemIfNotPresentNode.execute(frame, primary, __QUALNAME__, qualName);
7877
setItemIfNotPresentNode.execute(frame, primary, __MODULE__, moduleName);
78+
setItemIfNotPresentNode.execute(frame, primary, __QUALNAME__, qualName);
7979
}
8080
}

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)