2929import static com .oracle .graal .python .nodes .SpecialAttributeNames .__ANNOTATIONS__ ;
3030import static com .oracle .graal .python .nodes .SpecialAttributeNames .__CLOSURE__ ;
3131import static com .oracle .graal .python .nodes .SpecialAttributeNames .__CODE__ ;
32+ import static com .oracle .graal .python .nodes .SpecialAttributeNames .__DEFAULTS__ ;
3233import static com .oracle .graal .python .nodes .SpecialAttributeNames .__DICT__ ;
3334import static com .oracle .graal .python .nodes .SpecialAttributeNames .__GLOBALS__ ;
3435import static com .oracle .graal .python .nodes .SpecialAttributeNames .__MODULE__ ;
5253import com .oracle .graal .python .builtins .objects .method .PMethod ;
5354import com .oracle .graal .python .builtins .objects .module .PythonModule ;
5455import com .oracle .graal .python .builtins .objects .object .PythonObject ;
56+ import com .oracle .graal .python .builtins .objects .tuple .PTuple ;
5557import com .oracle .graal .python .nodes .argument .CreateArgumentsNode ;
5658import com .oracle .graal .python .nodes .attributes .ReadAttributeFromObjectNode ;
5759import com .oracle .graal .python .nodes .attributes .WriteAttributeToObjectNode ;
5860import com .oracle .graal .python .nodes .call .CallDispatchNode ;
5961import com .oracle .graal .python .nodes .function .PythonBuiltinBaseNode ;
6062import com .oracle .graal .python .nodes .function .PythonBuiltinNode ;
63+ import com .oracle .graal .python .nodes .function .builtins .PythonBinaryBuiltinNode ;
6164import com .oracle .graal .python .nodes .function .builtins .PythonTernaryBuiltinNode ;
6265import com .oracle .graal .python .nodes .function .builtins .PythonUnaryBuiltinNode ;
6366import 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 {
0 commit comments