Browse Source

+ added oo_hasconstructor and oo_hasdestructor
for objects options

pierre 27 years ago
parent
commit
d91210671d
3 changed files with 23 additions and 6 deletions
  1. 7 1
      compiler/pdecl.pas
  2. 6 2
      compiler/pexpr.pas
  3. 10 3
      compiler/symdef.inc

+ 7 - 1
compiler/pdecl.pas

@@ -688,6 +688,7 @@ unit pdecl;
            if (cs_constructor_name in aktglobalswitches) and (aktprocsym^.name<>'INIT') then
             Message(parser_e_constructorname_must_be_init);
 
+           aktclass^.options:=aktclass^.options or oo_hasconstructor;
            consume(SEMICOLON);
              begin
                 if (aktclass^.options and oois_class)<>0 then
@@ -1025,6 +1026,7 @@ unit pdecl;
            parse_proc_head(podestructor);
            if (cs_constructor_name in aktglobalswitches) and (aktprocsym^.name<>'DONE') then
             Message(parser_e_destructorname_must_be_done);
+           aktclass^.options:=aktclass^.options or oo_hasdestructor;
            consume(SEMICOLON);
            if assigned(aktprocsym^.definition^.para1) then
             Message(parser_e_no_paras_for_destructor);
@@ -2063,7 +2065,11 @@ unit pdecl;
 end.
 {
   $Log$
-  Revision 1.70  1998-10-13 13:10:22  peter
+  Revision 1.71  1998-10-15 15:13:25  pierre
+    + added oo_hasconstructor and oo_hasdestructor
+      for objects options
+
+  Revision 1.70  1998/10/13 13:10:22  peter
     * new style for m68k/i386 infos and enums
 
   Revision 1.69  1998/10/09 12:07:49  pierre

+ 6 - 2
compiler/pexpr.pas

@@ -203,7 +203,7 @@ unit pexpr;
                  Must_be_valid:=false;
                  do_firstpass(p1);
                  if ((p1^.resulttype^.deftype=objectdef) and
-                    ((pobjectdef(p1^.resulttype)^.options and oo_hasvirtual)<>0))
+                    ((pobjectdef(p1^.resulttype)^.options and oo_hasconstructor)<>0))
                    or is_open_array(p1^.resulttype) then
                   statement_syssym:=geninlinenode(in_sizeof_x,false,p1)
                  else
@@ -1863,7 +1863,11 @@ unit pexpr;
 end.
 {
   $Log$
-  Revision 1.65  1998-10-13 13:10:24  peter
+  Revision 1.66  1998-10-15 15:13:28  pierre
+    + added oo_hasconstructor and oo_hasdestructor
+      for objects options
+
+  Revision 1.65  1998/10/13 13:10:24  peter
     * new style for m68k/i386 infos and enums
 
   Revision 1.64  1998/10/12 12:20:55  pierre

+ 10 - 3
compiler/symdef.inc

@@ -2540,18 +2540,21 @@
         if assigned(c) then
           options:= c^.options and
                     (oo_hasvirtual or oo_hasprivate or
-                     oo_hasprotected
+                     oo_hasprotected or
+                     oo_hasconstructor or oo_hasdestructor
                      {or oo_can_have_published treated in pdecl }
                      );
         { privatesyms:=new(psymtable,init(objectsymtable));
       protectedsyms:=new(psymtable,init(objectsymtable)); }
         publicsyms:=new(psymtable,init(objectsymtable));
+        { create space for vmt !! }
+        publicsyms^.datasize:=Sizeof(pointer);
         publicsyms^.name := stringdup(n);
         { add the data of the anchestor class }
         if assigned(childof) then
           begin
              publicsyms^.datasize:=
-               publicsyms^.datasize-4+childof^.publicsyms^.datasize;
+               publicsyms^.datasize-SizeOf(pointer)+childof^.publicsyms^.datasize;
           end;
         name:=stringdup(n);
         savesize := publicsyms^.datasize;
@@ -3090,7 +3093,11 @@
 
 {
   $Log$
-  Revision 1.57  1998-10-14 15:54:20  pierre
+  Revision 1.58  1998-10-15 15:13:30  pierre
+    + added oo_hasconstructor and oo_hasdestructor
+      for objects options
+
+  Revision 1.57  1998/10/14 15:54:20  pierre
     * smallsets are not entirely implemented for
       m68k added a ifdef usesmallset
       that is allways defined for i386