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 d37ea95b79b166d9f5b9d5ffead4a5f2820de904..7a9a63d3d2314f9e80c51478779ecc0654c53e7c 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 25420161d5416c1be614e1af5fe413a6474ed5ce..72812b94265004265d558faffb75261adf72792a 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 bf400ef2a874e874f8e244c1b47b2614bf994588..9f82ffa02dd0adcf66ba900df8e4362cbab61f60 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)) {