Browse Source

* also allow taking the address of a derefence expression on the JVM target
(required for taking the address of threadvars, used by the current RTL)

git-svn-id: branches/jvmbackend@20869 -

Jonas Maebe 13 years ago
parent
commit
21722802fa
1 changed files with 15 additions and 2 deletions
  1. 15 2
      compiler/jvm/njvmmem.pas

+ 15 - 2
compiler/jvm/njvmmem.pas

@@ -35,6 +35,7 @@ interface
         protected
         protected
          function isrefparaload: boolean;
          function isrefparaload: boolean;
          function isarrayele0load: boolean;
          function isarrayele0load: boolean;
+         function isdererence: boolean;
         public
         public
          function pass_typecheck: tnode; override;
          function pass_typecheck: tnode; override;
          procedure pass_generate_code; override;
          procedure pass_generate_code; override;
@@ -146,6 +147,16 @@ implementation
       end;
       end;
 
 
 
 
+    function tjvmaddrnode.isdererence: boolean;
+      var
+        target: tnode;
+      begin
+        target:=left.actualtargetnode;
+        result:=
+          (left.nodetype=derefn);
+      end;
+
+
     function tjvmaddrnode.pass_typecheck: tnode;
     function tjvmaddrnode.pass_typecheck: tnode;
       var
       var
         fsym: tsym;
         fsym: tsym;
@@ -233,9 +244,11 @@ implementation
             if not jvmimplicitpointertype(left.resultdef) then
             if not jvmimplicitpointertype(left.resultdef) then
               begin
               begin
                 { allow taking the address of a copy-out parameter (it's an
                 { allow taking the address of a copy-out parameter (it's an
-                  array reference) or of the first element of an array }
+                  array reference), of the first element of an array and of a
+                  pointer derefence }
                 if not isrefparaload and
                 if not isrefparaload and
-                   not isarrayele0load then
+                   not isarrayele0load and
+                   not isdererence then
                   begin
                   begin
                     CGMessage(parser_e_illegal_expression);
                     CGMessage(parser_e_illegal_expression);
                     exit
                     exit