Skip to content

Commit 6d3fff5

Browse files
committed
When tracing immediates, print location of definition
For now, we print the location of the *method*. Ideally, we should instead track the location of the InstallImmediateMethod call. See also issue #2239. Before: gap> TraceImmediateMethods( ); gap> g:= Group( (1,2,3), (1,2) );; #I immediate: Size #I immediate: IsCyclic #I immediate: IsCommutative #I immediate: IsTrivial After: gap> TraceImmediateMethods( ); gap> g:= Group( (1,2,3), (1,2) );; #I RunImmediateMethods #I immediate: Size at GAPROOT/lib/coll.gi:174 #I immediate: IsCyclic at GAPROOT/lib/grp.gi:34 #I immediate: IsCommutative at GAPROOT/lib/magma.gi:190 #I immediate: IsTrivial at GAPROOT/lib/magma.gi:124
1 parent b03bc7b commit 6d3fff5

3 files changed

Lines changed: 206 additions & 92 deletions

File tree

lib/oper.g

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -554,9 +554,10 @@ end );
554554
## <Ref Func="UntraceImmediateMethods"/>, or <Ref Func="TraceImmediateMethods"/>
555555
## with <A>flag</A> equal <K>false</K> turns tracing off.
556556
## (There is no facility to trace <E>specific</E> immediate methods.)
557-
## <Example><![CDATA[
557+
## <Log><![CDATA[
558558
## gap> TraceImmediateMethods( );
559559
## gap> g:= Group( (1,2,3), (1,2) );;
560+
## #I RunImmediateMethods
560561
## #I immediate: Size
561562
## #I immediate: IsCyclic
562563
## #I immediate: IsCommutative
@@ -574,7 +575,7 @@ end );
574575
## 6
575576
## gap> UntraceImmediateMethods( );
576577
## gap> UntraceMethods( [ Size ] );
577-
## ]]></Example>
578+
## ]]></Log>
578579
## <P/>
579580
## This example gives an explanation for the two calls of the
580581
## <Q>system getter</Q> for <Ref Func="Size"/>.

lib/oper1.g

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
## have been discovered recently.
2121
## So possible consequences of other filters are not checked.
2222
##
23+
RUN_IMMEDIATE_METHODS_RUNS := 0;
2324
RUN_IMMEDIATE_METHODS_CHECKS := 0;
2425
RUN_IMMEDIATE_METHODS_HITS := 0;
2526

@@ -31,7 +32,9 @@ BIND_GLOBAL( "RunImmediateMethods", function ( obj, flags )
3132
j, # loop over `flagspos'
3233
imm, # immediate methods for filter `j'
3334
i, # loop over `imm'
35+
meth,
3436
res, # result of an immediate method
37+
loc,
3538
newflags; # newly found filters
3639

3740
# Avoid recursive calls from inside a setter,
@@ -49,6 +52,11 @@ BIND_GLOBAL( "RunImmediateMethods", function ( obj, flags )
4952
type := TYPE_OBJ( obj );
5053
flags := type![2];
5154

55+
RUN_IMMEDIATE_METHODS_RUNS := RUN_IMMEDIATE_METHODS_RUNS + 1;
56+
if TRACE_IMMEDIATE_METHODS then
57+
Print( "#I RunImmediateMethods\n");
58+
fi;
59+
5260
# Check the immediate methods for all in `flagspos'.
5361
# (Note that new information is handled via appending to that list.)
5462
for j in flagspos do
@@ -71,16 +79,26 @@ BIND_GLOBAL( "RunImmediateMethods", function ( obj, flags )
7179
then
7280

7381
# Call the method, and store that it was used.
74-
res := IMMEDIATE_METHODS[ imm[i+6] ]( obj );
82+
meth := IMMEDIATE_METHODS[ imm[i+6] ];
83+
res := meth( obj );
7584
ADD_LIST( tried, imm[i+6] );
7685
RUN_IMMEDIATE_METHODS_CHECKS :=
7786
RUN_IMMEDIATE_METHODS_CHECKS+1;
7887
if TRACE_IMMEDIATE_METHODS then
79-
if imm[i+7] = false then
80-
Print( "#I immediate: ", NAME_FUNC( imm[i+1] ), "\n");
81-
else
82-
Print( "#I immediate: ", NAME_FUNC( imm[i+1] ), ": ", imm[i+7], "\n" );
88+
Print( "#I immediate: ", NAME_FUNC( imm[i+1] ));
89+
if imm[i+7] <> false then
90+
Print( ": ", imm[i+7] );
91+
fi;
92+
if IsBound(LocationFunc) then
93+
loc := VALUE_GLOBAL("LocationFunc")( meth );
94+
if loc <> "" then
95+
Print(" at ", loc);
96+
fi;
97+
fi;
98+
if NAME_FUNC(meth) <> "unknown" then
99+
Print(" via ", NAME_FUNC(meth));
83100
fi;
101+
Print("\n");
84102
fi;
85103

86104
if res <> TRY_NEXT_METHOD then

0 commit comments

Comments
 (0)