From 0a438ab754d9ba3c1e8c8971db917aca42ee5ad7 Mon Sep 17 00:00:00 2001
From: Gary Frost <frost.gary@gmail.com>
Date: Tue, 23 Oct 2012 20:58:36 +0000
Subject: [PATCH] I think that support for classes without LVT is close.  Still
 need to remove some debugging printfs

---
 .../src/java/com/amd/aparapi/BlockWriter.java |   2 -
 .../src/java/com/amd/aparapi/ClassModel.java  |   4 +-
 .../java/com/amd/aparapi/ExpressionList.java  |   1 +
 .../src/java/com/amd/aparapi/MethodModel.java | 302 +++++-------------
 4 files changed, 87 insertions(+), 222 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 f1d66aa3..e2336381 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/BlockWriter.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/BlockWriter.java
@@ -456,8 +456,6 @@ abstract class BlockWriter{
          write(assignedField.getConstantPoolFieldEntry().getNameAndTypeEntry().getNameUTF8Entry().getUTF8());
          write("=");
          writeInstruction(assignedField.getValueToAssign());
-      } else if (_instruction instanceof I_ALOAD_0) {
-         write("this");
       } else if (_instruction instanceof Constant<?>) {
          Constant<?> constantInstruction = (Constant<?>) _instruction;
          Object value = constantInstruction.getValue();
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/ClassModel.java b/com.amd.aparapi/src/java/com/amd/aparapi/ClassModel.java
index ae756bff..b8cd3581 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/ClassModel.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/ClassModel.java
@@ -79,6 +79,8 @@ class ClassModel{
 
       int getVariableIndex();
 
+      int getLength();
+
    }
 
    interface LocalVariableTableEntry<T extends LocalVariableInfo> extends Iterable<T>{
@@ -1753,7 +1755,7 @@ class ClassModel{
                return (descriptorIndex);
             }
 
-            int getLength() {
+            public int getLength() {
                return (usageLength);
             }
 
diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/ExpressionList.java b/com.amd.aparapi/src/java/com/amd/aparapi/ExpressionList.java
index 79a39e4f..80437f19 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/ExpressionList.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/ExpressionList.java
@@ -774,6 +774,7 @@ class ExpressionList{
             }
             if (startPc < Short.MAX_VALUE) {
                logger.fine("Scope block from " + startPc + " to  " + (tail.getThisPC() + tail.getLength()));
+               System.out.println("Scope block from " + startPc + " to  " + (tail.getThisPC() + tail.getLength()));
                for (Instruction i = head; i != null; i = i.getNextPC()) {
                   if (i.getThisPC() == startPc) {
                      Instruction startInstruction = i.getRootExpr().getPrevExpr();
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 3de9b9b2..f16481b0 100644
--- a/com.amd.aparapi/src/java/com/amd/aparapi/MethodModel.java
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/MethodModel.java
@@ -41,7 +41,6 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -1458,251 +1457,73 @@ class MethodModel{
 
    public static class FakeLocalVariableTableEntry implements LocalVariableTableEntry<LocalVariableInfo>{
 
-      public static class FakeLocalVariableInfo implements LocalVariableInfo{
+      class Var implements LocalVariableInfo{
 
-         int start;
+         int startPc = 0;
 
-         int end;
+         int endPc = 0;
 
-         String name;
+         int variableIndex = 0;
 
-         String descriptor;
+         String name = null;
 
-         boolean isArray;
+         boolean arg;
 
-         int variableIndex;
+         String descriptor = "";
 
-         public FakeLocalVariableInfo(int _variableIndex, int _start, int _end, String _variableName, String _variableDescriptor,
-               boolean _isArray) {
+         Var(StoreSpec _storeSpec, int _slotIndex, int _startPc, boolean _arg, int _variableIndex) {
             variableIndex = _variableIndex;
-            start = _start;
-            end = _end;
-            name = _variableName;
-            descriptor = _variableDescriptor;
-            isArray = _isArray;
-         }
-
-         @Override public int getEnd() {
-            return (end);
+            arg = _arg;
+            startPc = _startPc;
+            if (_storeSpec.equals(StoreSpec.A)) {
+               name = "arr_" + _slotIndex;
+            } else {
+               name = _storeSpec.toString().toLowerCase() + "_" + _slotIndex;
+            }
          }
 
-         @Override public int getStart() {
-            return (start);
+         Var() {
+            name = "NONE";
          }
 
-         @Override public String getVariableDescriptor() {
-            return (descriptor);
+         @Override public boolean equals(Object object) {
+            return (object instanceof Var && ((object == this) || ((Var) object).name.equals(name)));
          }
 
-         @Override public int getVariableIndex() {
-            throw new IllegalStateException();
-
+         public String toString() {
+            return (name + "[" + startPc + "-" + endPc + "]");
          }
 
-         @Override public String getVariableName() {
-
-            return (name);
+         @Override public int getStart() {
+            return startPc;
          }
 
          @Override public boolean isArray() {
-
-            return (isArray);
+            return name.startsWith("arr");
          }
 
-      }
-
-      List<LocalVariableInfo> list = new ArrayList<LocalVariableInfo>();
-
-      /*
-
-      public class SlotTable{
-         Slot[] slots;
-
-         int slotSize;
-
-         Map.Entry<Integer, Instruction> pcMapEntries[];
-
-         StoreSpec[] argsAsStoreSlots;
-
-         public SlotTable(StoreSpec[] _argsAsStoreSlots, int _numberOfSlots, Map<Integer, Instruction> _pcMap) {
-            slotSize = _pcMap.size();
-            pcMapEntries = new Map.Entry[slotSize];
-            int count = 0;
-            for (Map.Entry<Integer, Instruction> entry : _pcMap.entrySet()) {
-               pcMapEntries[count++] = entry;
-            }
-
-            argsAsStoreSlots = _argsAsStoreSlots;
-            slots = new Slot[_numberOfSlots];
-            for (int i = 0; i < _numberOfSlots; i++) {
-               slots[i] = new Slot(i < argsAsStoreSlots.length ? argsAsStoreSlots[i] : StoreSpec.NONE, slotSize);
-            }
+         @Override public int getEnd() {
+            return endPc;
          }
 
-         public class Slot{
-
-            public Slot(StoreSpec _defaultStoreSpec, int _size) {
-               defaultStoreSpec = _defaultStoreSpec;
-               entries = new LinkedHashMap<Integer, Entry>();
-               for (Map.Entry<Integer, Instruction> pcMapEntry : pcMapEntries) {
-                  entries.put(pcMapEntry.getKey(), new Entry(pcMapEntry.getKey()));
-               }
-            }
-
-            StoreSpec defaultStoreSpec;
-
-            int number;
-
-            public class Entry{
-               int slotNumber;
-
-               public Entry(int _slotNumber) {
-                  slotNumber = _slotNumber;
-
-               }
-
-               LoadSpec loadSpec = LoadSpec.NONE;
-
-               StoreSpec storeSpec = StoreSpec.NONE;
-
-               public String toString() {
-                  if (loadSpec == LoadSpec.NONE && storeSpec == StoreSpec.NONE) {
-                     return ("  ");
-                  } else if (loadSpec != LoadSpec.NONE) {
-                     return ("L" + loadSpec);
-                  } else {
-                     return ("S" + storeSpec);
-                  }
-               }
-            }
-
-            Map<Integer, Entry> entries;
-
-            public Entry getEntry(int _pc) {
-               return entries.get(_pc);
-            }
-
-            public void setLoad(int _pc, LoadSpec _loadSpec) {
-               entries.get(_pc).loadSpec = _loadSpec;
-
-            }
-
-            public void setStore(int _pc, StoreSpec _storeSpec) {
-               entries.get(_pc).storeSpec = _storeSpec;
-
-            }
-
-            public StoreSpec getDefaultStoreSpec() {
-               return (defaultStoreSpec);
-            }
-
-            public LocalVariableInfo createLocalVariableInfo(int _index) {
-               StoreSpec storeSpec = defaultStoreSpec;
-               int variableIndex = 0;
-               int start = 0;
-               int end = 0;
-               String variableName = null;
-               String variableDescription = null;
-
-               String state = storeSpec == StoreSpec.NONE ? "NONE" : "STARTED";
-
-               int count = 0;
-               for (Map.Entry<Integer, Entry> entry : entries.entrySet()) {
-
-                  if (entry.getValue().storeSpec != StoreSpec.NONE) {
-                     if (state.equals("NONE")) {
-                        storeSpec = entry.getValue().storeSpec;
-                        state = "STARTED";
-                        start = end = entry.getKey();
-                     } else if (storeSpec != entry.getValue().storeSpec) {
-                        storeSpec = entry.getValue().storeSpec;
-                        state = "STARTED";
-                        start = end = entry.getKey();
-                     }
-
-                  }
-                  count++;
-               }
-               return ((LocalVariableInfo) new FakeLocalVariableInfo(variableIndex, start, end, variableName, variableDescription,
-                     false));
-            }
+         @Override public int getLength() {
+            return endPc - startPc;
          }
 
-         public String toString() {
-            StringBuilder sb = new StringBuilder();
-            for (Slot slot : slots) {
-               StoreSpec storeSpec = slot.getDefaultStoreSpec();
-               if (storeSpec != StoreSpec.NONE) {
-                  sb.append("S" + storeSpec);
-               } else {
-                  sb.append("  ");
-               }
-               sb.append("|");
-            }
-            sb.append("\n");
-
-            for (Slot slot : slots) {
-               sb.append("--|");
-            }
-            sb.append("\n");
-            for (Map.Entry<Integer, Instruction> pcMapEntry : pcMapEntries) {
-
-               for (Slot slot : slots) {
-                  sb.append(slot.getEntry(pcMapEntry.getKey()) + "|");
-               }
-               sb.append(" " + pcMapEntry.getValue());
-               sb.append("\n");
-            }
-
-            return (sb.toString());
-
+         @Override public String getVariableName() {
+            return (name);
          }
 
-         public void setLoad(int slot, int pc, LoadSpec _loadSpec) {
-            slots[slot].setLoad(pc, _loadSpec);
-
+         @Override public String getVariableDescriptor() {
+            return (descriptor);
          }
 
-         public void setStore(int slot, int pc, StoreSpec _storeSpec) {
-            slots[slot].setStore(pc, _storeSpec);
-
+         @Override public int getVariableIndex() {
+            return (variableIndex);
          }
       }
-      
-
-      SlotTable slotTable;
-      */
-
-      class Var{
-
-         int startPc = 0;
-
-         int endPc = 0;
-
-         String name = null;
 
-         // String descriptor;
-         Var(StoreSpec _storeSpec, int _slotIndex, int _startPc) {
-            startPc = _startPc;
-            if (_storeSpec.equals(StoreSpec.A)) {
-               name = "arr_" + _slotIndex;
-            } else {
-               name = _storeSpec.toString().toLowerCase() + "_" + _slotIndex;
-            }
-         }
-
-         Var() {
-            name = "NONE";
-         }
-
-         @Override public boolean equals(Object object) {
-            return (object instanceof Var && ((object == this) || ((Var) object).name.equals(name)));
-         }
-
-         public String toString() {
-            return (name + "[" + startPc + "-" + endPc + "]");
-         }
-      }
+      List<LocalVariableInfo> list = new ArrayList<LocalVariableInfo>();
 
       public FakeLocalVariableTableEntry(Map<Integer, Instruction> _pcMap, ClassModelMethod _method) {
          int numberOfSlots = _method.getCodeEntry().getMaxLocals();
@@ -1716,7 +1537,8 @@ class MethodModel{
             } else {
                argsAsStoreSpecs[i] = StoreSpec.valueOf(args[i].substring(0, 1));
             }
-            vars[i] = new Var(argsAsStoreSpecs[i], i, 0);
+            vars[i] = new Var(argsAsStoreSpecs[i], i, 0, true, list.size());
+            list.add(vars[i]);
          }
          for (int i = args.length; i < numberOfSlots; i++) {
             vars[i] = new Var();
@@ -1726,8 +1548,9 @@ class MethodModel{
          // slotTable = new SlotTable(argsAsStoreSpecs, numberOfSlots, _pcMap);
          // System.out.println(slotTable);
 
+         int pc = 0;
          for (Entry<Integer, Instruction> entry : _pcMap.entrySet()) {
-            int pc = entry.getKey();
+            pc = entry.getKey();
             Instruction instruction = entry.getValue();
             LoadSpec loadSpec = instruction.getByteCode().getLoad();
             StoreSpec storeSpec = instruction.getByteCode().getStore();
@@ -1738,7 +1561,7 @@ class MethodModel{
                slotIndex = ((InstructionSet.LocalVariableTableIndexAccessor) instruction).getLocalVariableTableIndex();
                //  slotTable.setLoad(slotIndex, pc,
                //    loadSpec);
-               if (vars[slotIndex].endPc < pc) {
+               if (vars[slotIndex].endPc <= pc) {
                   vars[slotIndex].endPc = pc;
                }
 
@@ -1748,24 +1571,65 @@ class MethodModel{
                slotIndex = ((InstructionSet.LocalVariableTableIndexAccessor) instruction).getLocalVariableTableIndex();
                // slotTable.setStore(slotIndex, pc,
                //    storeSpec);
-               Var var = new Var(storeSpec, slotIndex, pc);
+               Var var = new Var(storeSpec, slotIndex, pc, false, list.size()); // will get collected 
                if (!vars[slotIndex].equals(var)) {
                   vars[slotIndex] = var;
+                  list.add(vars[slotIndex]);
                }
 
             }
             for (int i = 0; i < numberOfSlots; i++) {
+
                System.out.print(vars[i] + "|");
             }
 
             System.out.println(" Instruction " + entry.getValue() + " " + slotIndex);
          }
+         for (int i = 0; i < numberOfSlots; i++) {
+
+            vars[i].endPc = pc + 1;
+         }
+         System.out.println(" LocalVariableTable:");
+         System.out.println(" Start  Length  Slot  Name   Signature");
+         for (LocalVariableInfo lvi : list) {
+            Var var = (Var) lvi;
+            if (var.arg) {
+               var.endPc = pc;
+            }
+
+            System.out.println(String.format("%4d %4d %4d %8s %s", var.startPc, var.getLength(), var.variableIndex, var.name,
+                  var.descriptor));
+
+            // System.out.println(lvi);
+         }
          //  System.out.println(slotTable);
 
       }
 
       @Override public LocalVariableInfo getVariable(int _pc, int _index) {
-         return (null);//slotTable.slots[_index].createLocalVariableInfo(_index));
+         LocalVariableInfo returnValue = null;
+         // System.out.println("pc = " + _pc + " index = " + _index);
+         for (LocalVariableInfo localVariableInfo : list) {
+            // System.out.println("   start=" + localVariableInfo.getStart() + " length=" + localVariableInfo.getLength()
+            // + " varidx=" + localVariableInfo.getVariableIndex());
+            if (_pc >= localVariableInfo.getStart() - 1 && _pc <= (localVariableInfo.getStart() + localVariableInfo.getLength())
+                  && _index == localVariableInfo.getVariableIndex()) {
+               returnValue = localVariableInfo;
+               break;
+            }
+         }
+         // System.out.println("returning " + returnValue);
+         return (returnValue);
+      }
+
+      String getVariableName(int _pc, int _index) {
+         String returnValue = "unknown";
+         LocalVariableInfo localVariableInfo = (LocalVariableInfo) getVariable(_pc, _index);
+         if (localVariableInfo != null) {
+            returnValue = ((Var) localVariableInfo).name;
+         }
+         // System.out.println("returning " + returnValue);
+         return (returnValue);
       }
 
       @Override public Iterator<LocalVariableInfo> iterator() {
-- 
GitLab