Skip to content

Commit feb533d

Browse files
committed
Tack location of InstallImmediateMethod
Before: gap> TraceImmediateMethods( ); gap> g:= Group( (1,2,3), (1,2) );; #I immediate: Size #I immediate: IsCyclic #I immediate: IsCommutative #I immediate: IsTrivial gap> gap> M0:=Magma(FamilyObj([1]), []);; gap> AsSSortedList(M0); #I immediate: RepresentativeSmallest #I immediate: AsList #I immediate: EnumeratorSorted #I immediate: GeneratorsOfDomain #I immediate: Size #I immediate: RepresentativeSmallest #I immediate: IsFinite #I immediate: IsTrivial #I immediate: IsEmpty #I immediate: IsNonTrivial #I immediate: Size #I immediate: RepresentativeSmallest [ ] After (note how e.g. the entry for EnumeratorSorted points at coll.gi:379, and not at the location where the method function was defined): gap> TraceImmediateMethods( ); gap> g:= Group( (1,2,3), (1,2) );; #I RunImmediateMethods #I immediate: Size at GAPROOT/lib/coll.gi:179 #I immediate: IsCyclic at GAPROOT/lib/grp.gi:40 #I immediate: IsCommutative at GAPROOT/lib/magma.gi:196 #I immediate: IsTrivial at GAPROOT/lib/magma.gi:130 gap> gap> M0:=Magma(FamilyObj([1]), []);; #I RunImmediateMethods #I RunImmediateMethods gap> AsSSortedList(M0); #I RunImmediateMethods #I immediate: RepresentativeSmallest at GAPROOT/lib/coll.gi:226 #I immediate: AsList at GAPROOT/lib/domain.gi:206 #I immediate: EnumeratorSorted at GAPROOT/lib/coll.gi:379 #I immediate: GeneratorsOfDomain at GAPROOT/lib/domain.gi:181 #I immediate: Size at GAPROOT/lib/coll.gi:183 #I immediate: RepresentativeSmallest at GAPROOT/lib/coll.gi:215 #I immediate: IsFinite at GAPROOT/lib/coll.gi:148 #I immediate: IsTrivial at GAPROOT/lib/coll.gi:116 #I immediate: IsEmpty at GAPROOT/lib/coll.gi:97 #I immediate: IsNonTrivial at GAPROOT/lib/coll.gi:134 #I RunImmediateMethods #I immediate: Size at GAPROOT/lib/coll.gi:179 #I RunImmediateMethods #I immediate: RepresentativeSmallest at GAPROOT/lib/coll.gi:215 [ ]
1 parent ecb5760 commit feb533d

File tree

8 files changed

+329
-204
lines changed

8 files changed

+329
-204
lines changed

hpcgap/src/c_oper1.c

Lines changed: 144 additions & 95 deletions
Large diffs are not rendered by default.

lib/oper.g

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ IGNORE_IMMEDIATE_METHODS := false;
256256
## </Description>
257257
## </ManSection>
258258
##
259+
BIND_CONSTANT("SIZE_IMMEDIATE_METHOD_ENTRY", 8);
259260
BIND_GLOBAL( "INSTALL_IMMEDIATE_METHOD",
260261
function( oper, info, filter, rank, method )
261262

@@ -377,7 +378,7 @@ BIND_GLOBAL( "INSTALL_IMMEDIATE_METHOD",
377378
fi;
378379
i := 0;
379380
while i < LEN_LIST(imm) and rank < imm[i+5] do
380-
i := i + 7;
381+
i := i + SIZE_IMMEDIATE_METHOD_ENTRY;
381382
od;
382383

383384
# Now is a good time to see if the method is already there
@@ -391,13 +392,13 @@ BIND_GLOBAL( "INSTALL_IMMEDIATE_METHOD",
391392
i := k;
392393
break;
393394
fi;
394-
k := k+7;
395+
k := k+SIZE_IMMEDIATE_METHOD_ENTRY;
395396
od;
396397
fi;
397398

398399
# push the other functions back
399400
if not REREADING or not replace then
400-
imm{[i+8..7+LEN_LIST(imm)]} := imm{[i+1..LEN_LIST(imm)]};
401+
imm{[SIZE_IMMEDIATE_METHOD_ENTRY+i+1..SIZE_IMMEDIATE_METHOD_ENTRY+LEN_LIST(imm)]} := imm{[i+1..LEN_LIST(imm)]};
401402
fi;
402403

403404
# install the new method
@@ -408,6 +409,9 @@ BIND_GLOBAL( "INSTALL_IMMEDIATE_METHOD",
408409
imm[i+5] := rank;
409410
imm[i+6] := pos;
410411
imm[i+7] := IMMUTABLE_COPY_OBJ(info);
412+
if SIZE_IMMEDIATE_METHOD_ENTRY >= 8 then
413+
imm[i+8] := MakeImmutable([INPUT_FILENAME(), INPUT_LINENUMBER()]);
414+
fi;
411415

412416
if IsHPCGAP then
413417
IMMEDIATES[j]:=MakeImmutable(imm);
@@ -553,9 +557,10 @@ end );
553557
## <Ref Func="UntraceImmediateMethods"/>, or <Ref Func="TraceImmediateMethods"/>
554558
## with <A>flag</A> equal <K>false</K> turns tracing off.
555559
## (There is no facility to trace <E>specific</E> immediate methods.)
556-
## <Example><![CDATA[
560+
## <Log><![CDATA[
557561
## gap> TraceImmediateMethods( );
558562
## gap> g:= Group( (1,2,3), (1,2) );;
563+
## #I RunImmediateMethods
559564
## #I immediate: Size
560565
## #I immediate: IsCyclic
561566
## #I immediate: IsCommutative
@@ -573,7 +578,7 @@ end );
573578
## 6
574579
## gap> UntraceImmediateMethods( );
575580
## gap> UntraceMethods( [ Size ] );
576-
## ]]></Example>
581+
## ]]></Log>
577582
## <P/>
578583
## This example gives an explanation for the two calls of the
579584
## <Q>system getter</Q> for <Ref Func="Size"/>.

lib/oper1.g

Lines changed: 15 additions & 6 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
@@ -63,24 +71,25 @@ BIND_GLOBAL( "RunImmediateMethods", function ( obj, flags )
6371
if IsBound( IMMEDIATES[j] ) then
6472
#T the `if' statement can disappear when `IMM_FLAGS' is improved ...
6573
imm := IMMEDIATES[j];
66-
for i in [ 0, 7 .. LEN_LIST(imm)-7 ] do
74+
for i in [ 0, SIZE_IMMEDIATE_METHOD_ENTRY .. LEN_LIST(imm)-SIZE_IMMEDIATE_METHOD_ENTRY ] do
6775

6876
if IS_SUBSET_FLAGS( flags, imm[i+4] )
6977
and not IS_SUBSET_FLAGS( flags, imm[i+3] )
7078
and not imm[i+6] in tried
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] );
8391
fi;
92+
Print(" at ", imm[i+8][1], ":", imm[i+8][2], "\n");
8493
fi;
8594

8695
if res <> TRY_NEXT_METHOD then

0 commit comments

Comments
 (0)