Browse Source

* fixed destructor parsing with preprocessor things
* support dipsoe(p,done())
* fixed constructor message with dispose(p,<nonexist>)

peter 25 years ago
parent
commit
f16647ede6
1 changed files with 31 additions and 12 deletions
  1. 31 12
      compiler/pstatmnt.pas

+ 31 - 12
compiler/pstatmnt.pas

@@ -819,7 +819,7 @@ unit pstatmnt;
           p,p2 : ptree;
           p,p2 : ptree;
           ht : ttoken;
           ht : ttoken;
           again : boolean; { dummy for do_proc_call }
           again : boolean; { dummy for do_proc_call }
-          {destrukname : stringid;}
+          destructorname : stringid;
           sym : psym;
           sym : psym;
           classh : pobjectdef;
           classh : pobjectdef;
           pd,pd2 : pdef;
           pd,pd2 : pdef;
@@ -854,7 +854,7 @@ unit pstatmnt;
                    { extended syntax of new and dispose }
                    { extended syntax of new and dispose }
                    { function styled new is handled in factor }
                    { function styled new is handled in factor }
                    { destructors have no parameters }
                    { destructors have no parameters }
-                   {destrukname:=pattern;}
+                   destructorname:=pattern;
                    destructorpos:=tokenpos;
                    destructorpos:=tokenpos;
                    consume(_ID);
                    consume(_ID);
 
 
@@ -892,28 +892,42 @@ unit pstatmnt;
                    { search cons-/destructor, also in parent classes }
                    { search cons-/destructor, also in parent classes }
                    storepos:=tokenpos;
                    storepos:=tokenpos;
                    tokenpos:=destructorpos;
                    tokenpos:=destructorpos;
-                   sym:=search_class_member(classh,pattern);
+                   sym:=search_class_member(classh,destructorname);
                    tokenpos:=storepos;
                    tokenpos:=storepos;
 
 
                    { the second parameter of new/dispose must be a call }
                    { the second parameter of new/dispose must be a call }
                    { to a cons-/destructor                              }
                    { to a cons-/destructor                              }
                    if (not assigned(sym)) or (sym^.typ<>procsym) then
                    if (not assigned(sym)) or (sym^.typ<>procsym) then
                          begin
                          begin
-                            Message(parser_e_expr_have_to_be_destructor_call);
+                            if tt=hnewn then
+                             Message(parser_e_expr_have_to_be_constructor_call)
+                            else
+                             Message(parser_e_expr_have_to_be_destructor_call);
                             new_dispose_statement:=genzeronode(errorn);
                             new_dispose_statement:=genzeronode(errorn);
                          end
                          end
                    else
                    else
                          begin
                          begin
                            p2:=gensinglenode(tt,p);
                            p2:=gensinglenode(tt,p);
                            if ht=_NEW then
                            if ht=_NEW then
-                                 begin
-                                    { Constructors can take parameters.}
-                                    p2^.resulttype:=ppointerdef(pd)^.pointertype.def;
-                                    do_member_read(false,sym,p2,pd,again);
-                                 end
+                             begin
+                               { Constructors can take parameters.}
+                               p2^.resulttype:=ppointerdef(pd)^.pointertype.def;
+                               do_member_read(false,sym,p2,pd,again);
+                             end
                            else
                            else
-                             { destructors can't.}
-                             p2:=genmethodcallnode(pprocsym(sym),srsymtable,p2);
+                             begin
+                               p2:=genmethodcallnode(pprocsym(sym),srsymtable,p2);
+                               { support dispose(p,done()); }
+                               if try_to_consume(_LKLAMMER) then
+                                begin
+                                  if not try_to_consume(_RKLAMMER) then
+                                   begin
+                                     Message(parser_e_no_paras_for_destructor);
+                                     consume_all_until(_RKLAMMER);
+                                     consume(_RKLAMMER);
+                                   end;
+                                end;
+                             end;
 
 
                            { we need the real called method }
                            { we need the real called method }
                            cleartempgen;
                            cleartempgen;
@@ -1331,7 +1345,12 @@ unit pstatmnt;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.120  2000-01-16 22:17:12  peter
+  Revision 1.121  2000-01-23 16:33:49  peter
+    * fixed destructor parsing with preprocessor things
+    * support dipsoe(p,done())
+    * fixed constructor message with dispose(p,<nonexist>)
+
+  Revision 1.120  2000/01/16 22:17:12  peter
     * renamed call_offset to para_offset
     * renamed call_offset to para_offset
 
 
   Revision 1.119  2000/01/12 10:30:50  peter
   Revision 1.119  2000/01/12 10:30:50  peter