1+ from jinja2 .runtime import new_context
2+ from numba .typed .listobject import new_list
3+
14TT_FLOAT = 'FLOAT'
25TT_IDENTIFIER = 'IDENTIFIER'
36TT_KEYWORD = 'KEYWORD'
@@ -1177,7 +1180,7 @@ def dived_by(self, other):
11771180 if isinstance (other , Number ):
11781181 new_list = self .copy ()
11791182 try :
1180- return self .elements [other .value ],None
1183+ return self .elements [other .value ], None
11811184 except :
11821185 return None , RTError (
11831186 other .pos_start , other .pos_end ,
@@ -1361,6 +1364,11 @@ def __repr__(self):
13611364 return str (self .value )
13621365
13631366
1367+ Number .null = Number (0 )
1368+ Number .false = Number (0 )
1369+ Number .true = Number (1 )
1370+
1371+
13641372class Context :
13651373 def __init__ (self , display_name , parent = None , parent_entry_pos = None ):
13661374 self .display_name = display_name
@@ -1369,42 +1377,64 @@ def __init__(self, display_name, parent=None, parent_entry_pos=None):
13691377 self .symbol_table = None
13701378
13711379
1372- class Function (Value ):
1373- def __init__ (self , name , body_node , arg_names ):
1380+ class BaseFunction (Value ):
1381+ def __init__ (self , name ):
13741382 super ().__init__ ()
13751383 self .name = name or "<anonymous>"
1376- self .body_node = body_node
1377- self .arg_names = arg_names
13781384
1379- def execute (self , args ):
1380- res = RTResult ()
1381- interpreter = Interpreter ()
1385+ def generate_new_context (self ):
13821386 new_context = Context (self .name , self .context , self .pos_start )
13831387 new_context .symbol_table = SymbolTable (new_context .parent .symbol_table )
1388+ return new_context
13841389
1385- if len (args ) > len (self .arg_names ):
1390+ def check_args (self , arg_names , args ):
1391+ res = RTResult ()
1392+ if len (args ) > len (arg_names ):
13861393 return res .failure (RTError (
13871394 self .pos_start , self .pos_end ,
1388- f"{ len (args ) - len (self . arg_names )} too many args passed into { self .name } " ,
1395+ f"{ len (args ) - len (arg_names )} too many args passed into { self .name } " ,
13891396 self .context
13901397
13911398 )
13921399 )
1393- elif len (args ) < len (self . arg_names ):
1400+ elif len (args ) < len (arg_names ):
13941401 return res .failure (RTError (
13951402 self .pos_start , self .pos_end ,
1396- f"{ len (self . arg_names ) - len (args )} need more args passed into { self .name } " ,
1403+ f"{ len (arg_names ) - len (args )} need more args passed into { self .name } " ,
13971404 self .context
13981405
13991406 )
14001407 )
1408+ return res .success (None )
14011409
1410+ def populate_args (self ,arg_names ,args ,exec_ctx ):
14021411 for i in range (len (args )):
1403- arg_name = self . arg_names [i ]
1412+ arg_name = arg_names [i ]
14041413 arg_value = args [i ]
1405- arg_value .set_context (new_context )
1406- new_context .symbol_table .set (arg_name , arg_value )
1407- value = res .register (interpreter .visit (self .body_node , new_context ))
1414+ #maybe newcontext?
1415+ arg_value .set_context (exec_ctx )
1416+ exec_ctx .symbol_table .set (arg_name , arg_value )
1417+ def check_and_populate_args (self ,arg_names ,args ,exec_ctx ):
1418+ res = RTResult ()
1419+ res .register (self .check_args (arg_names ,args ))
1420+ if res .error : return res
1421+ self .populate_args (arg_names ,args ,exec_ctx )
1422+ return res .success ((None ))
1423+
1424+
1425+
1426+ class Function (BaseFunction ):
1427+ def __init__ (self , name , body_node , arg_names ):
1428+ super ().__init__ (name )
1429+ self .body_node = body_node
1430+ self .arg_names = arg_names
1431+
1432+ def execute (self , args ):
1433+ res = RTResult ()
1434+ interpreter = Interpreter ()
1435+ exec_ctx = self .generate_new_context ()
1436+ res .register (self .check_and_populate_args (self .arg_names ,args ,exec_ctx = exec_ctx ))
1437+ value = res .register (interpreter .visit (self .body_node , exec_ctx ))
14081438 if res .error : return res
14091439 return res .success (value )
14101440
@@ -1418,6 +1448,12 @@ def __repr__(self):
14181448 return f"<function { self .name } >"
14191449
14201450
1451+ class BuiltInFunction (BaseFunction ):
1452+ pass
1453+
1454+
1455+
1456+
14211457class SymbolTable :
14221458 def __init__ (self , parent = None ):
14231459 self .symbols = {}
@@ -1458,7 +1494,7 @@ def visit_ListNode(self, node, context):
14581494
14591495 def visit_ForNode (self , node , context ):
14601496 res = RTResult ()
1461- elements = []
1497+ elements = []
14621498
14631499 start_value = res .register (self .visit (node .start_value_node , context ))
14641500 if res .error : return res
@@ -1486,23 +1522,21 @@ def visit_ForNode(self, node, context):
14861522 elements .append (res .register (self .visit (node .body_node , context )))
14871523 if res .error : return res
14881524
1489- return res .success (List (elements ).set_context (context ).set_pos (node .pos_start ,node .pos_end ))
1525+ return res .success (List (elements ).set_context (context ).set_pos (node .pos_start , node .pos_end ))
14901526
14911527 def visit_WhileNode (self , node , context ):
14921528 res = RTResult ()
1493- elements = []
1529+ elements = []
14941530 while True :
14951531 condition = res .register (self .visit (node .condition_node , context ))
14961532 if res .error : return res
14971533
14981534 if not condition .is_true (): break
14991535
1500-
1501-
15021536 elements .append (res .register (self .visit (node .body_node , context )))
15031537 if res .error : return res
15041538
1505- return res .success (List (elements ).set_context (context ).set_pos (node .pos_start ,node .pos_end ))
1539+ return res .success (List (elements ).set_context (context ).set_pos (node .pos_start , node .pos_end ))
15061540
15071541 def visit_NumberNode (self , node , context ):
15081542 return RTResult ().success (
@@ -1646,9 +1680,9 @@ def visit_CallNode(self, node, context):
16461680
16471681
16481682global_symbol_table = SymbolTable ()
1649- global_symbol_table .set ("NULL" , Number ( 0 ) )
1650- global_symbol_table .set ("False" , Number ( 0 ) )
1651- global_symbol_table .set ("True" , Number ( 1 ) )
1683+ global_symbol_table .set ("NULL" , Number . null )
1684+ global_symbol_table .set ("False" , Number . false )
1685+ global_symbol_table .set ("True" , Number . true )
16521686
16531687
16541688def run (fn , text ):
0 commit comments