This is the mail archive of the frysk@sourceware.org mailing list for the frysk project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch review


Stan,

Please take a look at the attached patch.

Here is what it does:
- Create a new class called Variable to store the static information corresponding to a c variable.
- Store the information that was previously stored as arrays in Scope.java to be stored in a LinkedList of Variable objects.
- Make Subprogram extend Scope so that it can own variables as well as LexicalBlock.


The test-suit passes.

If this patch is okay next would be to look at the information stored in Variable (we can probably get rid of the dies stored there), and make Variable, and Scope self constructing (ie given a die they figure out their contents).

Cheers!
 Sami
? cvsdiff
Index: frysk-core/frysk/debuginfo/DebugInfo.java
===================================================================
RCS file: /cvs/frysk/frysk-core/frysk/debuginfo/DebugInfo.java,v
retrieving revision 1.6
diff -u -r1.6 DebugInfo.java
--- frysk-core/frysk/debuginfo/DebugInfo.java	4 Jun 2007 14:22:48 -0000	1.6
+++ frysk-core/frysk/debuginfo/DebugInfo.java	5 Jun 2007 14:25:38 -0000
@@ -64,6 +64,7 @@
 import frysk.rt.Frame;
 import frysk.rt.LexicalBlock;
 import frysk.rt.Subprogram;
+import frysk.rt.Variable;
 import frysk.dwfl.DwflFactory;
 import frysk.expr.CppParser;
 import frysk.expr.CppLexer;
@@ -493,18 +494,14 @@
            nParms += 1;
            parm = parm.getSibling();
          }
-       block.setVariables(nParms);
-       Value vars[] = block.getVariables();
-       block.setVariableDies(nParms);
-       DwarfDie dies[] = block.getVariableDies();
-       block.setTypeDies(nParms);
-       DwarfDie types[] = block.getTypeDies();
+
        parm = firstVar;
        nParms = 0;
        while (parm != null)
          {
-           vars[nParms] = debugInfoEvaluator[0].getValue(parm);
-           if (vars[nParms] == null)
+           Variable variable = new Variable();
+           variable.setVariable(debugInfoEvaluator[0].getValue(parm));
+           if (variable.getVariable() == null)
              {
                int tag = parm.getTag();
                switch (tag)
@@ -516,11 +513,11 @@
                  case DwTagEncodings.DW_TAG_structure_type_:
                  case DwTagEncodings.DW_TAG_subrange_type_:
                  case DwTagEncodings.DW_TAG_typedef_:
-                   types[nParms] = parm;
+                   variable.setTypeDie(parm);
                }
              }
            else
-             dies[nParms] = parm;
+             variable.setVariableDie(parm);
            parm = parm.getSibling();
            nParms += 1;
          }
@@ -535,20 +532,31 @@
              System.out.println(parameter.getText());
            }
            LexicalBlock b = subPr.getBlock();
-           Value v[] = b.getVariables();
+           LinkedList variables =  b.getVariables();
+//           Value v[] = b.getVariables();
            System.out.println("Variables");
-           for (int j = 0; j < v.length; j++)
-             if (v[j] != null)
-               System.out.println(v[j].getText());
-           DwarfDie d[] = b.getVariableDies();
-           for (int j = 0; j < d.length; j++)
-             if (d[j] != null)
-               System.out.println(d[j].getName());
-           DwarfDie t[] = b.getTypeDies();
-           System.out.println("Types");
-           for (int j = 0; j < t.length; j++)
-             if (t[j] != null)
-               System.out.println(t[j].getName());
+           
+           iterator = b.getVariables().iterator();
+           while (iterator.hasNext())
+            {
+              Variable variable = (Variable) iterator.next();
+              System.out.println(variable.getVariable().getText());
+            }
+           
+           iterator = b.getVariables().iterator();
+           while (iterator.hasNext())
+            {
+              Variable variable = (Variable) iterator.next();
+              System.out.println(variable.getVariableDie().getName());
+            }
+           
+           iterator = b.getVariables().iterator();
+           while (iterator.hasNext())
+            {
+              Variable variable = (Variable) iterator.next();
+              System.out.println(variable.getTypeDie().getName());
+            }
+           
          }
        
        return subPr;
Index: frysk-core/frysk/debuginfo/DebugInfoEvaluator.java
===================================================================
RCS file: /cvs/frysk/frysk-core/frysk/debuginfo/DebugInfoEvaluator.java,v
retrieving revision 1.3
diff -u -r1.3 DebugInfoEvaluator.java
--- frysk-core/frysk/debuginfo/DebugInfoEvaluator.java	4 Jun 2007 14:22:48 -0000	1.3
+++ frysk-core/frysk/debuginfo/DebugInfoEvaluator.java	5 Jun 2007 14:25:38 -0000
@@ -44,26 +44,20 @@
 import inua.eio.ByteOrder;
 
 import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
-import java.lang.Integer;
 
 import lib.dw.BaseTypes;
+import lib.dw.DwAtEncodings;
 import lib.dw.DwException;
+import lib.dw.DwOpEncodings;
+import lib.dw.DwTagEncodings;
 import lib.dw.DwarfDie;
 import lib.dw.Dwfl;
 import lib.dw.DwflDieBias;
-import lib.dw.DwOpEncodings;
-import lib.dw.DwAtEncodings;
-import lib.dw.DwTagEncodings;
 import frysk.dwfl.DwflFactory;
 import frysk.expr.CppSymTab;
-import frysk.value.ArithmeticType;
-import frysk.value.ArrayType;
-import frysk.value.ClassType;
-import frysk.value.EnumType;
-import frysk.value.PointerType;
-import frysk.value.Type;
-import frysk.value.Value;
 import frysk.proc.Isa;
 import frysk.proc.Task;
 import frysk.proc.ptrace.AddressSpaceByteBuffer;
@@ -71,8 +65,16 @@
 import frysk.rt.LexicalBlock;
 import frysk.rt.StackFactory;
 import frysk.rt.Subprogram;
+import frysk.rt.Variable;
 import frysk.sys.Errno;
 import frysk.sys.Ptrace.AddressSpace;
+import frysk.value.ArithmeticType;
+import frysk.value.ArrayType;
+import frysk.value.ClassType;
+import frysk.value.EnumType;
+import frysk.value.PointerType;
+import frysk.value.Type;
+import frysk.value.Value;
 
 class DebugInfoEvaluator
     implements CppSymTab
@@ -498,17 +500,18 @@
     DwarfDie die = bias.die;
 
     LexicalBlock b = subprogram.getBlock();
-    Value vars[] = b.getVariables();
-    DwarfDie varDies[] = b.getVariableDies();
+    LinkedList variables = b.getVariables();
+//    Value vars[] = b.getVariables();
+//    DwarfDie varDies[] = b.getVariableDies();
     DwarfDie varDie;
-    for (int j = 0; j < vars.length; j++)
-      if (vars[j] != null && vars[j].getText().compareTo(s) == 0)
-        {
-          allDies = die.getScopes(pc - bias.bias);
-          varDies[j].setScopes(allDies);
-          return varDies[j];
-        }
-          
+    Iterator iterator = variables.iterator();
+    while(iterator.hasNext()){
+      Variable variable = (Variable) iterator.next();
+      if(variable.getVariable().getText().equals(s)){
+        return variable.getVariableDie();
+      }
+    }
+
     allDies = die.getScopes(pc - bias.bias);
     varDie = die.getScopeVar(allDies, s);
     // Do we have something above didn't find, e.g. DW_TAG_enumerator?
Index: frysk-core/frysk/rt/Scope.java
===================================================================
RCS file: /cvs/frysk/frysk-core/frysk/rt/Scope.java,v
retrieving revision 1.1
diff -u -r1.1 Scope.java
--- frysk-core/frysk/rt/Scope.java	4 Jun 2007 15:23:57 -0000	1.1
+++ frysk-core/frysk/rt/Scope.java	5 Jun 2007 14:25:38 -0000
@@ -39,9 +39,9 @@
 
 package frysk.rt;
 
+import java.util.LinkedList;
+
 import lib.dw.DwarfDie;
-import frysk.value.Type;
-import frysk.value.Value;
 
 /**
  * A class to represent a Scope.
@@ -63,40 +63,19 @@
  */
 public class Scope
 {
-  LexicalBlock outer;
-  Value[] variables;
-  DwarfDie[] variableDies;
-  Type[] types;
-  DwarfDie[] typeDies;
-
-  public Value[] getVariables ()
-  {
-    return variables;
-  }
-
-  public void setVariables (int n)
-  {
-    this.variables = new Value[n];
+  LinkedList variables;
+  Scope outer;
+  
+  Scope(DwarfDie die){
+    this.variables = new LinkedList();
+  }
+  
+  Scope(){
+    this.variables = new LinkedList();
+  }
+  
+  public LinkedList getVariables(){
+    return this.variables;
   }
-
-  public DwarfDie[] getVariableDies ()
-  {
-    return variableDies;
-  }
-
-  public void setVariableDies (int n)
-  {
-    this.variableDies = new DwarfDie[n];
-  }
-
-  public DwarfDie[] getTypeDies ()
-  {
-    return typeDies;
-  }
-
-  public void setTypeDies (int n)
-  {
-    this.typeDies = new DwarfDie[n];
-  }
-
+  
 }
Index: frysk-core/frysk/rt/Subprogram.java
===================================================================
RCS file: /cvs/frysk/frysk-core/frysk/rt/Subprogram.java,v
retrieving revision 1.6
diff -u -r1.6 Subprogram.java
--- frysk-core/frysk/rt/Subprogram.java	4 Jun 2007 20:24:41 -0000	1.6
+++ frysk-core/frysk/rt/Subprogram.java	5 Jun 2007 14:25:38 -0000
@@ -51,7 +51,7 @@
 import frysk.debuginfo.DebugInfo;
 import frysk.value.Value;
 
-public class Subprogram
+public class Subprogram extends Scope
 {
   // Language language;
     Subprogram outer;
Index: frysk-core/frysk/rt/Variable.java
===================================================================
RCS file: frysk-core/frysk/rt/Variable.java
diff -N frysk-core/frysk/rt/Variable.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ frysk-core/frysk/rt/Variable.java	5 Jun 2007 14:25:38 -0000
@@ -0,0 +1,95 @@
+// This file is part of the program FRYSK.
+//
+// Copyright 2007, Red Hat Inc.
+//
+// FRYSK is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by
+// the Free Software Foundation; version 2 of the License.
+//
+// FRYSK is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+// 
+// You should have received a copy of the GNU General Public License
+// along with FRYSK; if not, write to the Free Software Foundation,
+// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+// 
+// In addition, as a special exception, Red Hat, Inc. gives You the
+// additional right to link the code of FRYSK with code not covered
+// under the GNU General Public License ("Non-GPL Code") and to
+// distribute linked combinations including the two, subject to the
+// limitations in this paragraph. Non-GPL Code permitted under this
+// exception must only link to the code of FRYSK through those well
+// defined interfaces identified in the file named EXCEPTION found in
+// the source code files (the "Approved Interfaces"). The files of
+// Non-GPL Code may instantiate templates or use macros or inline
+// functions from the Approved Interfaces without causing the
+// resulting work to be covered by the GNU General Public
+// License. Only Red Hat, Inc. may make changes or additions to the
+// list of Approved Interfaces. You must obey the GNU General Public
+// License in all respects for all of the FRYSK code and other code
+// used in conjunction with FRYSK except the Non-GPL Code covered by
+// this exception. If you modify this file, you may extend this
+// exception to your version of the file, but you are not obligated to
+// do so. If you do not wish to provide this exception without
+// modification, you must delete this exception statement from your
+// version and license this file solely under the GPL without
+// exception.
+
+
+package frysk.rt;
+
+import lib.dw.DwarfDie;
+import frysk.value.Type;
+import frysk.value.Value;
+
+/**
+ * This class contains the static information corresponding to a language variable.
+ * Given a frame it is possible to get a Value corresponding to this Variable
+ */
+public class Variable
+{
+
+  private Value variable;
+  private DwarfDie variableDie;
+  private Type type;
+  private DwarfDie typeDie;
+  
+  public void setVariable (Value variable)
+  {
+    this.variable = variable;
+  }
+  public Value getVariable ()
+  {
+    return variable;
+  }
+  public void setVariableDie (DwarfDie variableDie)
+  {
+    this.variableDie = variableDie;
+  }
+  public DwarfDie getVariableDie ()
+  {
+    return variableDie;
+  }
+  public void setType (Type type)
+  {
+    this.type = type;
+  }
+  public Type getType ()
+  {
+    return type;
+  }
+  public void setTypeDie (DwarfDie typeDie)
+  {
+    this.typeDie = typeDie;
+  }
+  public DwarfDie getTypeDie ()
+  {
+    return typeDie;
+  }
+
+  public Value getValue(Frame frame){
+    return null;
+  }
+}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]