Browse Source

compiler: fix interface type passing to dispinterface/IDispatch methods (part of issue #0015562)

git-svn-id: trunk@14780 -
paul 15 years ago
parent
commit
f0f7837fdd
1 changed files with 34 additions and 22 deletions
  1. 34 22
      compiler/ncal.pas

+ 34 - 22
compiler/ncal.pas

@@ -399,6 +399,9 @@ implementation
         names := '';
         while assigned(para) do
           begin
+            if para.left.nodetype=nothingn then
+              break;
+
             if assigned(para.parametername) then
               begin
                 if para.parametername.nodetype=stringconstn then
@@ -410,34 +413,43 @@ implementation
             dispatchbyref:=para.left.resultdef.typ in [variantdef];
 
             { assign the argument/parameter to the temporary location }
-            if para.left.nodetype<>nothingn then
-              if dispatchbyref then
+
+            if dispatchbyref then
+              addstatement(statements,cassignmentnode.create(
+                ctypeconvnode.create_internal(cderefnode.create(caddnode.create(addn,
+                  caddrnode.create(ctemprefnode.create(params)),
+                  cordconstnode.create(qword(paramssize),ptruinttype,false)
+                )),voidpointertype),
+                ctypeconvnode.create_internal(caddrnode.create_internal(para.left),voidpointertype)))
+            else
+              begin
+                case para.left.resultdef.size of
+                  1..4:
+                    assignmenttype:=u32inttype;
+                  8:
+                    assignmenttype:=u64inttype;
+                  else
+                    internalerror(2007042801);
+                end;
                 addstatement(statements,cassignmentnode.create(
                   ctypeconvnode.create_internal(cderefnode.create(caddnode.create(addn,
                     caddrnode.create(ctemprefnode.create(params)),
-                    cordconstnode.create(qword(paramssize),ptruinttype,false)
-                  )),voidpointertype),
-                  ctypeconvnode.create_internal(caddrnode.create_internal(para.left),voidpointertype)))
-              else
-                begin
-                  case para.left.resultdef.size of
-                    1..4:
-                      assignmenttype:=u32inttype;
-                    8:
-                      assignmenttype:=u64inttype;
-                    else
-                      internalerror(2007042801);
-                  end;
-                  addstatement(statements,cassignmentnode.create(
-                    ctypeconvnode.create_internal(cderefnode.create(caddnode.create(addn,
-                      caddrnode.create(ctemprefnode.create(params)),
-                      cordconstnode.create(paramssize,ptruinttype,false)
-                    )),assignmenttype),
-                    ctypeconvnode.create_internal(para.left,assignmenttype)));
-                end;
+                    cordconstnode.create(paramssize,ptruinttype,false)
+                  )),assignmenttype),
+                  ctypeconvnode.create_internal(para.left,assignmenttype)));
+              end;
 
             if is_ansistring(para.left.resultdef) then
               calldesc.argtypes[currargpos]:=varStrArg
+            else
+            if is_interface(para.left.resultdef) then
+              begin
+                { distinct IDispatch and IUnknown interfaces }
+                if tobjectdef(para.left.resultdef).is_related(tobjectdef(search_system_type('IDISPATCH').typedef)) then
+                  calldesc.argtypes[currargpos]:=vardispatch
+                else
+                  calldesc.argtypes[currargpos]:=varunknown;
+              end
             else
               calldesc.argtypes[currargpos]:=para.left.resultdef.getvardef;