Skip to content

Commit 4cac4df

Browse files
committed
added __dict__ builtin for PDecoratedFunction-s
1 parent 5d10e7c commit 4cac4df

File tree

3 files changed

+56
-2
lines changed

3 files changed

+56
-2
lines changed

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

Lines changed: 52 additions & 1 deletion
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
@@ -40,6 +40,7 @@
4040
*/
4141
package com.oracle.graal.python.builtins.objects.method;
4242

43+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DICT__;
4344
import static com.oracle.graal.python.nodes.SpecialMethodNames.__INIT__;
4445
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__FUNC__;
4546

@@ -48,14 +49,25 @@
4849
import com.oracle.graal.python.builtins.Builtin;
4950
import com.oracle.graal.python.builtins.CoreFunctions;
5051
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
52+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
5153
import com.oracle.graal.python.builtins.PythonBuiltins;
5254
import com.oracle.graal.python.builtins.objects.PNone;
55+
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
56+
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
57+
import com.oracle.graal.python.nodes.ErrorMessages;
58+
import com.oracle.graal.python.nodes.PGuards;
5359
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5460
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
5561
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
62+
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
63+
import com.oracle.truffle.api.CompilerDirectives;
64+
import com.oracle.truffle.api.dsl.Cached;
5665
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
66+
import com.oracle.truffle.api.dsl.ImportStatic;
5767
import com.oracle.truffle.api.dsl.NodeFactory;
5868
import com.oracle.truffle.api.dsl.Specialization;
69+
import com.oracle.truffle.api.interop.UnsupportedMessageException;
70+
import com.oracle.truffle.api.library.CachedLibrary;
5971

6072
@CoreFunctions(extendClasses = {PythonBuiltinClassType.PStaticmethod, PythonBuiltinClassType.PClassmethod})
6173
public class DecoratedMethodBuiltins extends PythonBuiltins {
@@ -83,4 +95,43 @@ protected Object func(PDecoratedMethod self) {
8395
return self.getCallable();
8496
}
8597
}
98+
99+
@Builtin(name = __DICT__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, isGetter = true, isSetter = true)
100+
@GenerateNodeFactory
101+
@ImportStatic(PGuards.class)
102+
public abstract static class DictNode extends PythonBinaryBuiltinNode {
103+
@Specialization(limit = "1")
104+
protected Object getDict(PDecoratedMethod self, @SuppressWarnings("unused") PNone mapping,
105+
@CachedLibrary("self") PythonObjectLibrary lib,
106+
@Cached PythonObjectFactory factory) {
107+
PHashingCollection dict = lib.getDict(self);
108+
if (dict == null) {
109+
dict = factory.createDictFixedStorage(self);
110+
try {
111+
lib.setDict(self, dict);
112+
} catch (UnsupportedMessageException e) {
113+
CompilerDirectives.transferToInterpreterAndInvalidate();
114+
throw new IllegalStateException(e);
115+
}
116+
}
117+
return dict;
118+
}
119+
120+
@Specialization(limit = "1")
121+
protected Object setDict(PDecoratedMethod self, PHashingCollection mapping,
122+
@CachedLibrary("self") PythonObjectLibrary lib) {
123+
try {
124+
lib.setDict(self, mapping);
125+
} catch (UnsupportedMessageException ex) {
126+
CompilerDirectives.transferToInterpreterAndInvalidate();
127+
throw new IllegalStateException(ex);
128+
}
129+
return PNone.NONE;
130+
}
131+
132+
@Specialization(guards = "!isDict(value)")
133+
protected Object setDict(@SuppressWarnings("unused") PDecoratedMethod self, Object value) {
134+
throw raise(TypeError, ErrorMessages.MUST_BE_SET_TO_S_NOT_P, __DICT__, "dictionary", value);
135+
}
136+
}
86137
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/ErrorMessages.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ public abstract class ErrorMessages {
150150
public static final String CLASS_ASIGMENT_S_LAYOUT_DIFFERS_FROM_S = "__class__ assignment: '%s' object layout differs from '%s'";
151151
public static final String CLASS_ASSIGMENT_ONLY_SUPPORTED_FOR_HEAP_TYPES_OR_MODTYPE_SUBCLASSES = "__class__ assignment only supported for heap types or ModuleType subclasses, not '%p'";
152152
public static final String CLASS_MUST_BE_SET_TO_CLASS = "__class__ must be set to a class, not '%p' object";
153+
public static final String MUST_BE_SET_TO_S_NOT_P = "%s must be set to a %s, not a '%p'";
153154
public static final String CLASSPATH_ARG_MUST_BE_STRING = "classpath argument %d must be string, not %p";
154155
public static final String CODE_OBJ_NO_FREE_VARIABLES = "code object passed to %s may not contain free variables";
155156
public static final String COMPILE_MUST_BE = "compile() mode must be 'exec', 'eval' or 'single'";

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/WriteAttributeToObjectNode.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
5252
import com.oracle.graal.python.builtins.objects.exception.PBaseException;
5353
import com.oracle.graal.python.builtins.objects.function.PFunction;
54+
import com.oracle.graal.python.builtins.objects.method.PDecoratedMethod;
5455
import com.oracle.graal.python.builtins.objects.method.PMethod;
5556
import com.oracle.graal.python.builtins.objects.module.PythonModule;
5657
import com.oracle.graal.python.builtins.objects.object.PythonObject;
@@ -92,7 +93,8 @@ public static WriteAttributeToObjectNode getUncached() {
9293
}
9394

9495
protected static boolean isAttrWritable(IsBuiltinClassProfile exactBuiltinInstanceProfile, PythonObject self, Object key) {
95-
if (isHiddenKey(key) || self instanceof PythonManagedClass || self instanceof PFunction || self instanceof PMethod || self instanceof PythonModule || self instanceof PBaseException) {
96+
if (isHiddenKey(key) || self instanceof PythonManagedClass || self instanceof PFunction || self instanceof PMethod || self instanceof PDecoratedMethod || self instanceof PythonModule ||
97+
self instanceof PBaseException) {
9698
return true;
9799
}
98100
return !exactBuiltinInstanceProfile.profileIsAnyBuiltinObject(self);

0 commit comments

Comments
 (0)