29
29
context_manager : Optional [ContextManager ] = None
30
30
write_line : Optional [Callable [[dict ], None ]] = None
31
31
32
+ FUNCTION_CALL_OP_NAMES = {
33
+ "CALL_METHOD" ,
34
+ "CALL_FUNCTION" ,
35
+ "CALL_FUNCTION_KW" ,
36
+ "CALL_FUNCTION_EX" ,
37
+ }
38
+
32
39
33
40
def get_tracer () -> Tracer :
34
41
global TRACER
@@ -400,7 +407,8 @@ def __call__(self) -> None:
400
407
return self .process (
401
408
(self .TOS , self .TOS1 ), BINARY_OPS [opname ], (self .TOS1 , self .TOS )
402
409
)
403
- if self .previous_stack and self .previous_stack .opname == "CALL_METHOD" :
410
+
411
+ if self .previous_stack and self .previous_stack .opname in FUNCTION_CALL_OP_NAMES :
404
412
self .log_called_method ()
405
413
406
414
method_name = f"op_{ opname } "
@@ -409,15 +417,16 @@ def __call__(self) -> None:
409
417
return None
410
418
411
419
def log_called_method (self ):
412
- filename , line , fn , args , * kwargs = self .previous_stack .log_call_args
413
- kwargs = kwargs [0 ] if kwargs else {}
414
- log_call (
415
- f"{ filename } :{ line } " ,
416
- fn ,
417
- tuple (args ),
418
- * ((kwargs ,) if kwargs else ()),
419
- return_type = type (self .TOS ),
420
- )
420
+ if self .previous_stack .log_call_args :
421
+ filename , line , fn , args , * kwargs = self .previous_stack .log_call_args
422
+ kwargs = kwargs [0 ] if kwargs else {}
423
+ log_call (
424
+ f"{ filename } :{ line } " ,
425
+ fn ,
426
+ tuple (args ),
427
+ * ((kwargs ,) if kwargs else ()),
428
+ return_type = type (self .TOS ),
429
+ )
421
430
422
431
# special case subscr b/c we only check first arg, not both
423
432
def op_BINARY_SUBSCR (self ):
@@ -489,7 +498,7 @@ def op_COMPARE_OP(self):
489
498
def op_CALL_FUNCTION (self ):
490
499
args = self .pop_n (self .oparg )
491
500
fn = self .pop ()
492
- self .process ((fn ,), fn , args )
501
+ self .process ((fn ,), fn , args , delay = True )
493
502
494
503
def op_CALL_FUNCTION_KW (self ):
495
504
kwargs_keys = self .pop ()
@@ -499,7 +508,7 @@ def op_CALL_FUNCTION_KW(self):
499
508
args = self .pop_n (self .oparg - n_kwargs )
500
509
fn = self .pop ()
501
510
502
- self .process ((fn ,), fn , args , kwargs )
511
+ self .process ((fn ,), fn , args , kwargs , delay = True )
503
512
504
513
def op_CALL_FUNCTION_EX (self ):
505
514
has_kwarg = self .oparg & int ("01" , 2 )
@@ -513,7 +522,7 @@ def op_CALL_FUNCTION_EX(self):
513
522
fn = self .pop ()
514
523
if inspect .isgenerator (args ):
515
524
return
516
- self .process ((fn ,), fn , args , kwargs )
525
+ self .process ((fn ,), fn , args , kwargs , delay = True )
517
526
518
527
def op_CALL_METHOD (self ):
519
528
args = self .pop_n (self .oparg )
0 commit comments