Skip to content

Commit 28dd3df

Browse files
authored
Fix $TraceBuiltin behavior (#1482)
This fixes #1481. With this changes: ``` In[1]:= $TraceBuiltins=False Out[1]= False In[2]:= $TraceBuiltins Out[2]= False In[3]:= $TraceBuiltins=True Out[3]= True In[4]:= $TraceBuiltins Out[4]= True In[5]:= $TraceBuiltins=True;$TraceBuiltins=True;$TraceBuiltins=False;ClearTrace[];PrintTrace[] count ms Builtin name In[6]:= ```
1 parent a06eab1 commit 28dd3df

File tree

1 file changed

+21
-20
lines changed

1 file changed

+21
-20
lines changed

mathics/builtin/trace.py

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from collections import defaultdict
2121
from io import StringIO
2222
from time import time
23-
from typing import Callable
23+
from typing import Callable, Optional
2424

2525
import mathics_scanner.location
2626

@@ -199,8 +199,11 @@ class TraceBuiltins(_TraceBase):
199199
= x ^ 2
200200
"""
201201

202-
definitions_copy: Definitions
203-
apply_function_copy: Callable
202+
# None if normal evaluation, the main definition object
203+
# if TraceBuiltin is activated.
204+
definitions_copy: Optional[Definitions] = None
205+
# Saves the default apply_function method.
206+
_default_apply_function: Callable = FunctionApplyRule.apply_function
204207

205208
function_stats: "defaultdict" = defaultdict(
206209
lambda: {"count": 0, "elapsed_milliseconds": 0.0}
@@ -245,28 +248,30 @@ def sort_by_name(tup: tuple):
245248
key=sort_fn,
246249
reverse=inverse,
247250
):
251+
# TODO: show a table through a message...
248252
print(
249253
"%5d %6g %s"
250254
% (statistic["count"], int(statistic["elapsed_milliseconds"]), name)
251255
)
252256

253257
@staticmethod
254258
def enable_trace(evaluation) -> None:
255-
if TraceBuiltins.traced_definitions is None:
256-
TraceBuiltins.apply_function_copy = FunctionApplyRule.apply_function
257-
TraceBuiltins.definitions_copy = evaluation.definitions
258-
259-
# Replaces apply_function by the custom one
260-
FunctionApplyRule.apply_function = traced_apply_function
261-
# Create new definitions uses the new apply_function
262-
evaluation.definitions = Definitions(add_builtin=True)
263-
else:
264-
evaluation.definitions = TraceBuiltins.definitions_copy
259+
if TraceBuiltins.definitions_copy:
260+
# Trace already enabled. Do nothing.
261+
return
262+
TraceBuiltins.definitions_copy = evaluation.definitions
263+
# Replaces apply_function by the custom one
264+
FunctionApplyRule.apply_function = traced_apply_function
265+
# Create new definitions uses the new apply_function
266+
evaluation.definitions = Definitions(add_builtin=True)
265267

266268
@staticmethod
267269
def disable_trace(evaluation) -> None:
268-
FunctionApplyRule.apply_function = TraceBuiltins.apply_function_copy
269-
evaluation.definitions = TraceBuiltins.definitions_copy
270+
# Disable tracebuiltin mode just if it was previously enabled:
271+
if TraceBuiltins.definitions_copy:
272+
FunctionApplyRule.apply_function = TraceBuiltins._default_apply_function
273+
evaluation.definitions = TraceBuiltins.definitions_copy
274+
TraceBuiltins.definitions_copy = None
270275

271276
def eval(self, expr, evaluation, options={}):
272277
"%(name)s[expr_, OptionsPattern[%(name)s]]"
@@ -334,23 +339,19 @@ class TraceBuiltinsVariable(Builtin):
334339

335340
messages = {"bool": "`1` should be True or False."}
336341

337-
value = SymbolFalse
338-
339342
summary_text = "enable or disable Built-in function evaluation statistics"
340343

341344
def eval_get(self, evaluation: Evaluation):
342345
"%(name)s"
343346

344-
return self.value
347+
return SymbolTrue if TraceBuiltins.definitions_copy else SymbolFalse
345348

346349
def eval_set(self, value, evaluation: Evaluation):
347350
"%(name)s = value_"
348351

349352
if value is SymbolTrue:
350-
self.value = SymbolTrue
351353
TraceBuiltins.enable_trace(evaluation)
352354
elif value is SymbolFalse:
353-
self.value = SymbolFalse
354355
TraceBuiltins.disable_trace(evaluation)
355356
else:
356357
evaluation.message("$TraceBuiltins", "bool", value)

0 commit comments

Comments
 (0)