2
0
Эх сурвалжийг харах

* Parse management operators. Each management operator is special kind of operator without result.

git-svn-id: trunk@35442 -
maciej-izak 8 жил өмнө
parent
commit
520bb31fa6
1 өөрчлөгдсөн 62 нэмэгдсэн , 31 устгасан
  1. 62 31
      compiler/pdecsub.pas

+ 62 - 31
compiler/pdecsub.pas

@@ -596,6 +596,10 @@ implementation
                     _EXPLICIT:optoken:=_OP_EXPLICIT;
                     _EXPLICIT:optoken:=_OP_EXPLICIT;
                     _INC:optoken:=_OP_INC;
                     _INC:optoken:=_OP_INC;
                     _DEC:optoken:=_OP_DEC;
                     _DEC:optoken:=_OP_DEC;
+                    _INITIALIZE:optoken:=_OP_INITIALIZE;
+                    _FINALIZE:optoken:=_OP_FINALIZE;
+                    _ADDREF:optoken:=_OP_ADDREF;
+                    _COPY:optoken:=_OP_COPY;
                     else
                     else
                     if (m_delphi in current_settings.modeswitches) then
                     if (m_delphi in current_settings.modeswitches) then
                       case lastidtoken of
                       case lastidtoken of
@@ -1436,40 +1440,67 @@ implementation
                   pd.resultname:=stringdup(orgpattern);
                   pd.resultname:=stringdup(orgpattern);
                   consume(_ID);
                   consume(_ID);
                 end;
                 end;
-              if not try_to_consume(_COLON) then
+              { operators without result (management operators) }
+              if optoken in [_OP_INITIALIZE, _OP_FINALIZE, _OP_ADDREF, _OP_COPY] then
                 begin
                 begin
-                  consume(_COLON);
-                  pd.returndef:=generrordef;
-                  consume_all_until(_SEMICOLON);
+                  { single var parameter to point the record }
+                  if (optoken in [_OP_INITIALIZE, _OP_FINALIZE, _OP_ADDREF]) and
+                     (
+                      (pd.parast.SymList.Count<>1) or
+                      (tparavarsym(pd.parast.SymList[0]).vardef<>pd.struct) or
+                      (tparavarsym(pd.parast.SymList[0]).varspez<>vs_var)
+                     ) then
+                    Message(parser_e_overload_impossible)
+                  { constref (source) and var (dest) parameter to point the records }
+                  else if (optoken=_OP_COPY) and
+                     (
+                      (pd.parast.SymList.Count<>2) or
+                      (tparavarsym(pd.parast.SymList[0]).vardef<>pd.struct) or
+                      (tparavarsym(pd.parast.SymList[0]).varspez<>vs_constref) or
+                      (tparavarsym(pd.parast.SymList[1]).vardef<>pd.struct) or
+                      (tparavarsym(pd.parast.SymList[1]).varspez<>vs_var)
+                     ) then
+                    Message(parser_e_overload_impossible);
+
+                  trecordsymtable(pd.procsym.Owner).includemanagementoperator(
+                    token2managementoperator(optoken));
+                  pd.returndef:=voidtype
                 end
                 end
               else
               else
-               begin
-                 read_returndef(pd);
-                 { check that class operators have either return type of structure or }
-                 { at least one argument of that type                                 }
-                 if (po_classmethod in pd.procoptions) and
-                    (pd.returndef <> pd.struct) then
-                   begin
-                     found:=false;
-                     for i := 0 to pd.parast.SymList.Count - 1 do
-                       if tparavarsym(pd.parast.SymList[i]).vardef=pd.struct then
-                         begin
-                           found:=true;
-                           break;
-                         end;
-                     if not found then
-                       if assigned(pd.struct) then
-                         Message1(parser_e_at_least_one_argument_must_be_of_type,pd.struct.RttiName)
-                       else
-                         MessagePos(pd.fileinfo,type_e_type_id_expected);
-                   end;
-                 if (optoken in [_ASSIGNMENT,_OP_EXPLICIT]) and
-                    equal_defs(pd.returndef,tparavarsym(pd.parast.SymList[0]).vardef) and
-                    (pd.returndef.typ<>undefineddef) and (tparavarsym(pd.parast.SymList[0]).vardef.typ<>undefineddef) then
-                   message(parser_e_no_such_assignment)
-                 else if not isoperatoracceptable(pd,optoken) then
-                   Message(parser_e_overload_impossible);
-               end;
+                if not try_to_consume(_COLON) then
+                  begin
+                    consume(_COLON);
+                    pd.returndef:=generrordef;
+                    consume_all_until(_SEMICOLON);
+                  end
+                else
+                 begin
+                   read_returndef(pd);
+                   { check that class operators have either return type of structure or }
+                   { at least one argument of that type                                 }
+                   if (po_classmethod in pd.procoptions) and
+                      (pd.returndef <> pd.struct) then
+                     begin
+                       found:=false;
+                       for i := 0 to pd.parast.SymList.Count - 1 do
+                         if tparavarsym(pd.parast.SymList[i]).vardef=pd.struct then
+                           begin
+                             found:=true;
+                             break;
+                           end;
+                       if not found then
+                         if assigned(pd.struct) then
+                           Message1(parser_e_at_least_one_argument_must_be_of_type,pd.struct.RttiName)
+                         else
+                           MessagePos(pd.fileinfo,type_e_type_id_expected);
+                     end;
+                   if (optoken in [_ASSIGNMENT,_OP_EXPLICIT]) and
+                      equal_defs(pd.returndef,tparavarsym(pd.parast.SymList[0]).vardef) and
+                      (pd.returndef.typ<>undefineddef) and (tparavarsym(pd.parast.SymList[0]).vardef.typ<>undefineddef) then
+                     message(parser_e_no_such_assignment)
+                   else if not isoperatoracceptable(pd,optoken) then
+                     Message(parser_e_overload_impossible);
+                 end;
             end;
             end;
           else
           else
             internalerror(2015052202);
             internalerror(2015052202);