| 2785 | } |
| 2786 | |
| 2787 | fn enter_function(&mut self, name: &str, parameters: &ast::Parameters) -> CompileResult<()> { |
| 2788 | // TODO: partition_in_place |
| 2789 | let mut kw_without_defaults = vec![]; |
| 2790 | let mut kw_with_defaults = vec![]; |
| 2791 | for kwonlyarg in ¶meters.kwonlyargs { |
| 2792 | if let Some(default) = &kwonlyarg.default { |
| 2793 | kw_with_defaults.push((&kwonlyarg.parameter, default)); |
| 2794 | } else { |
| 2795 | kw_without_defaults.push(&kwonlyarg.parameter); |
| 2796 | } |
| 2797 | } |
| 2798 | |
| 2799 | self.push_output( |
| 2800 | bytecode::CodeFlags::NEWLOCALS | bytecode::CodeFlags::OPTIMIZED, |
| 2801 | parameters.posonlyargs.len().to_u32(), |
| 2802 | (parameters.posonlyargs.len() + parameters.args.len()).to_u32(), |
| 2803 | parameters.kwonlyargs.len().to_u32(), |
| 2804 | name.to_owned(), |
| 2805 | )?; |
| 2806 | |
| 2807 | let args_iter = core::iter::empty() |
| 2808 | .chain(¶meters.posonlyargs) |
| 2809 | .chain(¶meters.args) |
| 2810 | .map(|arg| &arg.parameter) |
| 2811 | .chain(kw_without_defaults) |
| 2812 | .chain(kw_with_defaults.into_iter().map(|(arg, _)| arg)); |
| 2813 | for name in args_iter { |
| 2814 | self.varname(name.name.as_str())?; |
| 2815 | } |
| 2816 | |
| 2817 | if let Some(name) = parameters.vararg.as_deref() { |
| 2818 | self.current_code_info().flags |= bytecode::CodeFlags::VARARGS; |
| 2819 | self.varname(name.name.as_str())?; |
| 2820 | } |
| 2821 | if let Some(name) = parameters.kwarg.as_deref() { |
| 2822 | self.current_code_info().flags |= bytecode::CodeFlags::VARKEYWORDS; |
| 2823 | self.varname(name.name.as_str())?; |
| 2824 | } |
| 2825 | |
| 2826 | Ok(()) |
| 2827 | } |
| 2828 | |
| 2829 | /// Push decorators onto the stack in source order. |
| 2830 | /// For @dec1 @dec2 def foo(): stack becomes [dec1, dec2] |