Browse Source

compiler: move current_objectdef variable to implementation of pdecobj and use explicit type conversion to tobjectdef in other places where current_objectdef is needed

git-svn-id: trunk@16660 -
paul 14 years ago
parent
commit
2af416e145
4 changed files with 8 additions and 7 deletions
  1. 1 1
      compiler/nutils.pas
  2. 2 0
      compiler/pdecobj.pas
  3. 4 4
      compiler/psub.pas
  4. 1 2
      compiler/symdef.pas

+ 1 - 1
compiler/nutils.pas

@@ -562,7 +562,7 @@ implementation
               { parameter 2 : pointer to vmt }
               { parameter 2 : pointer to vmt }
               { parameter 1 : self pointer }
               { parameter 1 : self pointer }
               para:=ccallparanode.create(
               para:=ccallparanode.create(
-                        cordconstnode.create(current_objectdef.vmt_offset,s32inttype,false),
+                        cordconstnode.create(tobjectdef(current_structdef).vmt_offset,s32inttype,false),
                     ccallparanode.create(
                     ccallparanode.create(
                         ctypeconvnode.create_internal(
                         ctypeconvnode.create_internal(
                             load_vmt_pointer_node,
                             load_vmt_pointer_node,

+ 2 - 0
compiler/pdecobj.pas

@@ -55,6 +55,8 @@ implementation
         Declaring it as string here results in an error when compiling (PFV) }
         Declaring it as string here results in an error when compiling (PFV) }
       current_procinfo = 'error';
       current_procinfo = 'error';
 
 
+    var
+      current_objectdef : tobjectdef absolute current_structdef;
 
 
     function class_constructor_head:tprocdef;
     function class_constructor_head:tprocdef;
       var
       var

+ 4 - 4
compiler/psub.pas

@@ -328,7 +328,7 @@ implementation
                         that memory was allocated }
                         that memory was allocated }
                       { parameter 1 : self pointer }
                       { parameter 1 : self pointer }
                       para:=ccallparanode.create(
                       para:=ccallparanode.create(
-                                cordconstnode.create(current_objectdef.vmt_offset,s32inttype,false),
+                                cordconstnode.create(tobjectdef(current_structdef).vmt_offset,s32inttype,false),
                             ccallparanode.create(
                             ccallparanode.create(
                                 ctypeconvnode.create_internal(
                                 ctypeconvnode.create_internal(
                                     load_vmt_pointer_node,
                                     load_vmt_pointer_node,
@@ -448,7 +448,7 @@ implementation
                       { parameter 2 : pointer to vmt }
                       { parameter 2 : pointer to vmt }
                       { parameter 1 : self pointer }
                       { parameter 1 : self pointer }
                       para:=ccallparanode.create(
                       para:=ccallparanode.create(
-                                cordconstnode.create(current_objectdef.vmt_offset,s32inttype,false),
+                                cordconstnode.create(tobjectdef(current_structdef).vmt_offset,s32inttype,false),
                             ccallparanode.create(
                             ccallparanode.create(
                                 ctypeconvnode.create_internal(
                                 ctypeconvnode.create_internal(
                                     load_vmt_pointer_node,
                                     load_vmt_pointer_node,
@@ -643,11 +643,11 @@ implementation
                   internalerror(200305106);
                   internalerror(200305106);
               end;
               end;
 
 
-            if withexceptblock then
+            if withexceptblock and (current_structdef.typ=objectdef) then
               begin
               begin
                 { Generate the implicit "fail" code for a constructor (destroy
                 { Generate the implicit "fail" code for a constructor (destroy
                   in case an exception happened) }
                   in case an exception happened) }
-                pd:=current_objectdef.find_destructor;
+                pd:=tobjectdef(current_structdef).find_destructor;
                 { this will always be the case for classes, since tobject has
                 { this will always be the case for classes, since tobject has
                   a destructor }
                   a destructor }
                 if assigned(pd) then
                 if assigned(pd) then

+ 1 - 2
compiler/symdef.pas

@@ -642,12 +642,11 @@ interface
 
 
     var
     var
        current_structdef: tabstractrecorddef; { used for private functions check !! }
        current_structdef: tabstractrecorddef; { used for private functions check !! }
-       current_objectdef : tobjectdef absolute current_structdef;
        current_genericdef : tabstractrecorddef; { used to reject declaration of generic class inside generic class }
        current_genericdef : tabstractrecorddef; { used to reject declaration of generic class inside generic class }
        current_specializedef : tabstractrecorddef; { used to implement usage of generic class in itself }
        current_specializedef : tabstractrecorddef; { used to implement usage of generic class in itself }
 
 
     { default types }
     { default types }
-       generrordef,              { error in definition }
+       generrordef,               { error in definition }
        voidpointertype,           { pointer for Void-pointeddef }
        voidpointertype,           { pointer for Void-pointeddef }
        charpointertype,           { pointer for Char-pointeddef }
        charpointertype,           { pointer for Char-pointeddef }
        widecharpointertype,       { pointer for WideChar-pointeddef }
        widecharpointertype,       { pointer for WideChar-pointeddef }