Skip to content

Commit 9ec3f8b

Browse files
committed
add basic support for Function.__defaults__
- missing initialization
1 parent e18d712 commit 9ec3f8b

File tree

2 files changed

+61
-4
lines changed

2 files changed

+61
-4
lines changed

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

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__ANNOTATIONS__;
3030
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__CLOSURE__;
3131
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__CODE__;
32+
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DEFAULTS__;
3233
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DICT__;
3334
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__GLOBALS__;
3435
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__MODULE__;
@@ -52,12 +53,14 @@
5253
import com.oracle.graal.python.builtins.objects.method.PMethod;
5354
import com.oracle.graal.python.builtins.objects.module.PythonModule;
5455
import com.oracle.graal.python.builtins.objects.object.PythonObject;
56+
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
5557
import com.oracle.graal.python.nodes.argument.CreateArgumentsNode;
5658
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
5759
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
5860
import com.oracle.graal.python.nodes.call.CallDispatchNode;
5961
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
6062
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
63+
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
6164
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
6265
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
6366
import com.oracle.graal.python.nodes.subscript.GetItemNode;
@@ -232,7 +235,7 @@ Object getModule(PBuiltinFunction self, Object value) {
232235

233236
@Builtin(name = __CODE__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, isGetter = true, isSetter = true)
234237
@GenerateNodeFactory
235-
public abstract static class GetCodeNode extends PythonBuiltinNode {
238+
public abstract static class GetCodeNode extends PythonBinaryBuiltinNode {
236239
@Specialization(guards = {"!isBuiltinFunction(self)", "isNoValue(none)"})
237240
Object getCode(PFunction self, @SuppressWarnings("unused") PNone none,
238241
@Cached("createBinaryProfile()") ConditionProfile hasCodeProfile) {
@@ -257,6 +260,51 @@ Object builtinCode(PBuiltinFunction self, Object none) {
257260
}
258261
}
259262

263+
@Builtin(name = __DEFAULTS__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2, isGetter = true, isSetter = true)
264+
@GenerateNodeFactory
265+
public abstract static class GetDefaultsNode extends PythonBinaryBuiltinNode {
266+
private Object[] getDefaultsAndInitIfNotSet(PFunction function) {
267+
// TODO: add support for __DEFAULTS__ (init from actual default values ...)
268+
return function.getDefaults();
269+
}
270+
271+
private Object getDefaults(PFunction function) {
272+
Object[] defaultVals = getDefaultsAndInitIfNotSet(function);
273+
if (defaultVals == null) {
274+
return PNone.NONE;
275+
}
276+
return factory().createTuple(defaultVals);
277+
}
278+
279+
@Specialization
280+
Object defaults(PFunction self, @SuppressWarnings("unused") PNone defaults) {
281+
return getDefaults(self);
282+
}
283+
284+
@Specialization
285+
Object defaults(PFunction self, PTuple defaults) {
286+
self.setDefaults(defaults.getArray());
287+
return PNone.NONE;
288+
}
289+
290+
@Specialization
291+
Object defaults(PMethod self, @SuppressWarnings("unused") PNone defaults) {
292+
return getDefaults(self.getFunction());
293+
}
294+
295+
@Specialization
296+
Object defaults(PMethod self, PTuple defaults) {
297+
self.getFunction().setDefaults(defaults.getArray());
298+
return PNone.NONE;
299+
}
300+
301+
@SuppressWarnings("unused")
302+
@Specialization
303+
Object defaults(PBuiltinFunction self, Object defaults) {
304+
throw raise(AttributeError, "'builtin_function_or_method' object has no attribute '__defaults__'");
305+
}
306+
}
307+
260308
@Builtin(name = __DICT__, fixedNumOfPositionalArgs = 1, isGetter = true)
261309
@GenerateNodeFactory
262310
static abstract class DictNode extends PythonUnaryBuiltinNode {

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public class PFunction extends PythonObject implements PythonCallable {
5151
private final PCell[] closure;
5252
private final boolean isStatic;
5353
private PCode code;
54+
private Object[] defaults;
5455

5556
public PFunction(PythonClass clazz, String name, String enclosingClassName, Arity arity, RootCallTarget callTarget, FrameDescriptor frameDescriptor, PythonObject globals, PCell[] closure) {
5657
super(clazz);
@@ -66,9 +67,9 @@ public PFunction(PythonClass clazz, String name, String enclosingClassName, Arit
6667
}
6768

6869
@TruffleBoundary
69-
private static void addDefaultConstants(DynamicObject storage2, String name, String enclosingClassName) {
70-
storage2.define(__NAME__, name);
71-
storage2.define(__QUALNAME__, enclosingClassName == null ? enclosingClassName + "." + name : name);
70+
private static void addDefaultConstants(DynamicObject storage, String name, String enclosingClassName) {
71+
storage.define(__NAME__, name);
72+
storage.define(__QUALNAME__, enclosingClassName == null ? enclosingClassName + "." + name : name);
7273
}
7374

7475
public boolean isStatic() {
@@ -130,4 +131,12 @@ public void setCode(PCode code) {
130131
public String getEnclosingClassName() {
131132
return enclosingClassName;
132133
}
134+
135+
public Object[] getDefaults() {
136+
return defaults;
137+
}
138+
139+
public void setDefaults(Object[] defaults) {
140+
this.defaults = defaults;
141+
}
133142
}

0 commit comments

Comments
 (0)