diff --git a/src/main/java/com/aparapi/internal/instruction/InstructionSet.java b/src/main/java/com/aparapi/internal/instruction/InstructionSet.java index 9fe5a71a..1ce0c46c 100644 --- a/src/main/java/com/aparapi/internal/instruction/InstructionSet.java +++ b/src/main/java/com/aparapi/internal/instruction/InstructionSet.java @@ -60,7 +60,6 @@ to national security controls as identified on the Commerce Control List (curren import com.aparapi.internal.model.ClassModel.ConstantPool.Entry; import com.aparapi.internal.model.ClassModel.ConstantPool.FieldEntry; import com.aparapi.internal.model.ClassModel.ConstantPool.MethodEntry; -import com.aparapi.internal.model.ClassModel.LocalVariableTableEntry; import com.aparapi.internal.model.ClassModel.LocalVariableInfo; import com.aparapi.internal.reader.ByteReader; @@ -86,6 +85,43 @@ public static enum StoreSpec { O, // Object } + private static LocalVariableInfo syntheticStoreLocalVariableInfo(final Instruction instruction, final StoreSpec storeSpec, + final int index) { + final int start = instruction.getThisPC() + instruction.getLength(); + final String descriptor = storeSpec == StoreSpec.L ? "J" : storeSpec.toString(); + final String name = (storeSpec == StoreSpec.A ? "arr" : storeSpec.toString().toLowerCase()) + "_" + index; + + return new LocalVariableInfo(){ + @Override public int getStart() { + return start; + } + + @Override public boolean isArray() { + return storeSpec == StoreSpec.A; + } + + @Override public int getEnd() { + return start + 1; + } + + @Override public String getVariableName() { + return name; + } + + @Override public String getVariableDescriptor() { + return descriptor; + } + + @Override public int getVariableIndex() { + return index; + } + + @Override public int getLength() { + return 1; + } + }; + } + public static enum TypeSpec { NONE("none", "none", 0, 0), // Z("Z", "boolean", 4, 1), // Note 'Z' is the java code for 'boolean' type @@ -1274,9 +1310,19 @@ public LocalVariableConstIndexStore(MethodModel methodPoolEntry, ByteCode byteCo } @Override public boolean isDeclaration() { - LocalVariableInfo lvi = method.getLocalVariableTableEntry().getVariable(getThisPC() + getLength(), - getLocalVariableTableIndex()); - return (lvi != null) && (lvi.getStart() == getThisPC() + getLength() || lvi.getStart() == getThisPC()); + LocalVariableInfo lvi = getLocalVariableInfo(); + return (lvi != null) && (lvi.getStart() == getThisPC() + getLength() || lvi.getStart() == getThisPC()); + } + + @Override public LocalVariableInfo getLocalVariableInfo() { + LocalVariableInfo lvi = super.getLocalVariableInfo(); + if (lvi == null) { + lvi = method.getLocalVariableTableEntry().getVariable(getThisPC(), getLocalVariableTableIndex()); + } + if (lvi == null) { + lvi = syntheticStoreLocalVariableInfo(this, getByteCode().getStore(), getLocalVariableTableIndex()); + } + return lvi; } @Override public String getDescription() { @@ -1314,10 +1360,20 @@ public LocalVariableIndex08Store(MethodModel methodPoolEntry, ByteCode byteCode, } @Override public boolean isDeclaration() { - final LocalVariableTableEntry localVariableTableEntry = method.getLocalVariableTableEntry(); - final LocalVariableInfo localVarInfo = localVariableTableEntry.getVariable(getThisPC() + getLength(), - getLocalVariableTableIndex()); - return ((localVarInfo != null) && (localVarInfo.getStart() == (getThisPC() + getLength()))); + final LocalVariableInfo localVarInfo = getLocalVariableInfo(); + return ((localVarInfo != null) && ((localVarInfo.getStart() == (getThisPC() + getLength())) + || (localVarInfo.getStart() == getThisPC()))); + } + + @Override public LocalVariableInfo getLocalVariableInfo() { + LocalVariableInfo lvi = super.getLocalVariableInfo(); + if (lvi == null) { + lvi = method.getLocalVariableTableEntry().getVariable(getThisPC(), getLocalVariableTableIndex()); + } + if (lvi == null) { + lvi = syntheticStoreLocalVariableInfo(this, getByteCode().getStore(), getLocalVariableTableIndex()); + } + return lvi; } @Override public String getDescription() { diff --git a/src/test/java/com/aparapi/codegen/test/ArbitraryScope.java b/src/test/java/com/aparapi/codegen/test/ArbitraryScope.java index 56fb6a6a..5e02b9e8 100644 --- a/src/test/java/com/aparapi/codegen/test/ArbitraryScope.java +++ b/src/test/java/com/aparapi/codegen/test/ArbitraryScope.java @@ -109,7 +109,7 @@ __kernel void run( count--; } } - int value = (256 * count) / this->maxIterations; + int i_12 = (256 * count) / this->maxIterations; } float scaleSquare = 1.0f; return; diff --git a/src/test/java/com/aparapi/codegen/test/ArbitraryScopeTest.java b/src/test/java/com/aparapi/codegen/test/ArbitraryScopeTest.java index bbc299b8..658280aa 100644 --- a/src/test/java/com/aparapi/codegen/test/ArbitraryScopeTest.java +++ b/src/test/java/com/aparapi/codegen/test/ArbitraryScopeTest.java @@ -15,7 +15,6 @@ */ package com.aparapi.codegen.test; -import org.junit.Ignore; import org.junit.Test; public class ArbitraryScopeTest extends com.aparapi.codegen.CodeGenJUnitBase { @@ -68,7 +67,7 @@ public class ArbitraryScopeTest extends com.aparapi.codegen.CodeGenJUnitBase { + " count--;\n" + " }\n" + " }\n" - + " int value = (256 * count) / this->maxIterations;\n" + + " int i_12 = (256 * count) / this->maxIterations;\n" + " }\n" + " float scaleSquare = 1.0f;\n" + " return;\n" @@ -77,13 +76,11 @@ public class ArbitraryScopeTest extends com.aparapi.codegen.CodeGenJUnitBase { + " "}; private static final Class expectedException = null; - @Ignore @Test public void ArbitraryScopeTest() { test(com.aparapi.codegen.test.ArbitraryScope.class, expectedException, expectedOpenCL); } - @Ignore @Test public void ArbitraryScopeTestWorksWithCaching() { test(com.aparapi.codegen.test.ArbitraryScope.class, expectedException, expectedOpenCL);