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