Browse Source

Fix usage of interfaces declared in units that are part of a package.

compiler/ncgvmt.pas, TVMTWriter:
  * writeinterfaceids: generate indirect symbol for IID and IIDSTR symbols
  * intf_gen_intf_ref: use indirect symbol for IID and IIDSTR symbols
rtl/inc/objpash.inc:
  * tinterfaceentry: use pointer to PGUID and to PShortString to accomodate for\
 indirect symbol
rtl/inc/objpas.inc, TObject:
  * GetInterfaceEntry: correctly dereference IID of the tinterfaceentry
  * GetInterfaceEntryByStr: correctly dereference IIDSTR of the tinterfaceentry

git-svn-id: branches/svenbarth/packages@29029 -
svenbarth 10 years ago
parent
commit
363d38a055
3 changed files with 20 additions and 4 deletions
  1. 10 2
      compiler/ncgvmt.pas
  2. 8 0
      rtl/inc/objpas.inc
  3. 2 2
      rtl/inc/objpash.inc

+ 10 - 2
compiler/ncgvmt.pas

@@ -606,7 +606,7 @@ implementation
         { GUID (or nil for Corba interfaces) }
         if AImplIntf.IntfDef.objecttype in [odt_interfacecom] then
           rawdata.concat(Tai_const.CreateName(
-            make_mangledname('IID',AImplIntf.IntfDef.owner,AImplIntf.IntfDef.objname^),AT_DATA,0))
+            make_mangledname('IID',AImplIntf.IntfDef.owner,AImplIntf.IntfDef.objname^)+indirect_suffix,AT_DATA,0))
         else
           rawdata.concat(Tai_const.Create_nil_dataptr);
 
@@ -634,7 +634,7 @@ implementation
 
         { IIDStr }
         rawdata.concat(Tai_const.CreateName(
-          make_mangledname('IIDSTR',AImplIntf.IntfDef.owner,AImplIntf.IntfDef.objname^),AT_DATA,0));
+          make_mangledname('IIDSTR',AImplIntf.IntfDef.owner,AImplIntf.IntfDef.objname^)+indirect_suffix,AT_DATA,0));
         { IType }
         rawdata.concat(Tai_const.Create_pint(aint(AImplIntf.VtblImplIntf.IType)));
       end;
@@ -683,6 +683,10 @@ implementation
           list.concat(Tai_const.Create_16bit(_class.iidguid^.D3));
           for i:=Low(_class.iidguid^.D4) to High(_class.iidguid^.D4) do
             list.concat(Tai_const.Create_8bit(_class.iidguid^.D4[i]));
+          { write indirect IID symbol }
+          list.concat(Tai_symbol.Createname_global(s+indirect_suffix,AT_DATA,0));
+          list.concat(Tai_const.Createname(s,AT_DATA,0));
+          list.concat(Tai_symbol_end.Createname(s+indirect_suffix));
         end;
       maybe_new_object_file(list);
       s:=make_mangledname('IIDSTR',_class.owner,_class.objname^);
@@ -690,6 +694,10 @@ implementation
       list.concat(Tai_symbol.Createname_global(s,AT_DATA,0));
       list.concat(Tai_const.Create_8bit(length(_class.iidstr^)));
       list.concat(Tai_string.Create(_class.iidstr^));
+      { write indirect IIDSTR symbol }
+      list.concat(Tai_symbol.Createname_global(s+indirect_suffix,AT_DATA,0));
+      list.concat(Tai_const.Createname(s,AT_DATA,0));
+      list.concat(Tai_symbol_end.Createname(s+indirect_suffix));
     end;
 
 

+ 8 - 0
rtl/inc/objpas.inc

@@ -872,7 +872,11 @@
               for i:=0 to intftable^.EntryCount-1 do
               begin
                 result:=@intftable^.Entries[i];
+                {$ifndef ver2_6}
+                if assigned(Result^.iid) and assigned(Result^.iid^) and IsGUIDEqual(Result^.iid^^,iid) then
+                {$else}
                 if assigned(Result^.iid) and IsGUIDEqual(Result^.iid^,iid) then
+                {$endif}
                   Exit;
               end;
             end;
@@ -896,7 +900,11 @@
               for i:=0 to intftable^.EntryCount-1 do
               begin
                 result:=@intftable^.Entries[i];
+                {$ifndef ver2_6}
+                if assigned(result^.iidstr) and assigned(result^.iidstr^) and (result^.iidstr^^ = iidstr) then
+                {$else}
                 if assigned(result^.iidstr) and (result^.iidstr^ = iidstr) then
+                {$endif}
                   Exit;
               end;
             end;

+ 2 - 2
rtl/inc/objpash.inc

@@ -171,10 +171,10 @@
 
        pinterfaceentry = ^tinterfaceentry;
        tinterfaceentry = record
-         IID         : pguid; { if assigned(IID) then Com else Corba}
+         IID         : {$ifndef ver2_6}^{$endif}pguid; { if assigned(IID) then Com else Corba}
          VTable      : Pointer;
          IOffset     : sizeuint;
-         IIDStr      : pshortstring; { never nil. Com: upper(GuidToString(IID^)) }
+         IIDStr      : {$ifndef ver2_6}^{$endif}pshortstring; { never nil. Com: upper(GuidToString(IID^)) }
          case boolean of
 {$ifdef ENDIAN_BIG}
            true      : ({$IFDEF CPU64}__pad: longint;{$ENDIF}IType : tinterfaceentrytype);