From b344e6a3f7df70959494b2bb16ddc7f00c0e341e Mon Sep 17 00:00:00 2001
From: Gary Frost <frost.gary@gmail.com>
Date: Mon, 7 Nov 2011 19:17:13 +0000
Subject: [PATCH] Attempt to detect accesses through multi-dimensional arrays
 see http://code.google.com/p/aparapi/issues/detail?id=10

---
 .../src/java/com/amd/aparapi/BlockWriter.java |  4 +--
 .../com/amd/aparapi/ClassParseException.java  |  4 ++-
 .../src/java/com/amd/aparapi/MethodModel.java | 26 +++++++++++++++++++
 3 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/BlockWriter.java b/com.amd.aparapi/src/java/com/amd/aparapi/BlockWriter.java
index d37ea95b..7a9a63d3 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/BlockWriter.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/BlockWriter.java
@@ -449,7 +449,7 @@ abstract class BlockWriter{
             if (f.isNaN()) {
                write("NAN");
             } else if (f.isInfinite()) {
-               if (f < 0){
+               if (f < 0) {
                   write("-");
                }
                write("INFINITY");
@@ -463,7 +463,7 @@ abstract class BlockWriter{
             if (d.isNaN()) {
                write("NAN");
             } else if (d.isInfinite()) {
-               if (d < 0){
+               if (d < 0) {
                   write("-");
                }
                write("INFINITY");
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/ClassParseException.java b/com.amd.aparapi/src/java/com/amd/aparapi/ClassParseException.java
index 25420161..72812b94 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/ClassParseException.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/ClassParseException.java
@@ -81,7 +81,9 @@ package com.amd.aparapi;
       ACCESSEDOBJECTNONFINAL("Kernel array object member class must be final."), //
       ACCESSEDOBJECTFIELDNAMECONFLICT("Conflicting fields found in class hierarchy"), //
       ACCESSEDOBJECTONLYSUPPORTSSIMPLEPUTFIELD("We don't support putfield instructions beyond simple setters"), //
-      ACCESSEDOBJECTSETTERARRAY("Passing array arguments to Intrinsics in expression form is not supported");
+      ACCESSEDOBJECTSETTERARRAY("Passing array arguments to Intrinsics in expression form is not supported"), //
+      MULTIDIMENSIONARRAYASSIGN("Can't assign to two dimension array"), //
+      MULTIDIMENSIONARRAYACCESS("Can't access through a two dimensional array");
       private String description;
 
       TYPE(String _description) {
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/MethodModel.java b/com.amd.aparapi/src/java/com/amd/aparapi/MethodModel.java
index bf400ef2..9f82ffa0 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/MethodModel.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/MethodModel.java
@@ -45,6 +45,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.Map.Entry;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -280,6 +281,7 @@ class MethodModel{
          if ((!Config.enableSWITCH) && (instruction instanceof I_LOOKUPSWITCH || instruction instanceof I_TABLESWITCH)) {
             throw new ClassParseException(instruction, ClassParseException.TYPE.SWITCH);
          }
+
          if (!Config.enableMETHODARRAYPASSING) {
             if (instruction instanceof MethodCall) {
                MethodCall methodCall = (MethodCall) instruction;
@@ -1502,6 +1504,30 @@ class MethodModel{
 
          foldExpressions();
 
+         // Attempt to detect accesses through multi-dimension arrays. 
+         // This was issue 10 in open source release http://code.google.com/p/aparapi/issues/detail?id=10
+         for (Entry<Integer, Instruction> instructionEntry : pcMap.entrySet()) {
+            Instruction instruction = instructionEntry.getValue();
+            if (instruction instanceof AccessArrayElement) {
+               AccessArrayElement accessArrayElement = (AccessArrayElement) instruction;
+               Instruction accessed = accessArrayElement.getArrayRef();
+               // System.out.println("accessed "+accessed);
+               if (accessed instanceof AccessArrayElement) {
+                  throw new ClassParseException(ClassParseException.TYPE.MULTIDIMENSIONARRAYACCESS);
+               }
+
+            }
+            if (instruction instanceof AssignToArrayElement) {
+               AssignToArrayElement assignToArrayElement = (AssignToArrayElement) instruction;
+               Instruction assigned = assignToArrayElement.getArrayRef();
+
+               // System.out.println("assigned "+assigned);
+               if (assigned instanceof AccessArrayElement) {
+                  throw new ClassParseException(ClassParseException.TYPE.MULTIDIMENSIONARRAYASSIGN);
+               }
+
+            }
+         }
          // Accessor conversion only works on member object arrays
          if (entrypoint != null && _method.getClassModel() != entrypoint.getClassModel()) {
             if (logger.isLoggable(Level.FINE)) {
-- 
GitLab