29
29
import static com .oracle .graal .python .nodes .SpecialAttributeNames .__ANNOTATIONS__ ;
30
30
import static com .oracle .graal .python .nodes .SpecialAttributeNames .__CLOSURE__ ;
31
31
import static com .oracle .graal .python .nodes .SpecialAttributeNames .__CODE__ ;
32
+ import static com .oracle .graal .python .nodes .SpecialAttributeNames .__DEFAULTS__ ;
32
33
import static com .oracle .graal .python .nodes .SpecialAttributeNames .__DICT__ ;
33
34
import static com .oracle .graal .python .nodes .SpecialAttributeNames .__GLOBALS__ ;
34
35
import static com .oracle .graal .python .nodes .SpecialAttributeNames .__MODULE__ ;
52
53
import com .oracle .graal .python .builtins .objects .method .PMethod ;
53
54
import com .oracle .graal .python .builtins .objects .module .PythonModule ;
54
55
import com .oracle .graal .python .builtins .objects .object .PythonObject ;
56
+ import com .oracle .graal .python .builtins .objects .tuple .PTuple ;
55
57
import com .oracle .graal .python .nodes .argument .CreateArgumentsNode ;
56
58
import com .oracle .graal .python .nodes .attributes .ReadAttributeFromObjectNode ;
57
59
import com .oracle .graal .python .nodes .attributes .WriteAttributeToObjectNode ;
58
60
import com .oracle .graal .python .nodes .call .CallDispatchNode ;
59
61
import com .oracle .graal .python .nodes .function .PythonBuiltinBaseNode ;
60
62
import com .oracle .graal .python .nodes .function .PythonBuiltinNode ;
63
+ import com .oracle .graal .python .nodes .function .builtins .PythonBinaryBuiltinNode ;
61
64
import com .oracle .graal .python .nodes .function .builtins .PythonTernaryBuiltinNode ;
62
65
import com .oracle .graal .python .nodes .function .builtins .PythonUnaryBuiltinNode ;
63
66
import com .oracle .graal .python .nodes .subscript .GetItemNode ;
@@ -232,7 +235,7 @@ Object getModule(PBuiltinFunction self, Object value) {
232
235
233
236
@ Builtin (name = __CODE__ , minNumOfPositionalArgs = 1 , maxNumOfPositionalArgs = 2 , isGetter = true , isSetter = true )
234
237
@ GenerateNodeFactory
235
- public abstract static class GetCodeNode extends PythonBuiltinNode {
238
+ public abstract static class GetCodeNode extends PythonBinaryBuiltinNode {
236
239
@ Specialization (guards = {"!isBuiltinFunction(self)" , "isNoValue(none)" })
237
240
Object getCode (PFunction self , @ SuppressWarnings ("unused" ) PNone none ,
238
241
@ Cached ("createBinaryProfile()" ) ConditionProfile hasCodeProfile ) {
@@ -257,6 +260,51 @@ Object builtinCode(PBuiltinFunction self, Object none) {
257
260
}
258
261
}
259
262
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
+
260
308
@ Builtin (name = __DICT__ , fixedNumOfPositionalArgs = 1 , isGetter = true )
261
309
@ GenerateNodeFactory
262
310
static abstract class DictNode extends PythonUnaryBuiltinNode {
0 commit comments