@@ -49,13 +49,25 @@ pub fn register_function_str(
4949 }
5050 rustpython_vm:: Interpreter :: without_stdlib ( Default :: default ( ) ) . enter ( |vm| {
5151 let var_dot_split: Vec < & str > = function_name. split ( "." ) . collect ( ) ;
52- let func = GLOBALS . globals . get_item ( var_dot_split[ 0 ] , vm) . unwrap_or_else ( |_| {
52+ let func = GLOBALS
53+ . globals
54+ . get_item ( var_dot_split[ 0 ] , vm)
55+ . unwrap_or_else ( |_| {
5356 panic ! ( "Cannot find '{}' in globals" , var_dot_split[ 0 ] ) ;
5457 } ) ;
55- if var_dot_split. len ( ) > 1 {
56- func. get_attr ( & vm. ctx . new_str ( var_dot_split[ 1 ] ) , vm) . unwrap_or_else ( |_| {
57- panic ! ( "Cannot find sub function '{}' in '{}'" , var_dot_split[ 1 ] , var_dot_split[ 0 ] ) ;
58- } ) ;
58+ if var_dot_split. len ( ) > 2 {
59+ func. get_attr ( & vm. ctx . new_str ( var_dot_split[ 1 ] ) , vm)
60+ . unwrap ( )
61+ . get_attr ( & vm. ctx . new_str ( var_dot_split[ 2 ] ) , vm)
62+ . unwrap ( ) ;
63+ } else if var_dot_split. len ( ) > 1 {
64+ func. get_attr ( & vm. ctx . new_str ( var_dot_split[ 1 ] ) , vm)
65+ . unwrap_or_else ( |_| {
66+ panic ! (
67+ "Cannot find sub function '{}' in '{}'" ,
68+ var_dot_split[ 1 ] , var_dot_split[ 0 ]
69+ ) ;
70+ } ) ;
5971 }
6072
6173 if let Some ( num_args) = number_of_args {
@@ -101,7 +113,10 @@ pub fn call_function(payload: RunRequest) -> crate::Result<String> {
101113 . collect ( ) ;
102114 let var_dot_split: Vec < & str > = function_name. split ( "." ) . collect ( ) ;
103115 let func = GLOBALS . globals . get_item ( var_dot_split[ 0 ] , vm) ?;
104- Ok ( if var_dot_split. len ( ) > 1 {
116+ Ok ( if var_dot_split. len ( ) > 2 {
117+ func. get_attr ( & vm. ctx . new_str ( var_dot_split[ 1 ] ) , vm) ?
118+ . get_attr ( & vm. ctx . new_str ( var_dot_split[ 2 ] ) , vm) ?
119+ } else if var_dot_split. len ( ) > 1 {
105120 func. get_attr ( & vm. ctx . new_str ( var_dot_split[ 1 ] ) , vm) ?
106121 } else {
107122 func
@@ -116,7 +131,10 @@ pub fn read_variable(payload: StringRequest) -> crate::Result<String> {
116131 rustpython_vm:: Interpreter :: without_stdlib ( Default :: default ( ) ) . enter ( |vm| {
117132 let var_dot_split: Vec < & str > = payload. value . split ( "." ) . collect ( ) ;
118133 let var = GLOBALS . globals . get_item ( var_dot_split[ 0 ] , vm) ?;
119- Ok ( if var_dot_split. len ( ) > 1 {
134+ Ok ( if var_dot_split. len ( ) > 2 {
135+ var. get_attr ( & vm. ctx . new_str ( var_dot_split[ 1 ] ) , vm) ?
136+ . get_attr ( & vm. ctx . new_str ( var_dot_split[ 2 ] ) , vm) ?
137+ } else if var_dot_split. len ( ) > 1 {
120138 var. get_attr ( & vm. ctx . new_str ( var_dot_split[ 1 ] ) , vm) ?
121139 } else {
122140 var
0 commit comments