Skip to content

Commit 369c4d1

Browse files
committed
Forbid constructors with 0 arguments
Constructors with 0 arguments make no sense. Thus, forbid creating such constructors, and also forbid installing zero argument methods for constructors.
1 parent 97aec87 commit 369c4d1

File tree

9 files changed

+164
-111
lines changed

9 files changed

+164
-111
lines changed

lib/oper.g

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -773,6 +773,9 @@ end );
773773
BIND_GLOBAL( "NewConstructor", function ( name, filters )
774774
local oper, filt, filter;
775775

776+
if LEN_LIST( filters ) = 0 then
777+
Error( "constructors must have at least one argument" );
778+
fi;
776779
if GAPInfo.MaxNrArgsMethod < LEN_LIST( filters ) then
777780
Error( "methods can have at most ", GAPInfo.MaxNrArgsMethod,
778781
" arguments" );
@@ -944,7 +947,9 @@ BIND_GLOBAL( "DeclareConstructor", function ( name, filters )
944947

945948
local gvar, req, filt, filter;
946949

947-
if GAPInfo.MaxNrArgsMethod < LEN_LIST( filters ) then
950+
if LEN_LIST( filters ) = 0 then
951+
Error( "constructors must have at least one argument" );
952+
elif GAPInfo.MaxNrArgsMethod < LEN_LIST( filters ) then
948953
Error( "methods can have at most ", GAPInfo.MaxNrArgsMethod,
949954
" arguments" );
950955
elif ISB_GVAR( name ) then

lib/oper1.g

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,10 @@ BIND_GLOBAL( "INSTALL_METHOD_FLAGS",
153153
fi;
154154
# add the number of filters required for each argument
155155
if IS_CONSTRUCTOR(opr) then
156-
if 0 < LEN_LIST(flags) then
157-
rank := rank - RankFilter( flags[ 1 ] );
156+
if 0 = LEN_LIST(flags) then
157+
Error(NAME_FUNC(opr),": constructors must have at least one argument");
158158
fi;
159+
rank := rank - RankFilter( flags[ 1 ] );
159160
else
160161
for i in flags do
161162
rank := rank + RankFilter( i );

src/c_oper1.c

Lines changed: 52 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#ifndef AVOID_PRECOMPILED
22
/* C file produced by GAC */
33
#include "compiled.h"
4-
#define FILE_CRC "93694864"
4+
#define FILE_CRC "32938550"
55

66
/* global variables used in handlers */
77
static GVar G_REREADING;
@@ -646,24 +646,32 @@ static Obj HdlrFunc3 (
646646
t_1 = (Obj)(UInt)(t_2 != False);
647647
if ( t_1 ) {
648648

649-
/* if 0 < LEN_LIST( flags ) then */
649+
/* if 0 = LEN_LIST( flags ) then */
650650
t_3 = GF_LEN__LIST;
651651
t_2 = CALL_1ARGS( t_3, a_flags );
652652
CHECK_FUNC_RESULT( t_2 )
653-
t_1 = (Obj)(UInt)(LT( INTOBJ_INT(0), t_2 ));
653+
t_1 = (Obj)(UInt)(EQ( INTOBJ_INT(0), t_2 ));
654654
if ( t_1 ) {
655655

656-
/* rank := rank - RankFilter( flags[1] ); */
657-
t_3 = GF_RankFilter;
658-
C_ELM_LIST_FPL( t_4, a_flags, INTOBJ_INT(1) )
659-
t_2 = CALL_1ARGS( t_3, t_4 );
656+
/* Error( NAME_FUNC( opr ), ": constructors must have at least one argument" ); */
657+
t_1 = GF_Error;
658+
t_3 = GF_NAME__FUNC;
659+
t_2 = CALL_1ARGS( t_3, a_opr );
660660
CHECK_FUNC_RESULT( t_2 )
661-
C_DIFF_FIA( t_1, a_rank, t_2 )
662-
a_rank = t_1;
661+
t_3 = MakeString( ": constructors must have at least one argument" );
662+
CALL_2ARGS( t_1, t_2, t_3 );
663663

664664
}
665665
/* fi */
666666

667+
/* rank := rank - RankFilter( flags[1] ); */
668+
t_3 = GF_RankFilter;
669+
C_ELM_LIST_FPL( t_4, a_flags, INTOBJ_INT(1) )
670+
t_2 = CALL_1ARGS( t_3, t_4 );
671+
CHECK_FUNC_RESULT( t_2 )
672+
C_DIFF_FIA( t_1, a_rank, t_2 )
673+
a_rank = t_1;
674+
667675
}
668676

669677
/* else */
@@ -2685,8 +2693,8 @@ static Obj HdlrFunc7 (
26852693
t_6 = NewFunction( NameFunc[8], 1, 0, HdlrFunc8 );
26862694
SET_ENVI_FUNC( t_6, STATE(CurrLVars) );
26872695
t_7 = NewBag( T_BODY, sizeof(BodyHeader) );
2688-
SET_STARTLINE_BODY(t_7, 651);
2689-
SET_ENDLINE_BODY(t_7, 669);
2696+
SET_STARTLINE_BODY(t_7, 652);
2697+
SET_ENDLINE_BODY(t_7, 670);
26902698
SET_FILENAME_BODY(t_7, FileName);
26912699
SET_BODY_FUNC(t_6, t_7);
26922700
CHANGED_BAG( STATE(CurrLVars) );
@@ -3289,8 +3297,8 @@ static Obj HdlrFunc11 (
32893297
t_1 = NewFunction( NameFunc[12], 1, 0, HdlrFunc12 );
32903298
SET_ENVI_FUNC( t_1, STATE(CurrLVars) );
32913299
t_2 = NewBag( T_BODY, sizeof(BodyHeader) );
3292-
SET_STARTLINE_BODY(t_2, 848);
3293-
SET_ENDLINE_BODY(t_2, 852);
3300+
SET_STARTLINE_BODY(t_2, 849);
3301+
SET_ENDLINE_BODY(t_2, 853);
32943302
SET_FILENAME_BODY(t_2, FileName);
32953303
SET_BODY_FUNC(t_1, t_2);
32963304
CHANGED_BAG( STATE(CurrLVars) );
@@ -3369,8 +3377,8 @@ static Obj HdlrFunc11 (
33693377
t_6 = NewFunction( NameFunc[13], 1, 0, HdlrFunc13 );
33703378
SET_ENVI_FUNC( t_6, STATE(CurrLVars) );
33713379
t_7 = NewBag( T_BODY, sizeof(BodyHeader) );
3372-
SET_STARTLINE_BODY(t_7, 869);
3373-
SET_ENDLINE_BODY(t_7, 869);
3380+
SET_STARTLINE_BODY(t_7, 870);
3381+
SET_ENDLINE_BODY(t_7, 870);
33743382
SET_FILENAME_BODY(t_7, FileName);
33753383
SET_BODY_FUNC(t_6, t_7);
33763384
CHANGED_BAG( STATE(CurrLVars) );
@@ -3432,8 +3440,8 @@ static Obj HdlrFunc11 (
34323440
t_6 = NewFunction( NameFunc[14], 2, 0, HdlrFunc14 );
34333441
SET_ENVI_FUNC( t_6, STATE(CurrLVars) );
34343442
t_7 = NewBag( T_BODY, sizeof(BodyHeader) );
3435-
SET_STARTLINE_BODY(t_7, 891);
3436-
SET_ENDLINE_BODY(t_7, 914);
3443+
SET_STARTLINE_BODY(t_7, 892);
3444+
SET_ENDLINE_BODY(t_7, 915);
34373445
SET_FILENAME_BODY(t_7, FileName);
34383446
SET_BODY_FUNC(t_6, t_7);
34393447
CHANGED_BAG( STATE(CurrLVars) );
@@ -3481,8 +3489,8 @@ static Obj HdlrFunc11 (
34813489
t_6 = NewFunction( NameFunc[15], 2, 0, HdlrFunc15 );
34823490
SET_ENVI_FUNC( t_6, STATE(CurrLVars) );
34833491
t_7 = NewBag( T_BODY, sizeof(BodyHeader) );
3484-
SET_STARTLINE_BODY(t_7, 924);
3485-
SET_ENDLINE_BODY(t_7, 932);
3492+
SET_STARTLINE_BODY(t_7, 925);
3493+
SET_ENDLINE_BODY(t_7, 933);
34863494
SET_FILENAME_BODY(t_7, FileName);
34873495
SET_BODY_FUNC(t_6, t_7);
34883496
CHANGED_BAG( STATE(CurrLVars) );
@@ -3543,8 +3551,8 @@ static Obj HdlrFunc11 (
35433551
t_6 = NewFunction( NameFunc[16], 3, 0, HdlrFunc16 );
35443552
SET_ENVI_FUNC( t_6, STATE(CurrLVars) );
35453553
t_7 = NewBag( T_BODY, sizeof(BodyHeader) );
3546-
SET_STARTLINE_BODY(t_7, 941);
3547-
SET_ENDLINE_BODY(t_7, 954);
3554+
SET_STARTLINE_BODY(t_7, 942);
3555+
SET_ENDLINE_BODY(t_7, 955);
35483556
SET_FILENAME_BODY(t_7, FileName);
35493557
SET_BODY_FUNC(t_6, t_7);
35503558
CHANGED_BAG( STATE(CurrLVars) );
@@ -3917,8 +3925,8 @@ static Obj HdlrFunc17 (
39173925
t_4 = NewFunction( NameFunc[18], -1, 0, HdlrFunc18 );
39183926
SET_ENVI_FUNC( t_4, STATE(CurrLVars) );
39193927
t_5 = NewBag( T_BODY, sizeof(BodyHeader) );
3920-
SET_STARTLINE_BODY(t_5, 1020);
3921-
SET_ENDLINE_BODY(t_5, 1036);
3928+
SET_STARTLINE_BODY(t_5, 1021);
3929+
SET_ENDLINE_BODY(t_5, 1037);
39223930
SET_FILENAME_BODY(t_5, FileName);
39233931
SET_BODY_FUNC(t_4, t_5);
39243932
CHANGED_BAG( STATE(CurrLVars) );
@@ -4030,9 +4038,10 @@ static Obj HdlrFunc1 (
40304038
local methods, narg, i, k, tmp, replace, match, j, lk;
40314039
;
40324040
if IS_CONSTRUCTOR( opr ) then
4033-
if 0 < LEN_LIST( flags ) then
4034-
rank := rank - RankFilter( flags[1] );
4041+
if 0 = LEN_LIST( flags ) then
4042+
Error( NAME_FUNC( opr ), ": constructors must have at least one argument" );
40354043
fi;
4044+
rank := rank - RankFilter( flags[1] );
40364045
else
40374046
for i in flags do
40384047
rank := rank + RankFilter( i );
@@ -4122,7 +4131,7 @@ static Obj HdlrFunc1 (
41224131
SET_ENVI_FUNC( t_3, STATE(CurrLVars) );
41234132
t_4 = NewBag( T_BODY, sizeof(BodyHeader) );
41244133
SET_STARTLINE_BODY(t_4, 146);
4125-
SET_ENDLINE_BODY(t_4, 273);
4134+
SET_ENDLINE_BODY(t_4, 274);
41264135
SET_FILENAME_BODY(t_4, FileName);
41274136
SET_BODY_FUNC(t_3, t_4);
41284137
CHANGED_BAG( STATE(CurrLVars) );
@@ -4137,8 +4146,8 @@ static Obj HdlrFunc1 (
41374146
t_3 = NewFunction( NameFunc[4], -1, 0, HdlrFunc4 );
41384147
SET_ENVI_FUNC( t_3, STATE(CurrLVars) );
41394148
t_4 = NewBag( T_BODY, sizeof(BodyHeader) );
4140-
SET_STARTLINE_BODY(t_4, 320);
4141-
SET_ENDLINE_BODY(t_4, 322);
4149+
SET_STARTLINE_BODY(t_4, 321);
4150+
SET_ENDLINE_BODY(t_4, 323);
41424151
SET_FILENAME_BODY(t_4, FileName);
41434152
SET_BODY_FUNC(t_3, t_4);
41444153
CHANGED_BAG( STATE(CurrLVars) );
@@ -4153,8 +4162,8 @@ static Obj HdlrFunc1 (
41534162
t_3 = NewFunction( NameFunc[5], -1, 0, HdlrFunc5 );
41544163
SET_ENVI_FUNC( t_3, STATE(CurrLVars) );
41554164
t_4 = NewBag( T_BODY, sizeof(BodyHeader) );
4156-
SET_STARTLINE_BODY(t_4, 347);
4157-
SET_ENDLINE_BODY(t_4, 349);
4165+
SET_STARTLINE_BODY(t_4, 348);
4166+
SET_ENDLINE_BODY(t_4, 350);
41584167
SET_FILENAME_BODY(t_4, FileName);
41594168
SET_BODY_FUNC(t_3, t_4);
41604169
CHANGED_BAG( STATE(CurrLVars) );
@@ -4323,8 +4332,8 @@ static Obj HdlrFunc1 (
43234332
t_3 = NewFunction( NameFunc[6], 2, 0, HdlrFunc6 );
43244333
SET_ENVI_FUNC( t_3, STATE(CurrLVars) );
43254334
t_4 = NewBag( T_BODY, sizeof(BodyHeader) );
4326-
SET_STARTLINE_BODY(t_4, 360);
4327-
SET_ENDLINE_BODY(t_4, 590);
4335+
SET_STARTLINE_BODY(t_4, 361);
4336+
SET_ENDLINE_BODY(t_4, 591);
43284337
SET_FILENAME_BODY(t_4, FileName);
43294338
SET_BODY_FUNC(t_3, t_4);
43304339
CHANGED_BAG( STATE(CurrLVars) );
@@ -4382,8 +4391,8 @@ static Obj HdlrFunc1 (
43824391
t_2 = NewFunction( NameFunc[7], 6, 0, HdlrFunc7 );
43834392
SET_ENVI_FUNC( t_2, STATE(CurrLVars) );
43844393
t_3 = NewBag( T_BODY, sizeof(BodyHeader) );
4385-
SET_STARTLINE_BODY(t_3, 609);
4386-
SET_ENDLINE_BODY(t_3, 673);
4394+
SET_STARTLINE_BODY(t_3, 610);
4395+
SET_ENDLINE_BODY(t_3, 674);
43874396
SET_FILENAME_BODY(t_3, FileName);
43884397
SET_BODY_FUNC(t_2, t_3);
43894398
CHANGED_BAG( STATE(CurrLVars) );
@@ -4397,8 +4406,8 @@ static Obj HdlrFunc1 (
43974406
t_2 = NewFunction( NameFunc[9], 6, 0, HdlrFunc9 );
43984407
SET_ENVI_FUNC( t_2, STATE(CurrLVars) );
43994408
t_3 = NewBag( T_BODY, sizeof(BodyHeader) );
4400-
SET_STARTLINE_BODY(t_3, 676);
4401-
SET_ENDLINE_BODY(t_3, 682);
4409+
SET_STARTLINE_BODY(t_3, 677);
4410+
SET_ENDLINE_BODY(t_3, 683);
44024411
SET_FILENAME_BODY(t_3, FileName);
44034412
SET_BODY_FUNC(t_2, t_3);
44044413
CHANGED_BAG( STATE(CurrLVars) );
@@ -4426,8 +4435,8 @@ static Obj HdlrFunc1 (
44264435
t_3 = NewFunction( NameFunc[10], 2, 0, HdlrFunc10 );
44274436
SET_ENVI_FUNC( t_3, STATE(CurrLVars) );
44284437
t_4 = NewBag( T_BODY, sizeof(BodyHeader) );
4429-
SET_STARTLINE_BODY(t_4, 695);
4430-
SET_ENDLINE_BODY(t_4, 719);
4438+
SET_STARTLINE_BODY(t_4, 696);
4439+
SET_ENDLINE_BODY(t_4, 720);
44314440
SET_FILENAME_BODY(t_4, FileName);
44324441
SET_BODY_FUNC(t_3, t_4);
44334442
CHANGED_BAG( STATE(CurrLVars) );
@@ -4511,8 +4520,8 @@ static Obj HdlrFunc1 (
45114520
t_3 = NewFunction( NameFunc[11], 4, 0, HdlrFunc11 );
45124521
SET_ENVI_FUNC( t_3, STATE(CurrLVars) );
45134522
t_4 = NewBag( T_BODY, sizeof(BodyHeader) );
4514-
SET_STARTLINE_BODY(t_4, 844);
4515-
SET_ENDLINE_BODY(t_4, 955);
4523+
SET_STARTLINE_BODY(t_4, 845);
4524+
SET_ENDLINE_BODY(t_4, 956);
45164525
SET_FILENAME_BODY(t_4, FileName);
45174526
SET_BODY_FUNC(t_3, t_4);
45184527
CHANGED_BAG( STATE(CurrLVars) );
@@ -4563,8 +4572,8 @@ static Obj HdlrFunc1 (
45634572
t_3 = NewFunction( NameFunc[17], -1, 0, HdlrFunc17 );
45644573
SET_ENVI_FUNC( t_3, STATE(CurrLVars) );
45654574
t_4 = NewBag( T_BODY, sizeof(BodyHeader) );
4566-
SET_STARTLINE_BODY(t_4, 990);
4567-
SET_ENDLINE_BODY(t_4, 1037);
4575+
SET_STARTLINE_BODY(t_4, 991);
4576+
SET_ENDLINE_BODY(t_4, 1038);
45684577
SET_FILENAME_BODY(t_4, FileName);
45694578
SET_BODY_FUNC(t_3, t_4);
45704579
CHANGED_BAG( STATE(CurrLVars) );
@@ -4871,7 +4880,7 @@ static Int InitLibrary ( StructInitInfo * module )
48714880
static StructInitInfo module = {
48724881
.type = MODULE_STATIC,
48734882
.name = "GAPROOT/lib/oper1.g",
4874-
.crc = 93694864,
4883+
.crc = 32938550,
48754884
.initKernel = InitKernel,
48764885
.initLibrary = InitLibrary,
48774886
.postRestore = PostRestore,

0 commit comments

Comments
 (0)