Skip to content

Commit e129177

Browse files
committed
[GR-16719] [GH-74] Make function.__dict__ writeable.
PullRequest: graalpython/565
2 parents bd8cde7 + 64e979f commit e129177

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,3 +236,10 @@ def assign_code(x, y):
236236
assert_raises(ValueError, assign_code, foo, foobar_code)
237237
bazbar.__code__ = foobar_code
238238
assert bazbar() == (2,3)
239+
240+
241+
def test_function_dict_writeable():
242+
def foo(): pass
243+
new_dict = { "customProp": "hello, world"}
244+
foo.__dict__ = new_dict
245+
assert foo.customProp == "hello, world"

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/AbstractFunctionBuiltins.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import com.oracle.graal.python.nodes.call.CallDispatchNode;
5656
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5757
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
58+
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
5859
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
5960
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
6061
import com.oracle.graal.python.nodes.subscript.GetItemNode;
@@ -227,11 +228,17 @@ Object getModule(PBuiltinFunction self, Object value) {
227228
}
228229
}
229230

230-
@Builtin(name = __DICT__, minNumOfPositionalArgs = 1, isGetter = true)
231+
@Builtin(name = __DICT__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, isGetter = true, isSetter = true)
231232
@GenerateNodeFactory
232-
abstract static class DictNode extends PythonUnaryBuiltinNode {
233+
abstract static class DictNode extends PythonBinaryBuiltinNode {
233234
@Specialization
234-
Object dict(PFunction self) {
235+
PNone dict(PFunction self, PHashingCollection mapping) {
236+
self.setDict(mapping);
237+
return PNone.NONE;
238+
}
239+
240+
@Specialization(guards = "isNoValue(mapping)")
241+
Object dict(PFunction self, @SuppressWarnings("unused") PNone mapping) {
235242
PHashingCollection dict = self.getDict();
236243
if (dict == null) {
237244
dict = factory().createDictFixedStorage(self);
@@ -240,9 +247,9 @@ Object dict(PFunction self) {
240247
return dict;
241248
}
242249

243-
@SuppressWarnings("unused")
244250
@Specialization
245-
Object builtinCode(PBuiltinFunction self) {
251+
@SuppressWarnings("unused")
252+
Object builtinCode(PBuiltinFunction self, Object mapping) {
246253
throw raise(AttributeError, "'builtin_function_or_method' object has no attribute '__dict__'");
247254
}
248255
}

0 commit comments

Comments
 (0)