@@ -80,19 +80,41 @@ def __exit__(self, exc_type, exc_value, tb):
80
80
81
81
82
82
class _ScopeManager (object ):
83
- def __init__ (self , hub , layer ):
83
+ def __init__ (self , hub ):
84
84
self ._hub = hub
85
- self ._layer = layer
85
+ self ._original_len = len (hub ._stack )
86
+ self ._layer = hub ._stack [- 1 ]
86
87
87
88
def __enter__ (self ):
88
89
scope = self ._layer [1 ]
89
90
assert scope is not None
90
91
return scope
91
92
92
93
def __exit__ (self , exc_type , exc_value , tb ):
93
- layer = self ._hub .pop_scope_unsafe ()
94
- assert layer [1 ] == self ._layer [1 ], "popped wrong scope"
95
- if layer [0 ] != self ._layer [0 ]:
94
+ current_len = len (self ._hub ._stack )
95
+ if current_len < self ._original_len :
96
+ logger .error (
97
+ "Scope popped too soon. Popped %s scopes too many." ,
98
+ self ._original_len - current_len ,
99
+ )
100
+ return
101
+ elif current_len > self ._original_len :
102
+ logger .warning (
103
+ "Leaked %s scopes: %s" ,
104
+ current_len - self ._original_len ,
105
+ self ._hub ._stack [self ._original_len :],
106
+ )
107
+
108
+ layer = self ._hub ._stack [self ._original_len - 1 ]
109
+ del self ._hub ._stack [self ._original_len - 1 :]
110
+
111
+ if layer [1 ] != self ._layer [1 ]:
112
+ logger .error (
113
+ "Wrong scope found. Meant to pop %s, but popped %s." ,
114
+ layer [1 ],
115
+ self ._layer [1 ],
116
+ )
117
+ elif layer [0 ] != self ._layer [0 ]:
96
118
warning = (
97
119
"init() called inside of pushed scope. This might be entirely "
98
120
"legitimate but usually occurs when initializing the SDK inside "
@@ -288,7 +310,7 @@ def push_scope(self, callback=None):
288
310
new_layer = (client , copy .copy (scope ))
289
311
self ._stack .append (new_layer )
290
312
291
- return _ScopeManager (self , new_layer )
313
+ return _ScopeManager (self )
292
314
293
315
scope = push_scope
294
316
0 commit comments