From a81e42f1ff993b3029dd2834e8e3a1c69e5be7ac Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 Apr 2018 13:14:57 +0200 Subject: [PATCH 1/5] Add constant BASE_SIZE_METHODS_OPER_ENTRY ... for accessing the methods in METHODS_OPERATION(oper,n). By using this constant, it becomes easier to add additional entries for each method. Note that the layout of METHODS_OPERATION is strictly speaking an internal implementation detail, and thus packages directly accessing it do so at their own risk. If a package accesses METHODS_OPERATION anyway (currently only Browse) it should be updated to use METHODS_OPERATION. (For backwards compatibility, if BASE_SIZE_METHODS_OPER_ENTRY is not defined, it can be set to 4). --- hpcgap/src/c_oper1.c | 9 +++++---- hpcgap/src/c_type1.c | 9 +++++---- lib/methsel.g | 15 ++++++++------- lib/methwhy.g | 2 +- lib/oper1.g | 8 ++++---- lib/profile.g | 4 ++-- lib/type1.g | 2 +- src/c_oper1.c | 9 +++++---- src/c_type1.c | 9 +++++---- src/opers.c | 15 +++++++++++---- 10 files changed, 47 insertions(+), 35 deletions(-) diff --git a/hpcgap/src/c_oper1.c b/hpcgap/src/c_oper1.c index 729e65c3f8..75e10a6f73 100644 --- a/hpcgap/src/c_oper1.c +++ b/hpcgap/src/c_oper1.c @@ -1,7 +1,7 @@ #ifndef AVOID_PRECOMPILED /* C file produced by GAC */ #include -#define FILE_CRC "452946" +#define FILE_CRC "-43761536" /* global variables used in handlers */ static GVar G_REREADING; @@ -4154,10 +4154,11 @@ static Obj HdlrFunc1 ( CHANGED_BAG( STATE(CurrLVars) ); CALL_2ARGS( t_1, t_2, t_3 ); - /* LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + 6; */ + /* LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + (4 + 2); */ t_2 = GC_LENGTH__SETTER__METHODS__2; CHECK_BOUND( t_2, "LENGTH_SETTER_METHODS_2" ) - C_SUM_FIA( t_1, t_2, INTOBJ_INT(6) ) + C_SUM_INTOBJS( t_3, INTOBJ_INT(4), INTOBJ_INT(2) ) + C_SUM_FIA( t_1, t_2, t_3 ) AssGVar( G_LENGTH__SETTER__METHODS__2, t_1 ); /* InstallAttributeFunction( function ( name, filter, getter, setter, tester, mutflag ) @@ -4702,7 +4703,7 @@ static Int InitLibrary ( StructInitInfo * module ) static StructInitInfo module = { .type = MODULE_STATIC, .name = "GAPROOT/lib/oper1.g", - .crc = 452946, + .crc = -43761536, .initKernel = InitKernel, .initLibrary = InitLibrary, .postRestore = PostRestore, diff --git a/hpcgap/src/c_type1.c b/hpcgap/src/c_type1.c index 39f1b77ebc..fb6d53bc1f 100644 --- a/hpcgap/src/c_type1.c +++ b/hpcgap/src/c_type1.c @@ -1,7 +1,7 @@ #ifndef AVOID_PRECOMPILED /* C file produced by GAC */ #include -#define FILE_CRC "127455113" +#define FILE_CRC "-95946497" /* global variables used in handlers */ static GVar G_NAME__FUNC; @@ -3575,10 +3575,11 @@ static Obj HdlrFunc1 ( CHANGED_BAG( STATE(CurrLVars) ); CALL_1ARGS( t_1, t_2 ); - /* LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + 6; */ + /* LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + (4 + 2); */ t_2 = GC_LENGTH__SETTER__METHODS__2; CHECK_BOUND( t_2, "LENGTH_SETTER_METHODS_2" ) - C_SUM_FIA( t_1, t_2, INTOBJ_INT(6) ) + C_SUM_INTOBJS( t_3, INTOBJ_INT(4), INTOBJ_INT(2) ) + C_SUM_FIA( t_1, t_2, t_3 ) AssGVar( G_LENGTH__SETTER__METHODS__2, t_1 ); /* InstallAttributeFunction( function ( name, filter, getter, setter, tester, mutflag ) @@ -4770,7 +4771,7 @@ static Int InitLibrary ( StructInitInfo * module ) static StructInitInfo module = { .type = MODULE_STATIC, .name = "GAPROOT/lib/type1.g", - .crc = 127455113, + .crc = -95946497, .initKernel = InitKernel, .initLibrary = InitLibrary, .postRestore = PostRestore, diff --git a/lib/methsel.g b/lib/methsel.g index 074a63bb28..156eda1466 100644 --- a/lib/methsel.g +++ b/lib/methsel.g @@ -26,19 +26,20 @@ #F AttributeValueNotSet( , ) ## AttributeValueNotSet := function(attr,obj) -local type,fam,methods,i,flag,erg; +local type,fam,methods,i,j,flag,erg; type:=TypeObj(obj); fam:=FamilyObj(obj); methods:=METHODS_OPERATION(attr,1); - for i in [1..LEN_LIST(methods)/5] do + for i in [1..LEN_LIST(methods)/(1+BASE_SIZE_METHODS_OPER_ENTRY)] do # nam:=methods[5*(i-1)+5]; # name + j:=(1+BASE_SIZE_METHODS_OPER_ENTRY)*(i-1); flag:=true; - flag:=flag and IS_SUBSET_FLAGS(type![2],methods[5*(i-1)+2]); + flag:=flag and IS_SUBSET_FLAGS(type![2],methods[j+2]); if flag then - flag:=flag and methods[5*(i-1)+1](fam); + flag:=flag and methods[j+1](fam); fi; if flag then - attr:=methods[5*(i-1)+3]; + attr:=methods[j+3]; erg:=attr(obj); if not IS_IDENTICAL_OBJ(erg,TRY_NEXT_METHOD) then return erg; @@ -55,7 +56,7 @@ end; ## VMETHOD_PRINT_INFO := function ( methods, i, arity) local offset; - offset := (arity+4)*(i-1)+arity; + offset := (arity+BASE_SIZE_METHODS_OPER_ENTRY)*(i-1)+arity; Print("#I ", methods[offset+4]); if FILENAME_FUNC(methods[offset+2]) <> fail then Print(" at ", @@ -71,7 +72,7 @@ end; ## NEXT_VMETHOD_PRINT_INFO := function ( methods, i, arity) local offset; - offset := (arity+4)*(i-1)+arity; + offset := (arity+BASE_SIZE_METHODS_OPER_ENTRY)*(i-1)+arity; Print("#I Trying next: ", methods[offset+4]); if FILENAME_FUNC(methods[offset+2]) <> fail then Print(" at ", diff --git a/lib/methwhy.g b/lib/methwhy.g index 779bcbe398..22d38641f1 100644 --- a/lib/methwhy.g +++ b/lib/methwhy.g @@ -169,7 +169,7 @@ local oper,l,obj,skip,verbos,fams,flags,i,j,methods,flag,flag2, Print("#I Searching Method for ",NameFunction(oper)," with ",l, " arguments:\n"); fi; - lent:=4+l; #length of one entry + lent:=BASE_SIZE_METHODS_OPER_ENTRY+l; #length of one entry if verbos > 0 then Print("#I Total: ", Length(methods)/lent," entries\n"); fi; diff --git a/lib/oper1.g b/lib/oper1.g index abb644722d..7697b2d280 100644 --- a/lib/oper1.g +++ b/lib/oper1.g @@ -174,7 +174,7 @@ BIND_GLOBAL( "INSTALL_METHOD_FLAGS", # find the place to put the new method i := 0; while i < LEN_LIST(methods) and rank < methods[i+(narg+3)] do - i := i + (narg+4); + i := i + (narg+BASE_SIZE_METHODS_OPER_ENTRY); od; # Now is a good time to see if the method is already there @@ -196,12 +196,12 @@ BIND_GLOBAL( "INSTALL_METHOD_FLAGS", break; fi; fi; - k := k+narg+4; + k := k+narg+BASE_SIZE_METHODS_OPER_ENTRY; od; fi; # push the other functions back if not REREADING or not replace then - methods{[narg+4+i+1..narg+4+LEN_LIST(methods)]} + methods{[narg+BASE_SIZE_METHODS_OPER_ENTRY+i+1..narg+BASE_SIZE_METHODS_OPER_ENTRY+LEN_LIST(methods)]} := methods{[i+1..LEN_LIST(methods)]}; fi; @@ -572,7 +572,7 @@ end ); ## ## The default setter method does nothing. ## -LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + 6; # one method +LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + (BASE_SIZE_METHODS_OPER_ENTRY+2); # one method InstallAttributeFunction( function ( name, filter, getter, setter, tester, mutflag ) diff --git a/lib/profile.g b/lib/profile.g index 7ec2e6dc99..599ecbdbda 100644 --- a/lib/profile.g +++ b/lib/profile.g @@ -668,7 +668,7 @@ BIND_GLOBAL("ProfileMethods",function( arg ) for i in [ 0 .. 6 ] do meth := METHODS_OPERATION( op, i ); if meth <> fail then - for j in [ 0, (4+i) .. Length(meth)-(4+i) ] do + for j in [ 0, (BASE_SIZE_METHODS_OPER_ENTRY+i) .. Length(meth)-(BASE_SIZE_METHODS_OPER_ENTRY+i) ] do Add( funcs, meth[j+(2+i)] ); if name = meth[j+(4+i)] then Add( names, [ "Meth(", name, ")" ] ); @@ -718,7 +718,7 @@ BIND_GLOBAL("UnprofileMethods",function( arg ) for i in [ 0 .. 6 ] do meth := METHODS_OPERATION( op, i ); if meth <> fail then - for j in [ 0, (4+i) .. Length(meth)-(4+i) ] do + for j in [ 0, (BASE_SIZE_METHODS_OPER_ENTRY+i) .. Length(meth)-(BASE_SIZE_METHODS_OPER_ENTRY+i) ] do Add( funcs, meth[j+(2+i)] ); od; fi; diff --git a/lib/type1.g b/lib/type1.g index 6fa851bf33..f189df22d8 100644 --- a/lib/type1.g +++ b/lib/type1.g @@ -25,7 +25,7 @@ InstallAttributeFunction( GETTER_FUNCTION(name) ); end ); -LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + 6; +LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + (BASE_SIZE_METHODS_OPER_ENTRY+2); InstallAttributeFunction( function ( name, filter, getter, setter, tester, mutflag ) diff --git a/src/c_oper1.c b/src/c_oper1.c index 43da9b4160..5deaba6653 100644 --- a/src/c_oper1.c +++ b/src/c_oper1.c @@ -1,7 +1,7 @@ #ifndef AVOID_PRECOMPILED /* C file produced by GAC */ #include -#define FILE_CRC "452946" +#define FILE_CRC "-43761536" /* global variables used in handlers */ static GVar G_REREADING; @@ -4069,10 +4069,11 @@ static Obj HdlrFunc1 ( CHANGED_BAG( STATE(CurrLVars) ); CALL_2ARGS( t_1, t_2, t_3 ); - /* LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + 6; */ + /* LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + (4 + 2); */ t_2 = GC_LENGTH__SETTER__METHODS__2; CHECK_BOUND( t_2, "LENGTH_SETTER_METHODS_2" ) - C_SUM_FIA( t_1, t_2, INTOBJ_INT(6) ) + C_SUM_INTOBJS( t_3, INTOBJ_INT(4), INTOBJ_INT(2) ) + C_SUM_FIA( t_1, t_2, t_3 ) AssGVar( G_LENGTH__SETTER__METHODS__2, t_1 ); /* InstallAttributeFunction( function ( name, filter, getter, setter, tester, mutflag ) @@ -4601,7 +4602,7 @@ static Int InitLibrary ( StructInitInfo * module ) static StructInitInfo module = { .type = MODULE_STATIC, .name = "GAPROOT/lib/oper1.g", - .crc = 452946, + .crc = -43761536, .initKernel = InitKernel, .initLibrary = InitLibrary, .postRestore = PostRestore, diff --git a/src/c_type1.c b/src/c_type1.c index a2be8764f7..5e74cda01a 100644 --- a/src/c_type1.c +++ b/src/c_type1.c @@ -1,7 +1,7 @@ #ifndef AVOID_PRECOMPILED /* C file produced by GAC */ #include -#define FILE_CRC "127455113" +#define FILE_CRC "-95946497" /* global variables used in handlers */ static GVar G_NAME__FUNC; @@ -3362,10 +3362,11 @@ static Obj HdlrFunc1 ( CHANGED_BAG( STATE(CurrLVars) ); CALL_1ARGS( t_1, t_2 ); - /* LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + 6; */ + /* LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + (4 + 2); */ t_2 = GC_LENGTH__SETTER__METHODS__2; CHECK_BOUND( t_2, "LENGTH_SETTER_METHODS_2" ) - C_SUM_FIA( t_1, t_2, INTOBJ_INT(6) ) + C_SUM_INTOBJS( t_3, INTOBJ_INT(4), INTOBJ_INT(2) ) + C_SUM_FIA( t_1, t_2, t_3 ) AssGVar( G_LENGTH__SETTER__METHODS__2, t_1 ); /* InstallAttributeFunction( function ( name, filter, getter, setter, tester, mutflag ) @@ -4502,7 +4503,7 @@ static Int InitLibrary ( StructInitInfo * module ) static StructInitInfo module = { .type = MODULE_STATIC, .name = "GAPROOT/lib/type1.g", - .crc = 127455113, + .crc = -95946497, .initKernel = InitKernel, .initLibrary = InitLibrary, .postRestore = PostRestore, diff --git a/src/opers.c b/src/opers.c index 18de957f43..f79297c11a 100644 --- a/src/opers.c +++ b/src/opers.c @@ -2032,6 +2032,9 @@ static Obj NEXT_VMETHOD_PRINT_INFO; // // Use of 'ALWAYS_INLINE' is critical for performance, see discussion // earlier in this file. +enum { + BASE_SIZE_METHODS_OPER_ENTRY = 4, +}; static ALWAYS_INLINE Obj GetMethodUncached( UInt verbose, UInt constructor, UInt n, Obj oper, Int prec, Obj types[]) { @@ -2041,9 +2044,10 @@ static ALWAYS_INLINE Obj GetMethodUncached( const UInt len = LEN_PLIST(methods); UInt j = 0; - for (UInt pos = 0; pos < len; pos += n + 4) { - // each method comprises n+4 entries in the 'methods' list: - // entry 1 is the family predicated; + for (UInt pos = 0; pos < len; pos += n + BASE_SIZE_METHODS_OPER_ENTRY) { + // each method comprises n + BASE_SIZE_METHODS_OPER_ENTRY + // entries in the 'methods' list: + // entry 1 is the family predicate; // entries 2 till n+1 are the n argument filters // entry n+2 is the actual method // entry n+3 is the rank @@ -2120,7 +2124,8 @@ static ALWAYS_INLINE Obj GetMethodUncached( if (prec == j) { if (verbose) { CALL_3ARGS(prec == 0 ? VMETHOD_PRINT_INFO : NEXT_VMETHOD_PRINT_INFO, methods, - INTOBJ_INT(pos / (n + 4) + 1), INTOBJ_INT(n)); + INTOBJ_INT(pos / (n + BASE_SIZE_METHODS_OPER_ENTRY) + 1), + INTOBJ_INT(n)); } Obj meth = ELM_PLIST(methods, pos + n + 2); @@ -4311,6 +4316,8 @@ static Int InitLibrary ( // HACK: move this here, instead of InitKernel, to avoid ariths.c overwriting it EqFuncs[T_FLAGS][T_FLAGS] = EqFlags; + ExportAsConstantGVar(BASE_SIZE_METHODS_OPER_ENTRY); + HIDDEN_IMPS = NEW_PLIST(T_PLIST, 0); SET_LEN_PLIST(HIDDEN_IMPS, 0); WITH_HIDDEN_IMPS_FLAGS_CACHE = NEW_PLIST(T_PLIST, HIDDEN_IMPS_CACHE_LENGTH * 2); From 9070371146c974d4cc2d9230af5aa710f9e7f419 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 Apr 2018 15:01:12 +0200 Subject: [PATCH 2/5] Change some local var names in ApplicableMethodTypes ... to make it a bit easier to figure out what's going on --- lib/methwhy.g | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/lib/methwhy.g b/lib/methwhy.g index 22d38641f1..29f4ae6157 100644 --- a/lib/methwhy.g +++ b/lib/methwhy.g @@ -119,14 +119,14 @@ end); ## <#/GAPDoc> ## BIND_GLOBAL("ApplicableMethodTypes",function(arg) -local oper,l,obj,skip,verbos,fams,flags,i,j,methods,flag,flag2, - lent,nam,val,erg,has,need,isconstructor; +local oper,narg,args,skip,verbos,fams,flags,i,j,methods,flag,flag2, + lent,offset,nam,val,erg,has,need,isconstructor; if Length(arg)<2 or not IsList(arg[2]) or not IsFunction(arg[1]) then Error("usage: ApplicableMethodTypes(,[,[,]])"); fi; oper:=arg[1]; isconstructor:=IS_CONSTRUCTOR(oper); - obj:=arg[2]; + args:=arg[2]; if Length(arg)>2 then verbos:=arg[3]; else @@ -142,12 +142,12 @@ local oper,l,obj,skip,verbos,fams,flags,i,j,methods,flag,flag2, else skip:=0; fi; - l:=Length(obj); + narg:=Length(args); # get families and filters flags:=[]; fams:=[]; - for i in obj do + for i in args do if IsFilter(i) then Add(flags,FLAGS_FILTER(i)); Add(fams,fail); @@ -164,19 +164,20 @@ local oper,l,obj,skip,verbos,fams,flags,i,j,methods,flag,flag2, Info(InfoWarning,1,"Family predicate cannot be tested"); fi; - methods:=METHODS_OPERATION(oper,l); + methods:=METHODS_OPERATION(oper,narg); if verbos > 0 then - Print("#I Searching Method for ",NameFunction(oper)," with ",l, + Print("#I Searching Method for ",NameFunction(oper)," with ",narg, " arguments:\n"); fi; - lent:=BASE_SIZE_METHODS_OPER_ENTRY+l; #length of one entry + lent:=BASE_SIZE_METHODS_OPER_ENTRY+narg; #length of one entry if verbos > 0 then Print("#I Total: ", Length(methods)/lent," entries\n"); fi; for i in [1..Length(methods)/lent] do - nam:=methods[lent*(i-1)+l+4]; - val:=methods[lent*(i-1)+l+3]; - oper:=methods[lent*(i-1)+l+2]; + offset:=lent*(i-1); + nam:=methods[offset+narg+4]; + val:=methods[offset+narg+3]; + oper:=methods[offset+narg+2]; if verbos>1 then Print("#I Method ",i,": ``",nam,"''"); if LocationFunc(oper) <> "" then @@ -188,15 +189,15 @@ local oper,l,obj,skip,verbos,fams,flags,i,j,methods,flag,flag2, fi; flag:=true; j:=1; - while j<=l and (flag or verbos>3) do + while j<=narg and (flag or verbos>3) do if j=1 and isconstructor then - flag2:=IS_SUBSET_FLAGS(methods[lent*(i-1)+1+j],flags[j]); + flag2:=IS_SUBSET_FLAGS(methods[offset+1+j],flags[j]); else - flag2:=IS_SUBSET_FLAGS(flags[j],methods[lent*(i-1)+1+j]); + flag2:=IS_SUBSET_FLAGS(flags[j],methods[offset+1+j]); fi; flag:=flag and flag2; if flag2=false and verbos>2 then - need:=NamesFilter(methods[lent*(i-1)+1+j]); + need:=NamesFilter(methods[offset+1+j]); if j=1 and isconstructor then Print("#I - ",Ordinal(j)," argument must be ", need,"\n"); @@ -209,8 +210,8 @@ local oper,l,obj,skip,verbos,fams,flags,i,j,methods,flag,flag2, j:=j+1; od; if flag then - if fams=fail or CallFuncList(methods[lent*(i-1)+1],fams) then - oper:=methods[lent*(i-1)+j+1]; + if fams=fail or CallFuncList(methods[offset+1],fams) then + oper:=methods[offset+j+1]; if verbos=1 then Print("#I Method ",i,": ``",nam,"''"); if LocationFunc(oper) <> "" then From bc2c12ab199087cbfdb0f81331a423173c435fd2 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 Apr 2018 15:03:00 +0200 Subject: [PATCH 3/5] Track location of InstallMethod This makes the information displayed by TraceMethods and by ApplicableMethod much more useful in many case, which resolves #2239. For example, consider this method for `AsList`, installed in coll.gi: InstallMethod( AsList, "for collections that are constant time access lists", [ IsCollection and IsConstantTimeAccessList ], Immutable ); With GAP 4.8, no location information is shown at all: gap> TraceMethods(AsList); AsList("abc");; #I AsList: for collections that are constant time access lists With GAP 4.9 / master, the location where the method (i.e., the underlying function) was defined is shown, which already does the job in many cases, but not here: gap> TraceMethods(AsList); AsList("abc");; #I AsList: for collections that are constant time access lists at src/objects.c:fail With this PR, we get this (note that instead of GAPROOT, the actual path is printed) gap> TraceMethods(AsList); AsList("abc");; #I AsList: for collections that are constant time access lists at GAPROOT/lib/coll.gi:302 --- hpcgap/src/c_oper1.c | 129 ++++++++++++++++++++----------- hpcgap/src/c_type1.c | 4 +- lib/methsel.g | 8 +- lib/methwhy.g | 8 +- lib/oper1.g | 3 + src/c_oper1.c | 129 ++++++++++++++++++++----------- src/c_type1.c | 4 +- src/opers.c | 3 +- tst/test-error/trace.g.out | 4 +- tst/testinstall/kernel/opers.tst | 11 +-- tst/testinstall/varargs.tst | 2 +- 11 files changed, 198 insertions(+), 107 deletions(-) diff --git a/hpcgap/src/c_oper1.c b/hpcgap/src/c_oper1.c index 75e10a6f73..e82441edc0 100644 --- a/hpcgap/src/c_oper1.c +++ b/hpcgap/src/c_oper1.c @@ -1,7 +1,7 @@ #ifndef AVOID_PRECOMPILED /* C file produced by GAC */ #include -#define FILE_CRC "-43761536" +#define FILE_CRC "-6572452" /* global variables used in handlers */ static GVar G_REREADING; @@ -40,6 +40,10 @@ static GVar G_IS__IDENTICAL__OBJ; static Obj GF_IS__IDENTICAL__OBJ; static GVar G_MakeImmutable; static Obj GF_MakeImmutable; +static GVar G_INPUT__FILENAME; +static Obj GF_INPUT__FILENAME; +static GVar G_INPUT__LINENUMBER; +static Obj GF_INPUT__LINENUMBER; static GVar G_IS__OBJECT; static Obj GC_IS__OBJECT; static GVar G_TRY__NEXT__METHOD; @@ -770,8 +774,8 @@ static Obj HdlrFunc3 ( } if ( ! t_1 ) break; - /* i := i + (narg + 4); */ - C_SUM_FIA( t_2, l_narg, INTOBJ_INT(4) ) + /* i := i + (narg + 5); */ + C_SUM_FIA( t_2, l_narg, INTOBJ_INT(5) ) C_SUM_FIA( t_1, l_i, t_2 ) l_i = t_1; @@ -879,9 +883,9 @@ static Obj HdlrFunc3 ( } /* fi */ - /* k := k + narg + 4; */ + /* k := k + narg + 5; */ C_SUM_FIA( t_2, l_k, l_narg ) - C_SUM_FIA( t_1, t_2, INTOBJ_INT(4) ) + C_SUM_FIA( t_1, t_2, INTOBJ_INT(5) ) l_k = t_1; } @@ -904,11 +908,11 @@ static Obj HdlrFunc3 ( } if ( t_1 ) { - /* methods{[ narg + 4 + i + 1 .. narg + 4 + LEN_LIST( methods ) ]} := methods{[ i + 1 .. LEN_LIST( methods ) ]}; */ - C_SUM_FIA( t_4, l_narg, INTOBJ_INT(4) ) + /* methods{[ narg + 5 + i + 1 .. narg + 5 + LEN_LIST( methods ) ]} := methods{[ i + 1 .. LEN_LIST( methods ) ]}; */ + C_SUM_FIA( t_4, l_narg, INTOBJ_INT(5) ) C_SUM_FIA( t_3, t_4, l_i ) C_SUM_FIA( t_2, t_3, INTOBJ_INT(1) ) - C_SUM_FIA( t_4, l_narg, INTOBJ_INT(4) ) + C_SUM_FIA( t_4, l_narg, INTOBJ_INT(5) ) t_6 = GF_LEN__LIST; t_5 = CALL_1ARGS( t_6, l_methods ); CHECK_FUNC_RESULT( t_5 ) @@ -1185,6 +1189,34 @@ static Obj HdlrFunc3 ( CHECK_FUNC_RESULT( t_2 ) C_ASS_LIST_FPL( l_methods, t_1, t_2 ) + /* if 5 >= 5 then */ + t_1 = (Obj)(UInt)(((Int)INTOBJ_INT(5)) >= ((Int)INTOBJ_INT(5))); + if ( t_1 ) { + + /* methods[i + (narg + 5)] := MakeImmutable( [ INPUT_FILENAME( ), INPUT_LINENUMBER( ) ] ); */ + C_SUM_INTOBJS( t_2, l_narg, INTOBJ_INT(5) ) + C_SUM_FIA( t_1, l_i, t_2 ) + CHECK_INT_POS( t_1 ) + t_3 = GF_MakeImmutable; + t_4 = NEW_PLIST( T_PLIST, 2 ); + SET_LEN_PLIST( t_4, 2 ); + t_6 = GF_INPUT__FILENAME; + t_5 = CALL_0ARGS( t_6 ); + CHECK_FUNC_RESULT( t_5 ) + SET_ELM_PLIST( t_4, 1, t_5 ); + CHANGED_BAG( t_4 ); + t_6 = GF_INPUT__LINENUMBER; + t_5 = CALL_0ARGS( t_6 ); + CHECK_FUNC_RESULT( t_5 ) + SET_ELM_PLIST( t_4, 2, t_5 ); + CHANGED_BAG( t_4 ); + t_2 = CALL_1ARGS( t_3, t_4 ); + CHECK_FUNC_RESULT( t_2 ) + C_ASS_LIST_FPL( l_methods, t_1, t_2 ) + + } + /* fi */ + /* SET_METHODS_OPERATION( opr, narg, MakeReadOnlySingleObj( methods ) ); */ t_1 = GF_SET__METHODS__OPERATION; t_3 = GF_MakeReadOnlySingleObj; @@ -2514,8 +2546,8 @@ static Obj HdlrFunc7 ( t_6 = NewFunction( NameFunc[8], 1, 0, HdlrFunc8 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 622); - SET_ENDLINE_BODY(t_7, 640); + SET_STARTLINE_BODY(t_7, 625); + SET_ENDLINE_BODY(t_7, 643); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3118,8 +3150,8 @@ static Obj HdlrFunc11 ( t_1 = NewFunction( NameFunc[12], 1, 0, HdlrFunc12 ); SET_ENVI_FUNC( t_1, STATE(CurrLVars) ); t_2 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_2, 819); - SET_ENDLINE_BODY(t_2, 823); + SET_STARTLINE_BODY(t_2, 822); + SET_ENDLINE_BODY(t_2, 826); SET_FILENAME_BODY(t_2, FileName); SET_BODY_FUNC(t_1, t_2); CHANGED_BAG( STATE(CurrLVars) ); @@ -3198,8 +3230,8 @@ static Obj HdlrFunc11 ( t_6 = NewFunction( NameFunc[13], 1, 0, HdlrFunc13 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 840); - SET_ENDLINE_BODY(t_7, 840); + SET_STARTLINE_BODY(t_7, 843); + SET_ENDLINE_BODY(t_7, 843); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3273,8 +3305,8 @@ static Obj HdlrFunc11 ( t_6 = NewFunction( NameFunc[14], 2, 0, HdlrFunc14 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 862); - SET_ENDLINE_BODY(t_7, 885); + SET_STARTLINE_BODY(t_7, 865); + SET_ENDLINE_BODY(t_7, 888); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3322,8 +3354,8 @@ static Obj HdlrFunc11 ( t_6 = NewFunction( NameFunc[15], 2, 0, HdlrFunc15 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 895); - SET_ENDLINE_BODY(t_7, 903); + SET_STARTLINE_BODY(t_7, 898); + SET_ENDLINE_BODY(t_7, 906); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3384,8 +3416,8 @@ static Obj HdlrFunc11 ( t_6 = NewFunction( NameFunc[16], 3, 0, HdlrFunc16 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 912); - SET_ENDLINE_BODY(t_7, 925); + SET_STARTLINE_BODY(t_7, 915); + SET_ENDLINE_BODY(t_7, 928); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3758,8 +3790,8 @@ static Obj HdlrFunc17 ( t_4 = NewFunction( NameFunc[18], -1, 0, HdlrFunc18 ); SET_ENVI_FUNC( t_4, STATE(CurrLVars) ); t_5 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_5, 991); - SET_ENDLINE_BODY(t_5, 1007); + SET_STARTLINE_BODY(t_5, 994); + SET_ENDLINE_BODY(t_5, 1010); SET_FILENAME_BODY(t_5, FileName); SET_BODY_FUNC(t_4, t_5); CHANGED_BAG( STATE(CurrLVars) ); @@ -3894,7 +3926,7 @@ static Obj HdlrFunc1 ( fi; i := 0; while i < LEN_LIST( methods ) and rank < methods[i + (narg + 3)] do - i := i + (narg + 4); + i := i + (narg + 5); od; replace := false; if REREADING then @@ -3911,11 +3943,11 @@ static Obj HdlrFunc1 ( break; fi; fi; - k := k + narg + 4; + k := k + narg + 5; od; fi; if not REREADING or not replace then - methods{[ narg + 4 + i + 1 .. narg + 4 + LEN_LIST( methods ) ]} := methods{[ i + 1 .. LEN_LIST( methods ) ]}; + methods{[ narg + 5 + i + 1 .. narg + 5 + LEN_LIST( methods ) ]} := methods{[ i + 1 .. LEN_LIST( methods ) ]}; fi; if rel = true then methods[i + 1] := RETURN_TRUE; @@ -3952,6 +3984,9 @@ static Obj HdlrFunc1 ( fi; methods[i + (narg + 3)] := rank; methods[i + (narg + 4)] := IMMUTABLE_COPY_OBJ( info ); + if 5 >= 5 then + methods[i + (narg + 5)] := MakeImmutable( [ INPUT_FILENAME( ), INPUT_LINENUMBER( ) ] ); + fi; SET_METHODS_OPERATION( opr, narg, MakeReadOnlySingleObj( methods ) ); UNLOCK( lk ); return; @@ -3962,7 +3997,7 @@ static Obj HdlrFunc1 ( SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); SET_STARTLINE_BODY(t_4, 137); - SET_ENDLINE_BODY(t_4, 261); + SET_ENDLINE_BODY(t_4, 264); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -3977,8 +4012,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[4], -1, 0, HdlrFunc4 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 308); - SET_ENDLINE_BODY(t_4, 310); + SET_STARTLINE_BODY(t_4, 311); + SET_ENDLINE_BODY(t_4, 313); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -3993,8 +4028,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[5], -1, 0, HdlrFunc5 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 335); - SET_ENDLINE_BODY(t_4, 337); + SET_STARTLINE_BODY(t_4, 338); + SET_ENDLINE_BODY(t_4, 340); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4147,17 +4182,17 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[6], 2, 0, HdlrFunc6 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 348); - SET_ENDLINE_BODY(t_4, 559); + SET_STARTLINE_BODY(t_4, 351); + SET_ENDLINE_BODY(t_4, 562); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); CALL_2ARGS( t_1, t_2, t_3 ); - /* LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + (4 + 2); */ + /* LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + (5 + 2); */ t_2 = GC_LENGTH__SETTER__METHODS__2; CHECK_BOUND( t_2, "LENGTH_SETTER_METHODS_2" ) - C_SUM_INTOBJS( t_3, INTOBJ_INT(4), INTOBJ_INT(2) ) + C_SUM_INTOBJS( t_3, INTOBJ_INT(5), INTOBJ_INT(2) ) C_SUM_FIA( t_1, t_2, t_3 ) AssGVar( G_LENGTH__SETTER__METHODS__2, t_1 ); @@ -4208,8 +4243,8 @@ static Obj HdlrFunc1 ( t_2 = NewFunction( NameFunc[7], 6, 0, HdlrFunc7 ); SET_ENVI_FUNC( t_2, STATE(CurrLVars) ); t_3 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_3, 578); - SET_ENDLINE_BODY(t_3, 644); + SET_STARTLINE_BODY(t_3, 581); + SET_ENDLINE_BODY(t_3, 647); SET_FILENAME_BODY(t_3, FileName); SET_BODY_FUNC(t_2, t_3); CHANGED_BAG( STATE(CurrLVars) ); @@ -4223,8 +4258,8 @@ static Obj HdlrFunc1 ( t_2 = NewFunction( NameFunc[9], 6, 0, HdlrFunc9 ); SET_ENVI_FUNC( t_2, STATE(CurrLVars) ); t_3 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_3, 647); - SET_ENDLINE_BODY(t_3, 653); + SET_STARTLINE_BODY(t_3, 650); + SET_ENDLINE_BODY(t_3, 656); SET_FILENAME_BODY(t_3, FileName); SET_BODY_FUNC(t_2, t_3); CHANGED_BAG( STATE(CurrLVars) ); @@ -4252,8 +4287,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[10], 2, 0, HdlrFunc10 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 666); - SET_ENDLINE_BODY(t_4, 690); + SET_STARTLINE_BODY(t_4, 669); + SET_ENDLINE_BODY(t_4, 693); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4337,8 +4372,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[11], 4, 0, HdlrFunc11 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 815); - SET_ENDLINE_BODY(t_4, 926); + SET_STARTLINE_BODY(t_4, 818); + SET_ENDLINE_BODY(t_4, 929); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4389,8 +4424,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[17], -1, 0, HdlrFunc17 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 961); - SET_ENDLINE_BODY(t_4, 1008); + SET_STARTLINE_BODY(t_4, 964); + SET_ENDLINE_BODY(t_4, 1011); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4446,6 +4481,8 @@ static Int PostRestore ( StructInitInfo * module ) G_IMMUTABLE__COPY__OBJ = GVarName( "IMMUTABLE_COPY_OBJ" ); G_IS__IDENTICAL__OBJ = GVarName( "IS_IDENTICAL_OBJ" ); G_MakeImmutable = GVarName( "MakeImmutable" ); + G_INPUT__FILENAME = GVarName( "INPUT_FILENAME" ); + G_INPUT__LINENUMBER = GVarName( "INPUT_LINENUMBER" ); G_IS__OBJECT = GVarName( "IS_OBJECT" ); G_TRY__NEXT__METHOD = GVarName( "TRY_NEXT_METHOD" ); G_SUB__FLAGS = GVarName( "SUB_FLAGS" ); @@ -4564,6 +4601,8 @@ static Int InitKernel ( StructInitInfo * module ) InitFopyGVar( "IMMUTABLE_COPY_OBJ", &GF_IMMUTABLE__COPY__OBJ ); InitFopyGVar( "IS_IDENTICAL_OBJ", &GF_IS__IDENTICAL__OBJ ); InitFopyGVar( "MakeImmutable", &GF_MakeImmutable ); + InitFopyGVar( "INPUT_FILENAME", &GF_INPUT__FILENAME ); + InitFopyGVar( "INPUT_LINENUMBER", &GF_INPUT__LINENUMBER ); InitCopyGVar( "IS_OBJECT", &GC_IS__OBJECT ); InitCopyGVar( "TRY_NEXT_METHOD", &GC_TRY__NEXT__METHOD ); InitFopyGVar( "SUB_FLAGS", &GF_SUB__FLAGS ); @@ -4703,7 +4742,7 @@ static Int InitLibrary ( StructInitInfo * module ) static StructInitInfo module = { .type = MODULE_STATIC, .name = "GAPROOT/lib/oper1.g", - .crc = -43761536, + .crc = -6572452, .initKernel = InitKernel, .initLibrary = InitLibrary, .postRestore = PostRestore, diff --git a/hpcgap/src/c_type1.c b/hpcgap/src/c_type1.c index fb6d53bc1f..109fb1410f 100644 --- a/hpcgap/src/c_type1.c +++ b/hpcgap/src/c_type1.c @@ -3575,10 +3575,10 @@ static Obj HdlrFunc1 ( CHANGED_BAG( STATE(CurrLVars) ); CALL_1ARGS( t_1, t_2 ); - /* LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + (4 + 2); */ + /* LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + (5 + 2); */ t_2 = GC_LENGTH__SETTER__METHODS__2; CHECK_BOUND( t_2, "LENGTH_SETTER_METHODS_2" ) - C_SUM_INTOBJS( t_3, INTOBJ_INT(4), INTOBJ_INT(2) ) + C_SUM_INTOBJS( t_3, INTOBJ_INT(5), INTOBJ_INT(2) ) C_SUM_FIA( t_1, t_2, t_3 ) AssGVar( G_LENGTH__SETTER__METHODS__2, t_1 ); diff --git a/lib/methsel.g b/lib/methsel.g index 156eda1466..46d9fb14d5 100644 --- a/lib/methsel.g +++ b/lib/methsel.g @@ -58,7 +58,9 @@ VMETHOD_PRINT_INFO := function ( methods, i, arity) local offset; offset := (arity+BASE_SIZE_METHODS_OPER_ENTRY)*(i-1)+arity; Print("#I ", methods[offset+4]); - if FILENAME_FUNC(methods[offset+2]) <> fail then + if BASE_SIZE_METHODS_OPER_ENTRY >= 5 then + Print(" at ", methods[offset+5][1], ":", methods[offset+5][2]); + elif FILENAME_FUNC(methods[offset+2]) <> fail then Print(" at ", FILENAME_FUNC(methods[offset+2]), ":", STARTLINE_FUNC(methods[offset+2])); @@ -74,7 +76,9 @@ NEXT_VMETHOD_PRINT_INFO := function ( methods, i, arity) local offset; offset := (arity+BASE_SIZE_METHODS_OPER_ENTRY)*(i-1)+arity; Print("#I Trying next: ", methods[offset+4]); - if FILENAME_FUNC(methods[offset+2]) <> fail then + if BASE_SIZE_METHODS_OPER_ENTRY >= 5 then + Print(" at ", methods[offset+5][1], ":", methods[offset+5][2]); + elif FILENAME_FUNC(methods[offset+2]) <> fail then Print(" at ", FILENAME_FUNC(methods[offset+2]), ":", STARTLINE_FUNC(methods[offset+2])); diff --git a/lib/methwhy.g b/lib/methwhy.g index 29f4ae6157..9cff6fdb2a 100644 --- a/lib/methwhy.g +++ b/lib/methwhy.g @@ -180,7 +180,9 @@ local oper,narg,args,skip,verbos,fams,flags,i,j,methods,flag,flag2, oper:=methods[offset+narg+2]; if verbos>1 then Print("#I Method ",i,": ``",nam,"''"); - if LocationFunc(oper) <> "" then + if BASE_SIZE_METHODS_OPER_ENTRY >= 5 then + Print(" at ", methods[offset+narg+5][1], ":", methods[offset+narg+5][2]); + elif LocationFunc(oper) <> "" then Print(" at ",LocationFunc(oper)); fi; Print(", value: "); @@ -214,7 +216,9 @@ local oper,narg,args,skip,verbos,fams,flags,i,j,methods,flag,flag2, oper:=methods[offset+j+1]; if verbos=1 then Print("#I Method ",i,": ``",nam,"''"); - if LocationFunc(oper) <> "" then + if BASE_SIZE_METHODS_OPER_ENTRY >= 5 then + Print(" at ", methods[offset+narg+5][1], ":", methods[offset+narg+5][2]); + elif LocationFunc(oper) <> "" then Print(" at ",LocationFunc(oper)); fi; Print(" , value: "); diff --git a/lib/oper1.g b/lib/oper1.g index 7697b2d280..44afb8918c 100644 --- a/lib/oper1.g +++ b/lib/oper1.g @@ -250,6 +250,9 @@ BIND_GLOBAL( "INSTALL_METHOD_FLAGS", methods[i+(narg+3)] := rank; methods[i+(narg+4)] := IMMUTABLE_COPY_OBJ(info); + if BASE_SIZE_METHODS_OPER_ENTRY >= 5 then + methods[i+(narg+5)] := MakeImmutable([INPUT_FILENAME(), INPUT_LINENUMBER()]); + fi; # flush the cache if IsHPCGAP then diff --git a/src/c_oper1.c b/src/c_oper1.c index 5deaba6653..faec2bc94e 100644 --- a/src/c_oper1.c +++ b/src/c_oper1.c @@ -1,7 +1,7 @@ #ifndef AVOID_PRECOMPILED /* C file produced by GAC */ #include -#define FILE_CRC "-43761536" +#define FILE_CRC "-6572452" /* global variables used in handlers */ static GVar G_REREADING; @@ -40,6 +40,10 @@ static GVar G_IS__IDENTICAL__OBJ; static Obj GF_IS__IDENTICAL__OBJ; static GVar G_MakeImmutable; static Obj GF_MakeImmutable; +static GVar G_INPUT__FILENAME; +static Obj GF_INPUT__FILENAME; +static GVar G_INPUT__LINENUMBER; +static Obj GF_INPUT__LINENUMBER; static GVar G_IS__OBJECT; static Obj GC_IS__OBJECT; static GVar G_TRY__NEXT__METHOD; @@ -738,8 +742,8 @@ static Obj HdlrFunc3 ( } if ( ! t_1 ) break; - /* i := i + (narg + 4); */ - C_SUM_FIA( t_2, l_narg, INTOBJ_INT(4) ) + /* i := i + (narg + 5); */ + C_SUM_FIA( t_2, l_narg, INTOBJ_INT(5) ) C_SUM_FIA( t_1, l_i, t_2 ) l_i = t_1; @@ -847,9 +851,9 @@ static Obj HdlrFunc3 ( } /* fi */ - /* k := k + narg + 4; */ + /* k := k + narg + 5; */ C_SUM_FIA( t_2, l_k, l_narg ) - C_SUM_FIA( t_1, t_2, INTOBJ_INT(4) ) + C_SUM_FIA( t_1, t_2, INTOBJ_INT(5) ) l_k = t_1; } @@ -872,11 +876,11 @@ static Obj HdlrFunc3 ( } if ( t_1 ) { - /* methods{[ narg + 4 + i + 1 .. narg + 4 + LEN_LIST( methods ) ]} := methods{[ i + 1 .. LEN_LIST( methods ) ]}; */ - C_SUM_FIA( t_4, l_narg, INTOBJ_INT(4) ) + /* methods{[ narg + 5 + i + 1 .. narg + 5 + LEN_LIST( methods ) ]} := methods{[ i + 1 .. LEN_LIST( methods ) ]}; */ + C_SUM_FIA( t_4, l_narg, INTOBJ_INT(5) ) C_SUM_FIA( t_3, t_4, l_i ) C_SUM_FIA( t_2, t_3, INTOBJ_INT(1) ) - C_SUM_FIA( t_4, l_narg, INTOBJ_INT(4) ) + C_SUM_FIA( t_4, l_narg, INTOBJ_INT(5) ) t_6 = GF_LEN__LIST; t_5 = CALL_1ARGS( t_6, l_methods ); CHECK_FUNC_RESULT( t_5 ) @@ -1153,6 +1157,34 @@ static Obj HdlrFunc3 ( CHECK_FUNC_RESULT( t_2 ) C_ASS_LIST_FPL( l_methods, t_1, t_2 ) + /* if 5 >= 5 then */ + t_1 = (Obj)(UInt)(((Int)INTOBJ_INT(5)) >= ((Int)INTOBJ_INT(5))); + if ( t_1 ) { + + /* methods[i + (narg + 5)] := MakeImmutable( [ INPUT_FILENAME( ), INPUT_LINENUMBER( ) ] ); */ + C_SUM_INTOBJS( t_2, l_narg, INTOBJ_INT(5) ) + C_SUM_FIA( t_1, l_i, t_2 ) + CHECK_INT_POS( t_1 ) + t_3 = GF_MakeImmutable; + t_4 = NEW_PLIST( T_PLIST, 2 ); + SET_LEN_PLIST( t_4, 2 ); + t_6 = GF_INPUT__FILENAME; + t_5 = CALL_0ARGS( t_6 ); + CHECK_FUNC_RESULT( t_5 ) + SET_ELM_PLIST( t_4, 1, t_5 ); + CHANGED_BAG( t_4 ); + t_6 = GF_INPUT__LINENUMBER; + t_5 = CALL_0ARGS( t_6 ); + CHECK_FUNC_RESULT( t_5 ) + SET_ELM_PLIST( t_4, 2, t_5 ); + CHANGED_BAG( t_4 ); + t_2 = CALL_1ARGS( t_3, t_4 ); + CHECK_FUNC_RESULT( t_2 ) + C_ASS_LIST_FPL( l_methods, t_1, t_2 ) + + } + /* fi */ + /* CHANGED_METHODS_OPERATION( opr, narg ); */ t_1 = GF_CHANGED__METHODS__OPERATION; CALL_2ARGS( t_1, a_opr, l_narg ); @@ -2451,8 +2483,8 @@ static Obj HdlrFunc7 ( t_6 = NewFunction( NameFunc[8], 1, 0, HdlrFunc8 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 622); - SET_ENDLINE_BODY(t_7, 640); + SET_STARTLINE_BODY(t_7, 625); + SET_ENDLINE_BODY(t_7, 643); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3055,8 +3087,8 @@ static Obj HdlrFunc11 ( t_1 = NewFunction( NameFunc[12], 1, 0, HdlrFunc12 ); SET_ENVI_FUNC( t_1, STATE(CurrLVars) ); t_2 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_2, 819); - SET_ENDLINE_BODY(t_2, 823); + SET_STARTLINE_BODY(t_2, 822); + SET_ENDLINE_BODY(t_2, 826); SET_FILENAME_BODY(t_2, FileName); SET_BODY_FUNC(t_1, t_2); CHANGED_BAG( STATE(CurrLVars) ); @@ -3135,8 +3167,8 @@ static Obj HdlrFunc11 ( t_6 = NewFunction( NameFunc[13], 1, 0, HdlrFunc13 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 840); - SET_ENDLINE_BODY(t_7, 840); + SET_STARTLINE_BODY(t_7, 843); + SET_ENDLINE_BODY(t_7, 843); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3198,8 +3230,8 @@ static Obj HdlrFunc11 ( t_6 = NewFunction( NameFunc[14], 2, 0, HdlrFunc14 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 862); - SET_ENDLINE_BODY(t_7, 885); + SET_STARTLINE_BODY(t_7, 865); + SET_ENDLINE_BODY(t_7, 888); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3247,8 +3279,8 @@ static Obj HdlrFunc11 ( t_6 = NewFunction( NameFunc[15], 2, 0, HdlrFunc15 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 895); - SET_ENDLINE_BODY(t_7, 903); + SET_STARTLINE_BODY(t_7, 898); + SET_ENDLINE_BODY(t_7, 906); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3309,8 +3341,8 @@ static Obj HdlrFunc11 ( t_6 = NewFunction( NameFunc[16], 3, 0, HdlrFunc16 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 912); - SET_ENDLINE_BODY(t_7, 925); + SET_STARTLINE_BODY(t_7, 915); + SET_ENDLINE_BODY(t_7, 928); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3683,8 +3715,8 @@ static Obj HdlrFunc17 ( t_4 = NewFunction( NameFunc[18], -1, 0, HdlrFunc18 ); SET_ENVI_FUNC( t_4, STATE(CurrLVars) ); t_5 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_5, 991); - SET_ENDLINE_BODY(t_5, 1007); + SET_STARTLINE_BODY(t_5, 994); + SET_ENDLINE_BODY(t_5, 1010); SET_FILENAME_BODY(t_5, FileName); SET_BODY_FUNC(t_4, t_5); CHANGED_BAG( STATE(CurrLVars) ); @@ -3810,7 +3842,7 @@ static Obj HdlrFunc1 ( fi; i := 0; while i < LEN_LIST( methods ) and rank < methods[i + (narg + 3)] do - i := i + (narg + 4); + i := i + (narg + 5); od; replace := false; if REREADING then @@ -3827,11 +3859,11 @@ static Obj HdlrFunc1 ( break; fi; fi; - k := k + narg + 4; + k := k + narg + 5; od; fi; if not REREADING or not replace then - methods{[ narg + 4 + i + 1 .. narg + 4 + LEN_LIST( methods ) ]} := methods{[ i + 1 .. LEN_LIST( methods ) ]}; + methods{[ narg + 5 + i + 1 .. narg + 5 + LEN_LIST( methods ) ]} := methods{[ i + 1 .. LEN_LIST( methods ) ]}; fi; if rel = true then methods[i + 1] := RETURN_TRUE; @@ -3868,6 +3900,9 @@ static Obj HdlrFunc1 ( fi; methods[i + (narg + 3)] := rank; methods[i + (narg + 4)] := IMMUTABLE_COPY_OBJ( info ); + if 5 >= 5 then + methods[i + (narg + 5)] := MakeImmutable( [ INPUT_FILENAME( ), INPUT_LINENUMBER( ) ] ); + fi; CHANGED_METHODS_OPERATION( opr, narg ); return; end ); */ @@ -3877,7 +3912,7 @@ static Obj HdlrFunc1 ( SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); SET_STARTLINE_BODY(t_4, 137); - SET_ENDLINE_BODY(t_4, 261); + SET_ENDLINE_BODY(t_4, 264); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -3892,8 +3927,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[4], -1, 0, HdlrFunc4 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 308); - SET_ENDLINE_BODY(t_4, 310); + SET_STARTLINE_BODY(t_4, 311); + SET_ENDLINE_BODY(t_4, 313); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -3908,8 +3943,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[5], -1, 0, HdlrFunc5 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 335); - SET_ENDLINE_BODY(t_4, 337); + SET_STARTLINE_BODY(t_4, 338); + SET_ENDLINE_BODY(t_4, 340); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4062,17 +4097,17 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[6], 2, 0, HdlrFunc6 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 348); - SET_ENDLINE_BODY(t_4, 559); + SET_STARTLINE_BODY(t_4, 351); + SET_ENDLINE_BODY(t_4, 562); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); CALL_2ARGS( t_1, t_2, t_3 ); - /* LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + (4 + 2); */ + /* LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + (5 + 2); */ t_2 = GC_LENGTH__SETTER__METHODS__2; CHECK_BOUND( t_2, "LENGTH_SETTER_METHODS_2" ) - C_SUM_INTOBJS( t_3, INTOBJ_INT(4), INTOBJ_INT(2) ) + C_SUM_INTOBJS( t_3, INTOBJ_INT(5), INTOBJ_INT(2) ) C_SUM_FIA( t_1, t_2, t_3 ) AssGVar( G_LENGTH__SETTER__METHODS__2, t_1 ); @@ -4123,8 +4158,8 @@ static Obj HdlrFunc1 ( t_2 = NewFunction( NameFunc[7], 6, 0, HdlrFunc7 ); SET_ENVI_FUNC( t_2, STATE(CurrLVars) ); t_3 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_3, 578); - SET_ENDLINE_BODY(t_3, 644); + SET_STARTLINE_BODY(t_3, 581); + SET_ENDLINE_BODY(t_3, 647); SET_FILENAME_BODY(t_3, FileName); SET_BODY_FUNC(t_2, t_3); CHANGED_BAG( STATE(CurrLVars) ); @@ -4138,8 +4173,8 @@ static Obj HdlrFunc1 ( t_2 = NewFunction( NameFunc[9], 6, 0, HdlrFunc9 ); SET_ENVI_FUNC( t_2, STATE(CurrLVars) ); t_3 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_3, 647); - SET_ENDLINE_BODY(t_3, 653); + SET_STARTLINE_BODY(t_3, 650); + SET_ENDLINE_BODY(t_3, 656); SET_FILENAME_BODY(t_3, FileName); SET_BODY_FUNC(t_2, t_3); CHANGED_BAG( STATE(CurrLVars) ); @@ -4167,8 +4202,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[10], 2, 0, HdlrFunc10 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 666); - SET_ENDLINE_BODY(t_4, 690); + SET_STARTLINE_BODY(t_4, 669); + SET_ENDLINE_BODY(t_4, 693); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4252,8 +4287,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[11], 4, 0, HdlrFunc11 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 815); - SET_ENDLINE_BODY(t_4, 926); + SET_STARTLINE_BODY(t_4, 818); + SET_ENDLINE_BODY(t_4, 929); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4304,8 +4339,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[17], -1, 0, HdlrFunc17 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 961); - SET_ENDLINE_BODY(t_4, 1008); + SET_STARTLINE_BODY(t_4, 964); + SET_ENDLINE_BODY(t_4, 1011); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4361,6 +4396,8 @@ static Int PostRestore ( StructInitInfo * module ) G_IMMUTABLE__COPY__OBJ = GVarName( "IMMUTABLE_COPY_OBJ" ); G_IS__IDENTICAL__OBJ = GVarName( "IS_IDENTICAL_OBJ" ); G_MakeImmutable = GVarName( "MakeImmutable" ); + G_INPUT__FILENAME = GVarName( "INPUT_FILENAME" ); + G_INPUT__LINENUMBER = GVarName( "INPUT_LINENUMBER" ); G_IS__OBJECT = GVarName( "IS_OBJECT" ); G_TRY__NEXT__METHOD = GVarName( "TRY_NEXT_METHOD" ); G_SUB__FLAGS = GVarName( "SUB_FLAGS" ); @@ -4471,6 +4508,8 @@ static Int InitKernel ( StructInitInfo * module ) InitFopyGVar( "IMMUTABLE_COPY_OBJ", &GF_IMMUTABLE__COPY__OBJ ); InitFopyGVar( "IS_IDENTICAL_OBJ", &GF_IS__IDENTICAL__OBJ ); InitFopyGVar( "MakeImmutable", &GF_MakeImmutable ); + InitFopyGVar( "INPUT_FILENAME", &GF_INPUT__FILENAME ); + InitFopyGVar( "INPUT_LINENUMBER", &GF_INPUT__LINENUMBER ); InitCopyGVar( "IS_OBJECT", &GC_IS__OBJECT ); InitCopyGVar( "TRY_NEXT_METHOD", &GC_TRY__NEXT__METHOD ); InitFopyGVar( "SUB_FLAGS", &GF_SUB__FLAGS ); @@ -4602,7 +4641,7 @@ static Int InitLibrary ( StructInitInfo * module ) static StructInitInfo module = { .type = MODULE_STATIC, .name = "GAPROOT/lib/oper1.g", - .crc = -43761536, + .crc = -6572452, .initKernel = InitKernel, .initLibrary = InitLibrary, .postRestore = PostRestore, diff --git a/src/c_type1.c b/src/c_type1.c index 5e74cda01a..90a33bf8e1 100644 --- a/src/c_type1.c +++ b/src/c_type1.c @@ -3362,10 +3362,10 @@ static Obj HdlrFunc1 ( CHANGED_BAG( STATE(CurrLVars) ); CALL_1ARGS( t_1, t_2 ); - /* LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + (4 + 2); */ + /* LENGTH_SETTER_METHODS_2 := LENGTH_SETTER_METHODS_2 + (5 + 2); */ t_2 = GC_LENGTH__SETTER__METHODS__2; CHECK_BOUND( t_2, "LENGTH_SETTER_METHODS_2" ) - C_SUM_INTOBJS( t_3, INTOBJ_INT(4), INTOBJ_INT(2) ) + C_SUM_INTOBJS( t_3, INTOBJ_INT(5), INTOBJ_INT(2) ) C_SUM_FIA( t_1, t_2, t_3 ) AssGVar( G_LENGTH__SETTER__METHODS__2, t_1 ); diff --git a/src/opers.c b/src/opers.c index f79297c11a..9470c70d64 100644 --- a/src/opers.c +++ b/src/opers.c @@ -2033,7 +2033,7 @@ static Obj NEXT_VMETHOD_PRINT_INFO; // Use of 'ALWAYS_INLINE' is critical for performance, see discussion // earlier in this file. enum { - BASE_SIZE_METHODS_OPER_ENTRY = 4, + BASE_SIZE_METHODS_OPER_ENTRY = 5, }; static ALWAYS_INLINE Obj GetMethodUncached( UInt verbose, UInt constructor, UInt n, Obj oper, Int prec, Obj types[]) @@ -2052,6 +2052,7 @@ static ALWAYS_INLINE Obj GetMethodUncached( // entry n+2 is the actual method // entry n+3 is the rank // entry n+4 is the info text + // entry n+5 is, if set, the location where the method was installed // check argument filters against the given types Obj filter; diff --git a/tst/test-error/trace.g.out b/tst/test-error/trace.g.out index 388b1ed3a9..f890879543 100644 --- a/tst/test-error/trace.g.out +++ b/tst/test-error/trace.g.out @@ -4,13 +4,13 @@ gap> InverseMutable(m); gap> TraceMethods(InverseMutable); gap> InverseMutable(m); -#I InverseMutable: for GF2 matrix at src/vecgf2.c:fail +#I InverseMutable: for GF2 matrix at GAPROOT/lib/vecmat.gi:832 gap> gap> AdditiveInverseMutable(m); gap> TraceMethods(AdditiveInverseMutable); gap> AdditiveInverseMutable(m); -#I AdditiveInverseMutable: for GF2 matrix at GAPROOT/lib/vecmat.gi:763 +#I AdditiveInverseMutable: for GF2 matrix at GAPROOT/lib/vecmat.gi:774 gap> QUIT; diff --git a/tst/testinstall/kernel/opers.tst b/tst/testinstall/kernel/opers.tst index 449eb4e819..f406f46a60 100644 --- a/tst/testinstall/kernel/opers.tst +++ b/tst/testinstall/kernel/opers.tst @@ -298,9 +298,6 @@ Error, `TraceMethods' require at least one argument gap> TraceMethods([ 1 ]); Error, must be an operation gap> TraceMethods( [ Size ] ); -gap> Size(g); -#I Size: system getter -6 gap> UntraceMethods( [ Size ] ); # temporarily override (NEXT_)VMETHOD_PRINT_INFO to avoid system @@ -310,10 +307,14 @@ gap> MakeReadWriteGlobal("NEXT_VMETHOD_PRINT_INFO"); gap> old1:=VMETHOD_PRINT_INFO;; gap> old2:=NEXT_VMETHOD_PRINT_INFO;; gap> VMETHOD_PRINT_INFO := function(methods, i, arity) -> Print("#I ", methods[(arity+4)*i], "\n"); +> local offset; +> offset := (arity+BASE_SIZE_METHODS_OPER_ENTRY)*(i-1)+arity; +> Print("#I ", methods[offset+4], "\n"); > end;; gap> NEXT_VMETHOD_PRINT_INFO := function(methods, i, arity) -> Print("#I Trying next: ", methods[(arity+4)*i], "\n"); +> local offset; +> offset := (arity+BASE_SIZE_METHODS_OPER_ENTRY)*(i-1)+arity; +> Print("#I Trying next: ", methods[offset+4], "\n"); > end;; # diff --git a/tst/testinstall/varargs.tst b/tst/testinstall/varargs.tst index f27b07c64c..0b19801756 100644 --- a/tst/testinstall/varargs.tst +++ b/tst/testinstall/varargs.tst @@ -87,7 +87,7 @@ function ( <>, <>, <>, <>, <>, <> ) end gap> Display(InstallMethod); function ( <>... ) - <> + <> end gap> [1..2]; [ 1, 2 ] From ecb57605d4017a996d7de3930bf4926dea316687 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 Apr 2018 15:07:57 +0200 Subject: [PATCH 4/5] Simplify INSTALL_IMMEDIATE_METHOD --- lib/oper.g | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/lib/oper.g b/lib/oper.g index fbb463479f..2952182537 100644 --- a/lib/oper.g +++ b/lib/oper.g @@ -361,15 +361,22 @@ BIND_GLOBAL( "INSTALL_IMMEDIATE_METHOD", #T (This would make an if statement in `RunImmediateMethods' unnecessary!) # Find the place to put the new method. - if not IsBound( IMMEDIATES[j] ) then - if IsHPCGAP then - IMMEDIATES[j]:= MakeImmutable([]); + if not IsHPCGAP then + if IsBound( IMMEDIATES[j] ) then + imm := IMMEDIATES[j]; else - IMMEDIATES[j]:= []; + imm := []; + IMMEDIATES[j] := imm; + fi; + else + if IsBound( IMMEDIATES[j] ) then + imm := SHALLOW_COPY_OBJ(IMMEDIATES[j]); + else + imm := []; fi; fi; i := 0; - while i < LEN_LIST(IMMEDIATES[j]) and rank < IMMEDIATES[j][i+5] do + while i < LEN_LIST(imm) and rank < imm[i+5] do i := i + 7; od; @@ -377,11 +384,9 @@ BIND_GLOBAL( "INSTALL_IMMEDIATE_METHOD", if REREADING then replace := false; k := i; - while k < LEN_LIST(IMMEDIATES[j]) and - rank = IMMEDIATES[j][k+5] do - if info = IMMEDIATES[j][k+7] and - oper = IMMEDIATES[j][k+1] and - FLAGS_FILTER( filter ) = IMMEDIATES[j][k+4] then + while k < LEN_LIST(imm) and rank = imm[k+5] do + if info = imm[k+7] and oper = imm[k+1] and + FLAGS_FILTER( filter ) = imm[k+4] then replace := true; i := k; break; @@ -391,12 +396,6 @@ BIND_GLOBAL( "INSTALL_IMMEDIATE_METHOD", fi; # push the other functions back - imm:=IMMEDIATES[j]; - if IsHPCGAP then - # ShallowCopy is not bound yet, so we take a sublist - imm:=imm{[1..LEN_LIST(IMMEDIATES[j])]}; - fi; - if not REREADING or not replace then imm{[i+8..7+LEN_LIST(imm)]} := imm{[i+1..LEN_LIST(imm)]}; fi; From feb533df572189d1c5fcaba61b96fc6b81b4466d Mon Sep 17 00:00:00 2001 From: Max Horn Date: Mon, 23 Apr 2018 15:22:05 +0200 Subject: [PATCH 5/5] 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 [ ] --- hpcgap/src/c_oper1.c | 239 +++++++++++++++---------- lib/oper.g | 15 +- lib/oper1.g | 21 ++- src/c_oper1.c | 239 +++++++++++++++---------- tst/test-error/trace.g | 5 + tst/test-error/trace.g.out | 8 + tst/testinstall/opers/LocationFunc.tst | 2 +- tst/testinstall/varargs.tst | 4 +- 8 files changed, 329 insertions(+), 204 deletions(-) diff --git a/hpcgap/src/c_oper1.c b/hpcgap/src/c_oper1.c index e82441edc0..10f7a47d2a 100644 --- a/hpcgap/src/c_oper1.c +++ b/hpcgap/src/c_oper1.c @@ -1,7 +1,7 @@ #ifndef AVOID_PRECOMPILED /* C file produced by GAC */ #include -#define FILE_CRC "-6572452" +#define FILE_CRC "-121710233" /* global variables used in handlers */ static GVar G_REREADING; @@ -98,6 +98,8 @@ static GVar G_UNLOCK; static Obj GF_UNLOCK; static GVar G_MakeReadOnlySingleObj; static Obj GF_MakeReadOnlySingleObj; +static GVar G_RUN__IMMEDIATE__METHODS__RUNS; +static Obj GC_RUN__IMMEDIATE__METHODS__RUNS; static GVar G_RUN__IMMEDIATE__METHODS__CHECKS; static Obj GC_RUN__IMMEDIATE__METHODS__CHECKS; static GVar G_RUN__IMMEDIATE__METHODS__HITS; @@ -108,12 +110,14 @@ static GVar G_IGNORE__IMMEDIATE__METHODS; static Obj GC_IGNORE__IMMEDIATE__METHODS; static GVar G_IMM__FLAGS; static Obj GC_IMM__FLAGS; +static GVar G_TRACE__IMMEDIATE__METHODS; +static Obj GC_TRACE__IMMEDIATE__METHODS; static GVar G_IMMEDIATES; static Obj GC_IMMEDIATES; +static GVar G_SIZE__IMMEDIATE__METHOD__ENTRY; +static Obj GC_SIZE__IMMEDIATE__METHOD__ENTRY; static GVar G_IMMEDIATE__METHODS; static Obj GC_IMMEDIATE__METHODS; -static GVar G_TRACE__IMMEDIATE__METHODS; -static Obj GC_TRACE__IMMEDIATE__METHODS; static GVar G_NewSpecialRegion; static Obj GF_NewSpecialRegion; static GVar G_METHODS__OPERATION__REGION; @@ -194,7 +198,9 @@ static Obj HdlrFunc2 ( Obj l_j = 0; Obj l_imm = 0; Obj l_i = 0; + Obj l_meth = 0; Obj l_res = 0; + Obj l_loc = 0; Obj l_newflags = 0; Obj t_1 = 0; Obj t_2 = 0; @@ -219,7 +225,9 @@ static Obj HdlrFunc2 ( (void)l_j; (void)l_imm; (void)l_i; + (void)l_meth; (void)l_res; + (void)l_loc; (void)l_newflags; Bag oldFrame; OLD_BRK_CURR_STAT @@ -294,6 +302,27 @@ static Obj HdlrFunc2 ( C_ELM_POSOBJ_NLE( t_1, l_type, 2 ); a_flags = t_1; + /* RUN_IMMEDIATE_METHODS_RUNS := RUN_IMMEDIATE_METHODS_RUNS + 1; */ + t_2 = GC_RUN__IMMEDIATE__METHODS__RUNS; + CHECK_BOUND( t_2, "RUN_IMMEDIATE_METHODS_RUNS" ) + C_SUM_FIA( t_1, t_2, INTOBJ_INT(1) ) + AssGVar( G_RUN__IMMEDIATE__METHODS__RUNS, t_1 ); + + /* if TRACE_IMMEDIATE_METHODS then */ + t_2 = GC_TRACE__IMMEDIATE__METHODS; + CHECK_BOUND( t_2, "TRACE_IMMEDIATE_METHODS" ) + CHECK_BOOL( t_2 ) + t_1 = (Obj)(UInt)(t_2 != False); + if ( t_1 ) { + + /* Print( "#I RunImmediateMethods\n" ); */ + t_1 = GF_Print; + t_2 = MakeString( "#I RunImmediateMethods\n" ); + CALL_1ARGS( t_1, t_2 ); + + } + /* fi */ + /* for j in flagspos do */ t_4 = l_flagspos; if ( IS_SMALL_LIST(t_4) ) { @@ -331,12 +360,16 @@ static Obj HdlrFunc2 ( C_ELM_LIST_FPL( t_5, t_6, l_j ) l_imm = t_5; - /* for i in [ 0, 7 .. LEN_LIST( imm ) - 7 ] do */ - t_11 = GF_LEN__LIST; - t_10 = CALL_1ARGS( t_11, l_imm ); - CHECK_FUNC_RESULT( t_10 ) - C_DIFF_FIA( t_9, t_10, INTOBJ_INT(7) ) - t_8 = Range3Check( INTOBJ_INT(0), INTOBJ_INT(7), t_9 ); + /* for i in [ 0, SIZE_IMMEDIATE_METHOD_ENTRY .. LEN_LIST( imm ) - SIZE_IMMEDIATE_METHOD_ENTRY ] do */ + t_9 = GC_SIZE__IMMEDIATE__METHOD__ENTRY; + CHECK_BOUND( t_9, "SIZE_IMMEDIATE_METHOD_ENTRY" ) + t_12 = GF_LEN__LIST; + t_11 = CALL_1ARGS( t_12, l_imm ); + CHECK_FUNC_RESULT( t_11 ) + t_12 = GC_SIZE__IMMEDIATE__METHOD__ENTRY; + CHECK_BOUND( t_12, "SIZE_IMMEDIATE_METHOD_ENTRY" ) + C_DIFF_FIA( t_10, t_11, t_12 ) + t_8 = Range3Check( INTOBJ_INT(0), t_9, t_10 ); if ( IS_SMALL_LIST(t_8) ) { t_7 = (Obj)(UInt)1; t_5 = INTOBJ_INT(1); @@ -391,16 +424,19 @@ static Obj HdlrFunc2 ( } if ( t_9 ) { - /* res := IMMEDIATE_METHODS[imm[i + 6]]( obj ); */ - t_11 = GC_IMMEDIATE__METHODS; - CHECK_BOUND( t_11, "IMMEDIATE_METHODS" ) - C_SUM_FIA( t_13, l_i, INTOBJ_INT(6) ) - CHECK_INT_POS( t_13 ) - C_ELM_LIST_FPL( t_12, l_imm, t_13 ) + /* meth := IMMEDIATE_METHODS[imm[i + 6]]; */ + t_10 = GC_IMMEDIATE__METHODS; + CHECK_BOUND( t_10, "IMMEDIATE_METHODS" ) + C_SUM_FIA( t_12, l_i, INTOBJ_INT(6) ) CHECK_INT_POS( t_12 ) - C_ELM_LIST_FPL( t_10, t_11, t_12 ) - CHECK_FUNC( t_10 ) - t_9 = CALL_1ARGS( t_10, a_obj ); + C_ELM_LIST_FPL( t_11, l_imm, t_12 ) + CHECK_INT_POS( t_11 ) + C_ELM_LIST_FPL( t_9, t_10, t_11 ) + l_meth = t_9; + + /* res := meth( obj ); */ + CHECK_FUNC( l_meth ) + t_9 = CALL_1ARGS( l_meth, a_obj ); CHECK_FUNC_RESULT( t_9 ) l_res = t_9; @@ -424,50 +460,51 @@ static Obj HdlrFunc2 ( t_9 = (Obj)(UInt)(t_10 != False); if ( t_9 ) { - /* if imm[i + 7] = false then */ + /* Print( "#I immediate: ", NAME_FUNC( imm[i + 1] ) ); */ + t_9 = GF_Print; + t_10 = MakeString( "#I immediate: " ); + t_12 = GF_NAME__FUNC; + C_SUM_FIA( t_14, l_i, INTOBJ_INT(1) ) + CHECK_INT_POS( t_14 ) + C_ELM_LIST_FPL( t_13, l_imm, t_14 ) + t_11 = CALL_1ARGS( t_12, t_13 ); + CHECK_FUNC_RESULT( t_11 ) + CALL_2ARGS( t_9, t_10, t_11 ); + + /* if imm[i + 7] <> false then */ C_SUM_FIA( t_11, l_i, INTOBJ_INT(7) ) CHECK_INT_POS( t_11 ) C_ELM_LIST_FPL( t_10, l_imm, t_11 ) t_11 = False; - t_9 = (Obj)(UInt)(EQ( t_10, t_11 )); + t_9 = (Obj)(UInt)( ! EQ( t_10, t_11 )); if ( t_9 ) { - /* Print( "#I immediate: ", NAME_FUNC( imm[i + 1] ), "\n" ); */ - t_9 = GF_Print; - t_10 = MakeString( "#I immediate: " ); - t_12 = GF_NAME__FUNC; - C_SUM_FIA( t_14, l_i, INTOBJ_INT(1) ) - CHECK_INT_POS( t_14 ) - C_ELM_LIST_FPL( t_13, l_imm, t_14 ) - t_11 = CALL_1ARGS( t_12, t_13 ); - CHECK_FUNC_RESULT( t_11 ) - t_12 = MakeString( "\n" ); - CALL_3ARGS( t_9, t_10, t_11, t_12 ); - - } - - /* else */ - else { - - /* Print( "#I immediate: ", NAME_FUNC( imm[i + 1] ), ": ", imm[i + 7], "\n" ); */ + /* Print( ": ", imm[i + 7] ); */ t_9 = GF_Print; - t_10 = MakeString( "#I immediate: " ); - t_12 = GF_NAME__FUNC; - C_SUM_FIA( t_14, l_i, INTOBJ_INT(1) ) - CHECK_INT_POS( t_14 ) - C_ELM_LIST_FPL( t_13, l_imm, t_14 ) - t_11 = CALL_1ARGS( t_12, t_13 ); - CHECK_FUNC_RESULT( t_11 ) - t_12 = MakeString( ": " ); - C_SUM_FIA( t_14, l_i, INTOBJ_INT(7) ) - CHECK_INT_POS( t_14 ) - C_ELM_LIST_FPL( t_13, l_imm, t_14 ) - t_14 = MakeString( "\n" ); - CALL_5ARGS( t_9, t_10, t_11, t_12, t_13, t_14 ); + t_10 = MakeString( ": " ); + C_SUM_FIA( t_12, l_i, INTOBJ_INT(7) ) + CHECK_INT_POS( t_12 ) + C_ELM_LIST_FPL( t_11, l_imm, t_12 ) + CALL_2ARGS( t_9, t_10, t_11 ); } /* fi */ + /* Print( " at ", imm[i + 8][1], ":", imm[i + 8][2], "\n" ); */ + t_9 = GF_Print; + t_10 = MakeString( " at " ); + C_SUM_FIA( t_13, l_i, INTOBJ_INT(8) ) + CHECK_INT_POS( t_13 ) + C_ELM_LIST_FPL( t_12, l_imm, t_13 ) + C_ELM_LIST_FPL( t_11, t_12, INTOBJ_INT(1) ) + t_12 = MakeString( ":" ); + C_SUM_FIA( t_15, l_i, INTOBJ_INT(8) ) + CHECK_INT_POS( t_15 ) + C_ELM_LIST_FPL( t_14, l_imm, t_15 ) + C_ELM_LIST_FPL( t_13, t_14, INTOBJ_INT(2) ) + t_14 = MakeString( "\n" ); + CALL_5ARGS( t_9, t_10, t_11, t_12, t_13, t_14 ); + } /* fi */ @@ -2546,8 +2583,8 @@ static Obj HdlrFunc7 ( t_6 = NewFunction( NameFunc[8], 1, 0, HdlrFunc8 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 625); - SET_ENDLINE_BODY(t_7, 643); + SET_STARTLINE_BODY(t_7, 634); + SET_ENDLINE_BODY(t_7, 652); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3150,8 +3187,8 @@ static Obj HdlrFunc11 ( t_1 = NewFunction( NameFunc[12], 1, 0, HdlrFunc12 ); SET_ENVI_FUNC( t_1, STATE(CurrLVars) ); t_2 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_2, 822); - SET_ENDLINE_BODY(t_2, 826); + SET_STARTLINE_BODY(t_2, 831); + SET_ENDLINE_BODY(t_2, 835); SET_FILENAME_BODY(t_2, FileName); SET_BODY_FUNC(t_1, t_2); CHANGED_BAG( STATE(CurrLVars) ); @@ -3230,8 +3267,8 @@ static Obj HdlrFunc11 ( t_6 = NewFunction( NameFunc[13], 1, 0, HdlrFunc13 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 843); - SET_ENDLINE_BODY(t_7, 843); + SET_STARTLINE_BODY(t_7, 852); + SET_ENDLINE_BODY(t_7, 852); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3305,8 +3342,8 @@ static Obj HdlrFunc11 ( t_6 = NewFunction( NameFunc[14], 2, 0, HdlrFunc14 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 865); - SET_ENDLINE_BODY(t_7, 888); + SET_STARTLINE_BODY(t_7, 874); + SET_ENDLINE_BODY(t_7, 897); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3354,8 +3391,8 @@ static Obj HdlrFunc11 ( t_6 = NewFunction( NameFunc[15], 2, 0, HdlrFunc15 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 898); - SET_ENDLINE_BODY(t_7, 906); + SET_STARTLINE_BODY(t_7, 907); + SET_ENDLINE_BODY(t_7, 915); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3416,8 +3453,8 @@ static Obj HdlrFunc11 ( t_6 = NewFunction( NameFunc[16], 3, 0, HdlrFunc16 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 915); - SET_ENDLINE_BODY(t_7, 928); + SET_STARTLINE_BODY(t_7, 924); + SET_ENDLINE_BODY(t_7, 937); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3790,8 +3827,8 @@ static Obj HdlrFunc17 ( t_4 = NewFunction( NameFunc[18], -1, 0, HdlrFunc18 ); SET_ENVI_FUNC( t_4, STATE(CurrLVars) ); t_5 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_5, 994); - SET_ENDLINE_BODY(t_5, 1010); + SET_STARTLINE_BODY(t_5, 1003); + SET_ENDLINE_BODY(t_5, 1019); SET_FILENAME_BODY(t_5, FileName); SET_BODY_FUNC(t_4, t_5); CHANGED_BAG( STATE(CurrLVars) ); @@ -3826,6 +3863,9 @@ static Obj HdlrFunc1 ( REM_BRK_CURR_STAT(); SET_BRK_CURR_STAT(0); + /* RUN_IMMEDIATE_METHODS_RUNS := 0; */ + AssGVar( G_RUN__IMMEDIATE__METHODS__RUNS, INTOBJ_INT(0) ); + /* RUN_IMMEDIATE_METHODS_CHECKS := 0; */ AssGVar( G_RUN__IMMEDIATE__METHODS__CHECKS, INTOBJ_INT(0) ); @@ -3833,7 +3873,7 @@ static Obj HdlrFunc1 ( AssGVar( G_RUN__IMMEDIATE__METHODS__HITS, INTOBJ_INT(0) ); /* BIND_GLOBAL( "RunImmediateMethods", function ( obj, flags ) - local flagspos, tried, type, j, imm, i, res, newflags; + local flagspos, tried, type, j, imm, i, meth, res, loc, newflags; if IGNORE_IMMEDIATE_METHODS then return; fi; @@ -3845,20 +3885,25 @@ static Obj HdlrFunc1 ( tried := [ ]; type := TYPE_OBJ( obj ); flags := type![2]; + RUN_IMMEDIATE_METHODS_RUNS := RUN_IMMEDIATE_METHODS_RUNS + 1; + if TRACE_IMMEDIATE_METHODS then + Print( "#I RunImmediateMethods\n" ); + fi; for j in flagspos do if IsBound( IMMEDIATES[j] ) then imm := IMMEDIATES[j]; - for i in [ 0, 7 .. LEN_LIST( imm ) - 7 ] do + for i in [ 0, SIZE_IMMEDIATE_METHOD_ENTRY .. LEN_LIST( imm ) - SIZE_IMMEDIATE_METHOD_ENTRY ] do if IS_SUBSET_FLAGS( flags, imm[i + 4] ) and not IS_SUBSET_FLAGS( flags, imm[i + 3] ) and not imm[i + 6] in tried then - res := IMMEDIATE_METHODS[imm[i + 6]]( obj ); + meth := IMMEDIATE_METHODS[imm[i + 6]]; + res := meth( obj ); ADD_LIST( tried, imm[i + 6] ); RUN_IMMEDIATE_METHODS_CHECKS := RUN_IMMEDIATE_METHODS_CHECKS + 1; if TRACE_IMMEDIATE_METHODS then - if imm[i + 7] = false then - Print( "#I immediate: ", NAME_FUNC( imm[i + 1] ), "\n" ); - else - Print( "#I immediate: ", NAME_FUNC( imm[i + 1] ), ": ", imm[i + 7], "\n" ); + Print( "#I immediate: ", NAME_FUNC( imm[i + 1] ) ); + if imm[i + 7] <> false then + Print( ": ", imm[i + 7] ); fi; + Print( " at ", imm[i + 8][1], ":", imm[i + 8][2], "\n" ); fi; if res <> TRY_NEXT_METHOD then IGNORE_IMMEDIATE_METHODS := true; @@ -3884,8 +3929,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[2], 2, 0, HdlrFunc2 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 26); - SET_ENDLINE_BODY(t_4, 117); + SET_STARTLINE_BODY(t_4, 27); + SET_ENDLINE_BODY(t_4, 126); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -3996,8 +4041,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[3], 6, 0, HdlrFunc3 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 137); - SET_ENDLINE_BODY(t_4, 264); + SET_STARTLINE_BODY(t_4, 146); + SET_ENDLINE_BODY(t_4, 273); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4012,8 +4057,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[4], -1, 0, HdlrFunc4 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 311); - SET_ENDLINE_BODY(t_4, 313); + SET_STARTLINE_BODY(t_4, 320); + SET_ENDLINE_BODY(t_4, 322); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4028,8 +4073,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[5], -1, 0, HdlrFunc5 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 338); - SET_ENDLINE_BODY(t_4, 340); + SET_STARTLINE_BODY(t_4, 347); + SET_ENDLINE_BODY(t_4, 349); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4182,8 +4227,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[6], 2, 0, HdlrFunc6 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 351); - SET_ENDLINE_BODY(t_4, 562); + SET_STARTLINE_BODY(t_4, 360); + SET_ENDLINE_BODY(t_4, 571); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4243,8 +4288,8 @@ static Obj HdlrFunc1 ( t_2 = NewFunction( NameFunc[7], 6, 0, HdlrFunc7 ); SET_ENVI_FUNC( t_2, STATE(CurrLVars) ); t_3 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_3, 581); - SET_ENDLINE_BODY(t_3, 647); + SET_STARTLINE_BODY(t_3, 590); + SET_ENDLINE_BODY(t_3, 656); SET_FILENAME_BODY(t_3, FileName); SET_BODY_FUNC(t_2, t_3); CHANGED_BAG( STATE(CurrLVars) ); @@ -4258,8 +4303,8 @@ static Obj HdlrFunc1 ( t_2 = NewFunction( NameFunc[9], 6, 0, HdlrFunc9 ); SET_ENVI_FUNC( t_2, STATE(CurrLVars) ); t_3 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_3, 650); - SET_ENDLINE_BODY(t_3, 656); + SET_STARTLINE_BODY(t_3, 659); + SET_ENDLINE_BODY(t_3, 665); SET_FILENAME_BODY(t_3, FileName); SET_BODY_FUNC(t_2, t_3); CHANGED_BAG( STATE(CurrLVars) ); @@ -4287,8 +4332,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[10], 2, 0, HdlrFunc10 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 669); - SET_ENDLINE_BODY(t_4, 693); + SET_STARTLINE_BODY(t_4, 678); + SET_ENDLINE_BODY(t_4, 702); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4372,8 +4417,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[11], 4, 0, HdlrFunc11 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 818); - SET_ENDLINE_BODY(t_4, 929); + SET_STARTLINE_BODY(t_4, 827); + SET_ENDLINE_BODY(t_4, 938); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4424,8 +4469,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[17], -1, 0, HdlrFunc17 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 964); - SET_ENDLINE_BODY(t_4, 1011); + SET_STARTLINE_BODY(t_4, 973); + SET_ENDLINE_BODY(t_4, 1020); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4510,14 +4555,16 @@ static Int PostRestore ( StructInitInfo * module ) G_READ__LOCK = GVarName( "READ_LOCK" ); G_UNLOCK = GVarName( "UNLOCK" ); G_MakeReadOnlySingleObj = GVarName( "MakeReadOnlySingleObj" ); + G_RUN__IMMEDIATE__METHODS__RUNS = GVarName( "RUN_IMMEDIATE_METHODS_RUNS" ); G_RUN__IMMEDIATE__METHODS__CHECKS = GVarName( "RUN_IMMEDIATE_METHODS_CHECKS" ); G_RUN__IMMEDIATE__METHODS__HITS = GVarName( "RUN_IMMEDIATE_METHODS_HITS" ); G_BIND__GLOBAL = GVarName( "BIND_GLOBAL" ); G_IGNORE__IMMEDIATE__METHODS = GVarName( "IGNORE_IMMEDIATE_METHODS" ); G_IMM__FLAGS = GVarName( "IMM_FLAGS" ); + G_TRACE__IMMEDIATE__METHODS = GVarName( "TRACE_IMMEDIATE_METHODS" ); G_IMMEDIATES = GVarName( "IMMEDIATES" ); + G_SIZE__IMMEDIATE__METHOD__ENTRY = GVarName( "SIZE_IMMEDIATE_METHOD_ENTRY" ); G_IMMEDIATE__METHODS = GVarName( "IMMEDIATE_METHODS" ); - G_TRACE__IMMEDIATE__METHODS = GVarName( "TRACE_IMMEDIATE_METHODS" ); G_NewSpecialRegion = GVarName( "NewSpecialRegion" ); G_METHODS__OPERATION__REGION = GVarName( "METHODS_OPERATION_REGION" ); G_RankFilter = GVarName( "RankFilter" ); @@ -4630,14 +4677,16 @@ static Int InitKernel ( StructInitInfo * module ) InitFopyGVar( "READ_LOCK", &GF_READ__LOCK ); InitFopyGVar( "UNLOCK", &GF_UNLOCK ); InitFopyGVar( "MakeReadOnlySingleObj", &GF_MakeReadOnlySingleObj ); + InitCopyGVar( "RUN_IMMEDIATE_METHODS_RUNS", &GC_RUN__IMMEDIATE__METHODS__RUNS ); InitCopyGVar( "RUN_IMMEDIATE_METHODS_CHECKS", &GC_RUN__IMMEDIATE__METHODS__CHECKS ); InitCopyGVar( "RUN_IMMEDIATE_METHODS_HITS", &GC_RUN__IMMEDIATE__METHODS__HITS ); InitFopyGVar( "BIND_GLOBAL", &GF_BIND__GLOBAL ); InitCopyGVar( "IGNORE_IMMEDIATE_METHODS", &GC_IGNORE__IMMEDIATE__METHODS ); InitCopyGVar( "IMM_FLAGS", &GC_IMM__FLAGS ); + InitCopyGVar( "TRACE_IMMEDIATE_METHODS", &GC_TRACE__IMMEDIATE__METHODS ); InitCopyGVar( "IMMEDIATES", &GC_IMMEDIATES ); + InitCopyGVar( "SIZE_IMMEDIATE_METHOD_ENTRY", &GC_SIZE__IMMEDIATE__METHOD__ENTRY ); InitCopyGVar( "IMMEDIATE_METHODS", &GC_IMMEDIATE__METHODS ); - InitCopyGVar( "TRACE_IMMEDIATE_METHODS", &GC_TRACE__IMMEDIATE__METHODS ); InitFopyGVar( "NewSpecialRegion", &GF_NewSpecialRegion ); InitCopyGVar( "METHODS_OPERATION_REGION", &GC_METHODS__OPERATION__REGION ); InitFopyGVar( "RankFilter", &GF_RankFilter ); @@ -4742,7 +4791,7 @@ static Int InitLibrary ( StructInitInfo * module ) static StructInitInfo module = { .type = MODULE_STATIC, .name = "GAPROOT/lib/oper1.g", - .crc = -6572452, + .crc = -121710233, .initKernel = InitKernel, .initLibrary = InitLibrary, .postRestore = PostRestore, diff --git a/lib/oper.g b/lib/oper.g index 2952182537..4c84b3bb64 100644 --- a/lib/oper.g +++ b/lib/oper.g @@ -256,6 +256,7 @@ IGNORE_IMMEDIATE_METHODS := false; ## ## ## +BIND_CONSTANT("SIZE_IMMEDIATE_METHOD_ENTRY", 8); BIND_GLOBAL( "INSTALL_IMMEDIATE_METHOD", function( oper, info, filter, rank, method ) @@ -377,7 +378,7 @@ BIND_GLOBAL( "INSTALL_IMMEDIATE_METHOD", fi; i := 0; while i < LEN_LIST(imm) and rank < imm[i+5] do - i := i + 7; + i := i + SIZE_IMMEDIATE_METHOD_ENTRY; od; # Now is a good time to see if the method is already there @@ -391,13 +392,13 @@ BIND_GLOBAL( "INSTALL_IMMEDIATE_METHOD", i := k; break; fi; - k := k+7; + k := k+SIZE_IMMEDIATE_METHOD_ENTRY; od; fi; # push the other functions back if not REREADING or not replace then - imm{[i+8..7+LEN_LIST(imm)]} := imm{[i+1..LEN_LIST(imm)]}; + imm{[SIZE_IMMEDIATE_METHOD_ENTRY+i+1..SIZE_IMMEDIATE_METHOD_ENTRY+LEN_LIST(imm)]} := imm{[i+1..LEN_LIST(imm)]}; fi; # install the new method @@ -408,6 +409,9 @@ BIND_GLOBAL( "INSTALL_IMMEDIATE_METHOD", imm[i+5] := rank; imm[i+6] := pos; imm[i+7] := IMMUTABLE_COPY_OBJ(info); + if SIZE_IMMEDIATE_METHOD_ENTRY >= 8 then + imm[i+8] := MakeImmutable([INPUT_FILENAME(), INPUT_LINENUMBER()]); + fi; if IsHPCGAP then IMMEDIATES[j]:=MakeImmutable(imm); @@ -553,9 +557,10 @@ end ); ## , or ## with flag equal false turns tracing off. ## (There is no facility to trace specific immediate methods.) -## TraceImmediateMethods( ); ## gap> g:= Group( (1,2,3), (1,2) );; +## #I RunImmediateMethods ## #I immediate: Size ## #I immediate: IsCyclic ## #I immediate: IsCommutative @@ -573,7 +578,7 @@ end ); ## 6 ## gap> UntraceImmediateMethods( ); ## gap> UntraceMethods( [ Size ] ); -## ]]> +## ]]> ##

## This example gives an explanation for the two calls of the ## system getter for . diff --git a/lib/oper1.g b/lib/oper1.g index 44afb8918c..d286a56c14 100644 --- a/lib/oper1.g +++ b/lib/oper1.g @@ -20,6 +20,7 @@ ## have been discovered recently. ## So possible consequences of other filters are not checked. ## +RUN_IMMEDIATE_METHODS_RUNS := 0; RUN_IMMEDIATE_METHODS_CHECKS := 0; RUN_IMMEDIATE_METHODS_HITS := 0; @@ -31,7 +32,9 @@ BIND_GLOBAL( "RunImmediateMethods", function ( obj, flags ) j, # loop over `flagspos' imm, # immediate methods for filter `j' i, # loop over `imm' + meth, res, # result of an immediate method + loc, newflags; # newly found filters # Avoid recursive calls from inside a setter, @@ -49,6 +52,11 @@ BIND_GLOBAL( "RunImmediateMethods", function ( obj, flags ) type := TYPE_OBJ( obj ); flags := type![2]; + RUN_IMMEDIATE_METHODS_RUNS := RUN_IMMEDIATE_METHODS_RUNS + 1; + if TRACE_IMMEDIATE_METHODS then + Print( "#I RunImmediateMethods\n"); + fi; + # Check the immediate methods for all in `flagspos'. # (Note that new information is handled via appending to that list.) for j in flagspos do @@ -63,7 +71,7 @@ BIND_GLOBAL( "RunImmediateMethods", function ( obj, flags ) if IsBound( IMMEDIATES[j] ) then #T the `if' statement can disappear when `IMM_FLAGS' is improved ... imm := IMMEDIATES[j]; - for i in [ 0, 7 .. LEN_LIST(imm)-7 ] do + for i in [ 0, SIZE_IMMEDIATE_METHOD_ENTRY .. LEN_LIST(imm)-SIZE_IMMEDIATE_METHOD_ENTRY ] do if IS_SUBSET_FLAGS( flags, imm[i+4] ) and not IS_SUBSET_FLAGS( flags, imm[i+3] ) @@ -71,16 +79,17 @@ BIND_GLOBAL( "RunImmediateMethods", function ( obj, flags ) then # Call the method, and store that it was used. - res := IMMEDIATE_METHODS[ imm[i+6] ]( obj ); + meth := IMMEDIATE_METHODS[ imm[i+6] ]; + res := meth( obj ); ADD_LIST( tried, imm[i+6] ); RUN_IMMEDIATE_METHODS_CHECKS := RUN_IMMEDIATE_METHODS_CHECKS+1; if TRACE_IMMEDIATE_METHODS then - if imm[i+7] = false then - Print( "#I immediate: ", NAME_FUNC( imm[i+1] ), "\n"); - else - Print( "#I immediate: ", NAME_FUNC( imm[i+1] ), ": ", imm[i+7], "\n" ); + Print( "#I immediate: ", NAME_FUNC( imm[i+1] )); + if imm[i+7] <> false then + Print( ": ", imm[i+7] ); fi; + Print(" at ", imm[i+8][1], ":", imm[i+8][2], "\n"); fi; if res <> TRY_NEXT_METHOD then diff --git a/src/c_oper1.c b/src/c_oper1.c index faec2bc94e..429320c793 100644 --- a/src/c_oper1.c +++ b/src/c_oper1.c @@ -1,7 +1,7 @@ #ifndef AVOID_PRECOMPILED /* C file produced by GAC */ #include -#define FILE_CRC "-6572452" +#define FILE_CRC "-121710233" /* global variables used in handlers */ static GVar G_REREADING; @@ -90,6 +90,8 @@ static GVar G_Print; static Obj GF_Print; static GVar G_ViewObj; static Obj GC_ViewObj; +static GVar G_RUN__IMMEDIATE__METHODS__RUNS; +static Obj GC_RUN__IMMEDIATE__METHODS__RUNS; static GVar G_RUN__IMMEDIATE__METHODS__CHECKS; static Obj GC_RUN__IMMEDIATE__METHODS__CHECKS; static GVar G_RUN__IMMEDIATE__METHODS__HITS; @@ -100,12 +102,14 @@ static GVar G_IGNORE__IMMEDIATE__METHODS; static Obj GC_IGNORE__IMMEDIATE__METHODS; static GVar G_IMM__FLAGS; static Obj GC_IMM__FLAGS; +static GVar G_TRACE__IMMEDIATE__METHODS; +static Obj GC_TRACE__IMMEDIATE__METHODS; static GVar G_IMMEDIATES; static Obj GC_IMMEDIATES; +static GVar G_SIZE__IMMEDIATE__METHOD__ENTRY; +static Obj GC_SIZE__IMMEDIATE__METHOD__ENTRY; static GVar G_IMMEDIATE__METHODS; static Obj GC_IMMEDIATE__METHODS; -static GVar G_TRACE__IMMEDIATE__METHODS; -static Obj GC_TRACE__IMMEDIATE__METHODS; static GVar G_RankFilter; static Obj GF_RankFilter; static GVar G_CHECK__INSTALL__METHOD; @@ -178,7 +182,9 @@ static Obj HdlrFunc2 ( Obj l_j = 0; Obj l_imm = 0; Obj l_i = 0; + Obj l_meth = 0; Obj l_res = 0; + Obj l_loc = 0; Obj l_newflags = 0; Obj t_1 = 0; Obj t_2 = 0; @@ -203,7 +209,9 @@ static Obj HdlrFunc2 ( (void)l_j; (void)l_imm; (void)l_i; + (void)l_meth; (void)l_res; + (void)l_loc; (void)l_newflags; Bag oldFrame; OLD_BRK_CURR_STAT @@ -278,6 +286,27 @@ static Obj HdlrFunc2 ( C_ELM_POSOBJ_NLE( t_1, l_type, 2 ); a_flags = t_1; + /* RUN_IMMEDIATE_METHODS_RUNS := RUN_IMMEDIATE_METHODS_RUNS + 1; */ + t_2 = GC_RUN__IMMEDIATE__METHODS__RUNS; + CHECK_BOUND( t_2, "RUN_IMMEDIATE_METHODS_RUNS" ) + C_SUM_FIA( t_1, t_2, INTOBJ_INT(1) ) + AssGVar( G_RUN__IMMEDIATE__METHODS__RUNS, t_1 ); + + /* if TRACE_IMMEDIATE_METHODS then */ + t_2 = GC_TRACE__IMMEDIATE__METHODS; + CHECK_BOUND( t_2, "TRACE_IMMEDIATE_METHODS" ) + CHECK_BOOL( t_2 ) + t_1 = (Obj)(UInt)(t_2 != False); + if ( t_1 ) { + + /* Print( "#I RunImmediateMethods\n" ); */ + t_1 = GF_Print; + t_2 = MakeString( "#I RunImmediateMethods\n" ); + CALL_1ARGS( t_1, t_2 ); + + } + /* fi */ + /* for j in flagspos do */ t_4 = l_flagspos; if ( IS_SMALL_LIST(t_4) ) { @@ -315,12 +344,16 @@ static Obj HdlrFunc2 ( C_ELM_LIST_FPL( t_5, t_6, l_j ) l_imm = t_5; - /* for i in [ 0, 7 .. LEN_LIST( imm ) - 7 ] do */ - t_11 = GF_LEN__LIST; - t_10 = CALL_1ARGS( t_11, l_imm ); - CHECK_FUNC_RESULT( t_10 ) - C_DIFF_FIA( t_9, t_10, INTOBJ_INT(7) ) - t_8 = Range3Check( INTOBJ_INT(0), INTOBJ_INT(7), t_9 ); + /* for i in [ 0, SIZE_IMMEDIATE_METHOD_ENTRY .. LEN_LIST( imm ) - SIZE_IMMEDIATE_METHOD_ENTRY ] do */ + t_9 = GC_SIZE__IMMEDIATE__METHOD__ENTRY; + CHECK_BOUND( t_9, "SIZE_IMMEDIATE_METHOD_ENTRY" ) + t_12 = GF_LEN__LIST; + t_11 = CALL_1ARGS( t_12, l_imm ); + CHECK_FUNC_RESULT( t_11 ) + t_12 = GC_SIZE__IMMEDIATE__METHOD__ENTRY; + CHECK_BOUND( t_12, "SIZE_IMMEDIATE_METHOD_ENTRY" ) + C_DIFF_FIA( t_10, t_11, t_12 ) + t_8 = Range3Check( INTOBJ_INT(0), t_9, t_10 ); if ( IS_SMALL_LIST(t_8) ) { t_7 = (Obj)(UInt)1; t_5 = INTOBJ_INT(1); @@ -375,16 +408,19 @@ static Obj HdlrFunc2 ( } if ( t_9 ) { - /* res := IMMEDIATE_METHODS[imm[i + 6]]( obj ); */ - t_11 = GC_IMMEDIATE__METHODS; - CHECK_BOUND( t_11, "IMMEDIATE_METHODS" ) - C_SUM_FIA( t_13, l_i, INTOBJ_INT(6) ) - CHECK_INT_POS( t_13 ) - C_ELM_LIST_FPL( t_12, l_imm, t_13 ) + /* meth := IMMEDIATE_METHODS[imm[i + 6]]; */ + t_10 = GC_IMMEDIATE__METHODS; + CHECK_BOUND( t_10, "IMMEDIATE_METHODS" ) + C_SUM_FIA( t_12, l_i, INTOBJ_INT(6) ) CHECK_INT_POS( t_12 ) - C_ELM_LIST_FPL( t_10, t_11, t_12 ) - CHECK_FUNC( t_10 ) - t_9 = CALL_1ARGS( t_10, a_obj ); + C_ELM_LIST_FPL( t_11, l_imm, t_12 ) + CHECK_INT_POS( t_11 ) + C_ELM_LIST_FPL( t_9, t_10, t_11 ) + l_meth = t_9; + + /* res := meth( obj ); */ + CHECK_FUNC( l_meth ) + t_9 = CALL_1ARGS( l_meth, a_obj ); CHECK_FUNC_RESULT( t_9 ) l_res = t_9; @@ -408,50 +444,51 @@ static Obj HdlrFunc2 ( t_9 = (Obj)(UInt)(t_10 != False); if ( t_9 ) { - /* if imm[i + 7] = false then */ + /* Print( "#I immediate: ", NAME_FUNC( imm[i + 1] ) ); */ + t_9 = GF_Print; + t_10 = MakeString( "#I immediate: " ); + t_12 = GF_NAME__FUNC; + C_SUM_FIA( t_14, l_i, INTOBJ_INT(1) ) + CHECK_INT_POS( t_14 ) + C_ELM_LIST_FPL( t_13, l_imm, t_14 ) + t_11 = CALL_1ARGS( t_12, t_13 ); + CHECK_FUNC_RESULT( t_11 ) + CALL_2ARGS( t_9, t_10, t_11 ); + + /* if imm[i + 7] <> false then */ C_SUM_FIA( t_11, l_i, INTOBJ_INT(7) ) CHECK_INT_POS( t_11 ) C_ELM_LIST_FPL( t_10, l_imm, t_11 ) t_11 = False; - t_9 = (Obj)(UInt)(EQ( t_10, t_11 )); + t_9 = (Obj)(UInt)( ! EQ( t_10, t_11 )); if ( t_9 ) { - /* Print( "#I immediate: ", NAME_FUNC( imm[i + 1] ), "\n" ); */ - t_9 = GF_Print; - t_10 = MakeString( "#I immediate: " ); - t_12 = GF_NAME__FUNC; - C_SUM_FIA( t_14, l_i, INTOBJ_INT(1) ) - CHECK_INT_POS( t_14 ) - C_ELM_LIST_FPL( t_13, l_imm, t_14 ) - t_11 = CALL_1ARGS( t_12, t_13 ); - CHECK_FUNC_RESULT( t_11 ) - t_12 = MakeString( "\n" ); - CALL_3ARGS( t_9, t_10, t_11, t_12 ); - - } - - /* else */ - else { - - /* Print( "#I immediate: ", NAME_FUNC( imm[i + 1] ), ": ", imm[i + 7], "\n" ); */ + /* Print( ": ", imm[i + 7] ); */ t_9 = GF_Print; - t_10 = MakeString( "#I immediate: " ); - t_12 = GF_NAME__FUNC; - C_SUM_FIA( t_14, l_i, INTOBJ_INT(1) ) - CHECK_INT_POS( t_14 ) - C_ELM_LIST_FPL( t_13, l_imm, t_14 ) - t_11 = CALL_1ARGS( t_12, t_13 ); - CHECK_FUNC_RESULT( t_11 ) - t_12 = MakeString( ": " ); - C_SUM_FIA( t_14, l_i, INTOBJ_INT(7) ) - CHECK_INT_POS( t_14 ) - C_ELM_LIST_FPL( t_13, l_imm, t_14 ) - t_14 = MakeString( "\n" ); - CALL_5ARGS( t_9, t_10, t_11, t_12, t_13, t_14 ); + t_10 = MakeString( ": " ); + C_SUM_FIA( t_12, l_i, INTOBJ_INT(7) ) + CHECK_INT_POS( t_12 ) + C_ELM_LIST_FPL( t_11, l_imm, t_12 ) + CALL_2ARGS( t_9, t_10, t_11 ); } /* fi */ + /* Print( " at ", imm[i + 8][1], ":", imm[i + 8][2], "\n" ); */ + t_9 = GF_Print; + t_10 = MakeString( " at " ); + C_SUM_FIA( t_13, l_i, INTOBJ_INT(8) ) + CHECK_INT_POS( t_13 ) + C_ELM_LIST_FPL( t_12, l_imm, t_13 ) + C_ELM_LIST_FPL( t_11, t_12, INTOBJ_INT(1) ) + t_12 = MakeString( ":" ); + C_SUM_FIA( t_15, l_i, INTOBJ_INT(8) ) + CHECK_INT_POS( t_15 ) + C_ELM_LIST_FPL( t_14, l_imm, t_15 ) + C_ELM_LIST_FPL( t_13, t_14, INTOBJ_INT(2) ) + t_14 = MakeString( "\n" ); + CALL_5ARGS( t_9, t_10, t_11, t_12, t_13, t_14 ); + } /* fi */ @@ -2483,8 +2520,8 @@ static Obj HdlrFunc7 ( t_6 = NewFunction( NameFunc[8], 1, 0, HdlrFunc8 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 625); - SET_ENDLINE_BODY(t_7, 643); + SET_STARTLINE_BODY(t_7, 634); + SET_ENDLINE_BODY(t_7, 652); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3087,8 +3124,8 @@ static Obj HdlrFunc11 ( t_1 = NewFunction( NameFunc[12], 1, 0, HdlrFunc12 ); SET_ENVI_FUNC( t_1, STATE(CurrLVars) ); t_2 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_2, 822); - SET_ENDLINE_BODY(t_2, 826); + SET_STARTLINE_BODY(t_2, 831); + SET_ENDLINE_BODY(t_2, 835); SET_FILENAME_BODY(t_2, FileName); SET_BODY_FUNC(t_1, t_2); CHANGED_BAG( STATE(CurrLVars) ); @@ -3167,8 +3204,8 @@ static Obj HdlrFunc11 ( t_6 = NewFunction( NameFunc[13], 1, 0, HdlrFunc13 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 843); - SET_ENDLINE_BODY(t_7, 843); + SET_STARTLINE_BODY(t_7, 852); + SET_ENDLINE_BODY(t_7, 852); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3230,8 +3267,8 @@ static Obj HdlrFunc11 ( t_6 = NewFunction( NameFunc[14], 2, 0, HdlrFunc14 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 865); - SET_ENDLINE_BODY(t_7, 888); + SET_STARTLINE_BODY(t_7, 874); + SET_ENDLINE_BODY(t_7, 897); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3279,8 +3316,8 @@ static Obj HdlrFunc11 ( t_6 = NewFunction( NameFunc[15], 2, 0, HdlrFunc15 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 898); - SET_ENDLINE_BODY(t_7, 906); + SET_STARTLINE_BODY(t_7, 907); + SET_ENDLINE_BODY(t_7, 915); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3341,8 +3378,8 @@ static Obj HdlrFunc11 ( t_6 = NewFunction( NameFunc[16], 3, 0, HdlrFunc16 ); SET_ENVI_FUNC( t_6, STATE(CurrLVars) ); t_7 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_7, 915); - SET_ENDLINE_BODY(t_7, 928); + SET_STARTLINE_BODY(t_7, 924); + SET_ENDLINE_BODY(t_7, 937); SET_FILENAME_BODY(t_7, FileName); SET_BODY_FUNC(t_6, t_7); CHANGED_BAG( STATE(CurrLVars) ); @@ -3715,8 +3752,8 @@ static Obj HdlrFunc17 ( t_4 = NewFunction( NameFunc[18], -1, 0, HdlrFunc18 ); SET_ENVI_FUNC( t_4, STATE(CurrLVars) ); t_5 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_5, 994); - SET_ENDLINE_BODY(t_5, 1010); + SET_STARTLINE_BODY(t_5, 1003); + SET_ENDLINE_BODY(t_5, 1019); SET_FILENAME_BODY(t_5, FileName); SET_BODY_FUNC(t_4, t_5); CHANGED_BAG( STATE(CurrLVars) ); @@ -3751,6 +3788,9 @@ static Obj HdlrFunc1 ( REM_BRK_CURR_STAT(); SET_BRK_CURR_STAT(0); + /* RUN_IMMEDIATE_METHODS_RUNS := 0; */ + AssGVar( G_RUN__IMMEDIATE__METHODS__RUNS, INTOBJ_INT(0) ); + /* RUN_IMMEDIATE_METHODS_CHECKS := 0; */ AssGVar( G_RUN__IMMEDIATE__METHODS__CHECKS, INTOBJ_INT(0) ); @@ -3758,7 +3798,7 @@ static Obj HdlrFunc1 ( AssGVar( G_RUN__IMMEDIATE__METHODS__HITS, INTOBJ_INT(0) ); /* BIND_GLOBAL( "RunImmediateMethods", function ( obj, flags ) - local flagspos, tried, type, j, imm, i, res, newflags; + local flagspos, tried, type, j, imm, i, meth, res, loc, newflags; if IGNORE_IMMEDIATE_METHODS then return; fi; @@ -3770,20 +3810,25 @@ static Obj HdlrFunc1 ( tried := [ ]; type := TYPE_OBJ( obj ); flags := type![2]; + RUN_IMMEDIATE_METHODS_RUNS := RUN_IMMEDIATE_METHODS_RUNS + 1; + if TRACE_IMMEDIATE_METHODS then + Print( "#I RunImmediateMethods\n" ); + fi; for j in flagspos do if IsBound( IMMEDIATES[j] ) then imm := IMMEDIATES[j]; - for i in [ 0, 7 .. LEN_LIST( imm ) - 7 ] do + for i in [ 0, SIZE_IMMEDIATE_METHOD_ENTRY .. LEN_LIST( imm ) - SIZE_IMMEDIATE_METHOD_ENTRY ] do if IS_SUBSET_FLAGS( flags, imm[i + 4] ) and not IS_SUBSET_FLAGS( flags, imm[i + 3] ) and not imm[i + 6] in tried then - res := IMMEDIATE_METHODS[imm[i + 6]]( obj ); + meth := IMMEDIATE_METHODS[imm[i + 6]]; + res := meth( obj ); ADD_LIST( tried, imm[i + 6] ); RUN_IMMEDIATE_METHODS_CHECKS := RUN_IMMEDIATE_METHODS_CHECKS + 1; if TRACE_IMMEDIATE_METHODS then - if imm[i + 7] = false then - Print( "#I immediate: ", NAME_FUNC( imm[i + 1] ), "\n" ); - else - Print( "#I immediate: ", NAME_FUNC( imm[i + 1] ), ": ", imm[i + 7], "\n" ); + Print( "#I immediate: ", NAME_FUNC( imm[i + 1] ) ); + if imm[i + 7] <> false then + Print( ": ", imm[i + 7] ); fi; + Print( " at ", imm[i + 8][1], ":", imm[i + 8][2], "\n" ); fi; if res <> TRY_NEXT_METHOD then IGNORE_IMMEDIATE_METHODS := true; @@ -3809,8 +3854,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[2], 2, 0, HdlrFunc2 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 26); - SET_ENDLINE_BODY(t_4, 117); + SET_STARTLINE_BODY(t_4, 27); + SET_ENDLINE_BODY(t_4, 126); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -3911,8 +3956,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[3], 6, 0, HdlrFunc3 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 137); - SET_ENDLINE_BODY(t_4, 264); + SET_STARTLINE_BODY(t_4, 146); + SET_ENDLINE_BODY(t_4, 273); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -3927,8 +3972,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[4], -1, 0, HdlrFunc4 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 311); - SET_ENDLINE_BODY(t_4, 313); + SET_STARTLINE_BODY(t_4, 320); + SET_ENDLINE_BODY(t_4, 322); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -3943,8 +3988,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[5], -1, 0, HdlrFunc5 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 338); - SET_ENDLINE_BODY(t_4, 340); + SET_STARTLINE_BODY(t_4, 347); + SET_ENDLINE_BODY(t_4, 349); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4097,8 +4142,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[6], 2, 0, HdlrFunc6 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 351); - SET_ENDLINE_BODY(t_4, 562); + SET_STARTLINE_BODY(t_4, 360); + SET_ENDLINE_BODY(t_4, 571); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4158,8 +4203,8 @@ static Obj HdlrFunc1 ( t_2 = NewFunction( NameFunc[7], 6, 0, HdlrFunc7 ); SET_ENVI_FUNC( t_2, STATE(CurrLVars) ); t_3 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_3, 581); - SET_ENDLINE_BODY(t_3, 647); + SET_STARTLINE_BODY(t_3, 590); + SET_ENDLINE_BODY(t_3, 656); SET_FILENAME_BODY(t_3, FileName); SET_BODY_FUNC(t_2, t_3); CHANGED_BAG( STATE(CurrLVars) ); @@ -4173,8 +4218,8 @@ static Obj HdlrFunc1 ( t_2 = NewFunction( NameFunc[9], 6, 0, HdlrFunc9 ); SET_ENVI_FUNC( t_2, STATE(CurrLVars) ); t_3 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_3, 650); - SET_ENDLINE_BODY(t_3, 656); + SET_STARTLINE_BODY(t_3, 659); + SET_ENDLINE_BODY(t_3, 665); SET_FILENAME_BODY(t_3, FileName); SET_BODY_FUNC(t_2, t_3); CHANGED_BAG( STATE(CurrLVars) ); @@ -4202,8 +4247,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[10], 2, 0, HdlrFunc10 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 669); - SET_ENDLINE_BODY(t_4, 693); + SET_STARTLINE_BODY(t_4, 678); + SET_ENDLINE_BODY(t_4, 702); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4287,8 +4332,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[11], 4, 0, HdlrFunc11 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 818); - SET_ENDLINE_BODY(t_4, 929); + SET_STARTLINE_BODY(t_4, 827); + SET_ENDLINE_BODY(t_4, 938); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4339,8 +4384,8 @@ static Obj HdlrFunc1 ( t_3 = NewFunction( NameFunc[17], -1, 0, HdlrFunc17 ); SET_ENVI_FUNC( t_3, STATE(CurrLVars) ); t_4 = NewBag( T_BODY, sizeof(BodyHeader) ); - SET_STARTLINE_BODY(t_4, 964); - SET_ENDLINE_BODY(t_4, 1011); + SET_STARTLINE_BODY(t_4, 973); + SET_ENDLINE_BODY(t_4, 1020); SET_FILENAME_BODY(t_4, FileName); SET_BODY_FUNC(t_3, t_4); CHANGED_BAG( STATE(CurrLVars) ); @@ -4421,14 +4466,16 @@ static Int PostRestore ( StructInitInfo * module ) G_CONV__STRING = GVarName( "CONV_STRING" ); G_Print = GVarName( "Print" ); G_ViewObj = GVarName( "ViewObj" ); + G_RUN__IMMEDIATE__METHODS__RUNS = GVarName( "RUN_IMMEDIATE_METHODS_RUNS" ); G_RUN__IMMEDIATE__METHODS__CHECKS = GVarName( "RUN_IMMEDIATE_METHODS_CHECKS" ); G_RUN__IMMEDIATE__METHODS__HITS = GVarName( "RUN_IMMEDIATE_METHODS_HITS" ); G_BIND__GLOBAL = GVarName( "BIND_GLOBAL" ); G_IGNORE__IMMEDIATE__METHODS = GVarName( "IGNORE_IMMEDIATE_METHODS" ); G_IMM__FLAGS = GVarName( "IMM_FLAGS" ); + G_TRACE__IMMEDIATE__METHODS = GVarName( "TRACE_IMMEDIATE_METHODS" ); G_IMMEDIATES = GVarName( "IMMEDIATES" ); + G_SIZE__IMMEDIATE__METHOD__ENTRY = GVarName( "SIZE_IMMEDIATE_METHOD_ENTRY" ); G_IMMEDIATE__METHODS = GVarName( "IMMEDIATE_METHODS" ); - G_TRACE__IMMEDIATE__METHODS = GVarName( "TRACE_IMMEDIATE_METHODS" ); G_RankFilter = GVarName( "RankFilter" ); G_CHECK__INSTALL__METHOD = GVarName( "CHECK_INSTALL_METHOD" ); G_INSTALL__METHOD = GVarName( "INSTALL_METHOD" ); @@ -4533,14 +4580,16 @@ static Int InitKernel ( StructInitInfo * module ) InitFopyGVar( "CONV_STRING", &GF_CONV__STRING ); InitFopyGVar( "Print", &GF_Print ); InitCopyGVar( "ViewObj", &GC_ViewObj ); + InitCopyGVar( "RUN_IMMEDIATE_METHODS_RUNS", &GC_RUN__IMMEDIATE__METHODS__RUNS ); InitCopyGVar( "RUN_IMMEDIATE_METHODS_CHECKS", &GC_RUN__IMMEDIATE__METHODS__CHECKS ); InitCopyGVar( "RUN_IMMEDIATE_METHODS_HITS", &GC_RUN__IMMEDIATE__METHODS__HITS ); InitFopyGVar( "BIND_GLOBAL", &GF_BIND__GLOBAL ); InitCopyGVar( "IGNORE_IMMEDIATE_METHODS", &GC_IGNORE__IMMEDIATE__METHODS ); InitCopyGVar( "IMM_FLAGS", &GC_IMM__FLAGS ); + InitCopyGVar( "TRACE_IMMEDIATE_METHODS", &GC_TRACE__IMMEDIATE__METHODS ); InitCopyGVar( "IMMEDIATES", &GC_IMMEDIATES ); + InitCopyGVar( "SIZE_IMMEDIATE_METHOD_ENTRY", &GC_SIZE__IMMEDIATE__METHOD__ENTRY ); InitCopyGVar( "IMMEDIATE_METHODS", &GC_IMMEDIATE__METHODS ); - InitCopyGVar( "TRACE_IMMEDIATE_METHODS", &GC_TRACE__IMMEDIATE__METHODS ); InitFopyGVar( "RankFilter", &GF_RankFilter ); InitCopyGVar( "CHECK_INSTALL_METHOD", &GC_CHECK__INSTALL__METHOD ); InitFopyGVar( "INSTALL_METHOD", &GF_INSTALL__METHOD ); @@ -4641,7 +4690,7 @@ static Int InitLibrary ( StructInitInfo * module ) static StructInitInfo module = { .type = MODULE_STATIC, .name = "GAPROOT/lib/oper1.g", - .crc = -6572452, + .crc = -121710233, .initKernel = InitKernel, .initLibrary = InitLibrary, .postRestore = PostRestore, diff --git a/tst/test-error/trace.g b/tst/test-error/trace.g index 3f3be03bfb..782e6ad55d 100644 --- a/tst/test-error/trace.g +++ b/tst/test-error/trace.g @@ -7,3 +7,8 @@ InverseMutable(m); AdditiveInverseMutable(m); TraceMethods(AdditiveInverseMutable); AdditiveInverseMutable(m); + +g:= Group( (1,2,3), (1,2) );; Size( g ); +TraceMethods( [ Size ] ); +Size(g); +UntraceMethods( [ Size ] ); diff --git a/tst/test-error/trace.g.out b/tst/test-error/trace.g.out index f890879543..f6d74c4dc8 100644 --- a/tst/test-error/trace.g.out +++ b/tst/test-error/trace.g.out @@ -13,4 +13,12 @@ gap> TraceMethods(AdditiveInverseMutable); gap> AdditiveInverseMutable(m); #I AdditiveInverseMutable: for GF2 matrix at GAPROOT/lib/vecmat.gi:774 +gap> +gap> g:= Group( (1,2,3), (1,2) );; Size( g ); +6 +gap> TraceMethods( [ Size ] ); +gap> Size(g); +#I Size: system getter at GAPROOT/lib/coll.gd:1473 +6 +gap> UntraceMethods( [ Size ] ); gap> QUIT; diff --git a/tst/testinstall/opers/LocationFunc.tst b/tst/testinstall/opers/LocationFunc.tst index 33e7398da2..300714ce50 100644 --- a/tst/testinstall/opers/LocationFunc.tst +++ b/tst/testinstall/opers/LocationFunc.tst @@ -7,7 +7,7 @@ gap> LocationFunc(f); # GAP function which was compiled to C code by gac gap> LocationFunc(INSTALL_METHOD_FLAGS); -"GAPROOT/lib/oper1.g:137" +"GAPROOT/lib/oper1.g:146" # proper kernel function gap> LocationFunc(APPEND_LIST_INTR); diff --git a/tst/testinstall/varargs.tst b/tst/testinstall/varargs.tst index 0b19801756..7aa02d1564 100644 --- a/tst/testinstall/varargs.tst +++ b/tst/testinstall/varargs.tst @@ -83,11 +83,11 @@ function ( object... ) end gap> Print(INSTALL_METHOD_FLAGS,"\n"); function ( <>, <>, <>, <>, <>, <> ) - <> + <> end gap> Display(InstallMethod); function ( <>... ) - <> + <> end gap> [1..2]; [ 1, 2 ]