Permalink
Browse files

Use MedicalLogicModule to represent compiled MLM; use separate class …

…that gets instanciated for every execution.

git-svn-id: https://elmar.ips.cs.tu-bs.de/svn/arden2bytecode/trunk@4 20415b1c-3eea-de11-af57-000476a39db3
  • Loading branch information...
1 parent b5d4c48 commit 35de2552b5d6bede9ed7db2a3ef8e8955c90821c @dgrunwald committed Dec 23, 2009
Oops, something went wrong.
@@ -0,0 +1,4 @@
+#Wed Dec 23 16:26:40 CET 2009
+eclipse.preferences.version=1
+formatter_profile=_MyProfile
+formatter_settings_version=11
View
@@ -0,0 +1,11 @@
+License: GPL (because arden.scc is GPL)
+
+
+To compile the parser in Eclipse:
+ 1. Create an external tool configuration:
+ Location: javaw.exe (from your Java runtime)
+ Working directory: ${container_loc}
+ Arguments: -classpath ${project_loc}\tools\sablecc.jar org.sablecc.sablecc.SableCC ${resource_name}
+
+ 2. Select the file "arden.scc" and run SableCC.
+ 3. Right-click "src" and press Refresh so that Eclipse loads the generated files.
@@ -1,11 +1,10 @@
package arden.codegenerator;
/**
- * Diese Exception tritt auf, wenn eines der Limits des Class-File-Formates zu
- * überschreiten.
- *
- * @author daniel
+ * This exceptions occurs when one of the limits of the .class file format is
+ * exceeded.
*
+ * @author Daniel Grunwald
*/
public class ClassFileLimitExceededException extends RuntimeException {
@@ -17,7 +16,7 @@ public ClassFileLimitExceededException() {
public ClassFileLimitExceededException(String message) {
super(message);
}
-
+
public ClassFileLimitExceededException(Exception inner) {
super(inner);
}
@@ -11,8 +11,7 @@
/**
* Class for writing .class files
*
- * @author daniel
- *
+ * @author Daniel Grunwald
*/
public class ClassFileWriter {
ConstantPool pool = new ConstantPool();
@@ -122,8 +121,7 @@ public MethodWriter createStaticInitializer() {
/** Saves the class file to disk */
public void save(String filename) throws IOException {
- DataOutputStream s = new DataOutputStream(
- new FileOutputStream(filename));
+ DataOutputStream s = new DataOutputStream(new FileOutputStream(filename));
try {
save(s);
} finally {
@@ -11,10 +11,9 @@
import java.util.HashMap;
/**
- * Repräsentiert den ConstantPool in einer Java .class-Datei
- *
- * @author daniel
+ * Represents the constant pool inside a Java class file.
*
+ * @author Daniel Grunwald
*/
public class ConstantPool {
static final byte CONSTANT_Class = 7;
@@ -45,15 +44,17 @@
private ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
private DataOutputStream data = new DataOutputStream(byteOutputStream);
- // gets the index for the new constant pool entry being created
+ /** gets the index for the new constant pool entry being created */
private int getNextIndex() {
if (elementNumber >= 65534)
throw new ClassFileLimitExceededException("Too many constants.");
return ++elementNumber;
}
- // gets the index for the new constant pool entry being created for a double
- // or long value
+ /**
+ * gets the index for the new constant pool entry being created for a double
+ * or long value
+ */
private int getNextDoubleIndex() {
int index = getNextIndex();
if (elementNumber >= 65534)
@@ -62,7 +63,7 @@ private int getNextDoubleIndex() {
return index;
}
- /** Speichert den ConstantPool in die .class-Datei */
+ /** Saves the ConstantPool into a .class-file */
public void save(DataOutput output) throws IOException {
data.flush(); // ensure the DataOutputStream writes everything to the
// ByteArrayOutputStream
@@ -71,11 +72,11 @@ public void save(DataOutput output) throws IOException {
}
/**
- * Findet einen vorhandenen Integer-Eintrag oder erstellt einen neuen.
+ * Finds an existing Integer-entry or creates a new entry.
*
* @param value
- * Der Wert des integers
- * @return Nummer des Integer-Eintrages
+ * The value of the entry.
+ * @return The index of the entry.
*/
public int getInteger(Integer value) {
if (integer_map.containsKey(value))
@@ -92,11 +93,11 @@ public int getInteger(Integer value) {
}
/**
- * Findet einen vorhandenen Double-Eintrag oder erstellt einen neuen.
+ * Finds an existing Double-entry or creates a new entry.
*
* @param value
- * Der Wert des doubles
- * @return Nummer des Double-Eintrages
+ * The value of the entry.
+ * @return The index of the entry.
*/
public int getDouble(Double value) {
if (double_map.containsKey(value))
@@ -113,11 +114,11 @@ public int getDouble(Double value) {
}
/**
- * Findet einen vorhandenen Long-Eintrag oder erstellt einen neuen.
+ * Finds an existing Long-entry or creates a new entry.
*
* @param value
- * Der Wert des longs
- * @return Nummer des Long-Eintrages
+ * The value of the entry.
+ * @return The index of the entry.
*/
public int getLong(Long value) {
if (long_map.containsKey(value))
@@ -134,11 +135,11 @@ public int getLong(Long value) {
}
/**
- * Findet einen vorhandenen Utf8-Eintrag oder erstellt einen neuen.
+ * Finds an existing Utf8-entry or creates a new entry.
*
- * @param text
- * Der Text des Eintrages
- * @return Nummer des Utf8-Eintrages
+ * @param value
+ * The value of the entry.
+ * @return The index of the entry.
*/
public int getUtf8(String text) {
if (utf8_map.containsKey(text))
@@ -158,11 +159,11 @@ public int getUtf8(String text) {
}
/**
- * Findet einen vorhandenen String-Eintrag oder erstellt einen neuen.
+ * Finds an existing String-entry or creates a new entry.
*
- * @param text
- * Der Text des Eintrages
- * @return Nummer des String-Eintrages
+ * @param value
+ * The value of the entry.
+ * @return The index of the entry.
*/
public int getString(String text) {
if (string_map.containsKey(text))
@@ -180,12 +181,11 @@ public int getString(String text) {
}
/**
- * Findet einen vorhandenen Class-Eintrag oder erstellt einen neuen.
+ * Finds an existing Class-entry or creates a new entry.
*
* @param classSym
- * Das Klassen-Symbol, für das der Class-Eintrag erstellt werden
- * soll
- * @return Nummer des Class-Eintrages
+ * The target class.
+ * @return Index of the Class-entry.
*/
public int getClass(Class<?> classSym) {
if (classSym == null)
@@ -194,14 +194,13 @@ public int getClass(Class<?> classSym) {
}
/**
- * Findet einen vorhandenen Class-Eintrag für einen Array-Typen oder
- * erstellt einen neuen.
+ * Finds an existing Class-entry for an array type or creates a new entry.
*
* @param elementType
- * Der Elementtyp des Arrays
+ * The array element type
* @param arrayNestingLevel
- * Verschachtelungstiefe des Arrays
- * @return Nummer des Class-Eintrages
+ * Nesting level of the array
+ * @return Index of the Class-entry
*/
public int getClass(Class<?> elementType, int arrayNestingLevel) {
if (elementType == null)
@@ -215,20 +214,20 @@ public int getClass(Class<?> elementType, int arrayNestingLevel) {
return getClassByJavaName(b.toString());
}
- /** Ermittelt den Java-Namen der Klasse */
+ /** Calculates the internal Java name of the class */
static String getInternalJavaName(Class<?> classSym) {
if (classSym.isArray() || classSym.isPrimitive())
throw new IllegalArgumentException("Cannot use array classes or primitive classes");
return classSym.getName().replace('.', '/');
}
/**
- * Findet einen vorhandenen Class-Eintrag für einen Typen oder erstellt
- * einen neuen.
+ * Finds an existing Class-entry or creates a new entry.
*
* @param internalJavaName
- * Der interne Java-Name des Typen (z.B. '[Lopa/runtime/Object;')
- * @return Nummer des Class-Eintrages
+ * The internal Java name of the Type (e.g.
+ * '[Ljava/lang/Object;')
+ * @return Index of the Class-entry.
*/
public int getClassByJavaName(String internalJavaName) {
if (class_map.containsKey(internalJavaName))
@@ -246,11 +245,11 @@ public int getClassByJavaName(String internalJavaName) {
}
/**
- * Findet einen vorhandenen Fieldref-Eintrag oder erstellt einen neuen.
+ * Finds an existing Fieldref-entry or creates a new entry.
*
* @param field
- * Das Feld, für das der Fieldref-Eintrag erstellt werden soll
- * @return Nummer des Fieldref-Eintrages
+ * The target Field.
+ * @return Index of the Fieldref-Entry
*/
public FieldReference getFieldref(Field field) {
if (field == null)
@@ -307,19 +306,20 @@ else if (type.equals(Boolean.TYPE))
}
/**
- * Findet einen vorhandenen Methodref-Eintrag oder erstellt einen neuen.
+ * Finds an existing Methodref-entry or creates a new entry.
*
* @param method
- * Das Feld, für das der Methodref-Eintrag erstellt werden soll
- * @return Nummer des Methodref-Eintrages
+ * The target method.
+ * @return Index of the Methodref-entry.
*/
public int getMethodref(Method method) {
if (method == null)
throw new IllegalArgumentException();
if (methodref_map.containsKey(method))
return methodref_map.get(method);
int classRef = getClass(method.getDeclaringClass());
- int natRef = getNameAndType(method.getName(), createMethodDescriptor(method.getParameterTypes(), method.getReturnType()));
+ int natRef = getNameAndType(method.getName(), createMethodDescriptor(method.getParameterTypes(), method
+ .getReturnType()));
int index = getNextIndex();
methodref_map.put(method, index);
try {
@@ -347,12 +347,11 @@ static String createMethodDescriptor(Class<?>[] parameters, Class<?> returnType)
}
/**
- * Findet die Methodref für den Java-Konstruktor, der aus einem Java Wert
- * einen OPA-Runtimeobjekt macht
+ * Finds an existing Method-entry for a constructor or creates a new entry.
*
* @param ctor
- * Der Konstruktor.
- * @return Nummer des Eintrags im Constant-Pool
+ * The target constructor.
+ * @return Index of the entry
*/
public int getConstructor(Constructor<?> ctor) {
if (constructor_map.containsKey(ctor))
@@ -372,14 +371,14 @@ public int getConstructor(Constructor<?> ctor) {
}
/**
- * Findet einen vorhandenen NameAndType-Eintrag oder erstellt einen neuen.
+ * Finds an existing NameAndType-entry or creates a new entry.
*
* @param name
- * Der Name des NameAndType-Eintrages
+ * The name of the entry
* @param typeDescriptor
- * Der Typ des Eintrages (Java FieldDescriptor oder
+ * The type of the entry (Java FieldDescriptor or
* MethodDescriptor)
- * @return Nummer des NameAndType-Eintrages
+ * @return Index of the entry
*/
public int getNameAndType(String name, String typeDescriptor) {
NameTypePair ntp = new NameTypePair(name, typeDescriptor);
@@ -1,6 +1,10 @@
package arden.codegenerator;
-/** Represents a field referenced in the constant pool. */
+/**
+ * Represents a field referenced in the constant pool.
+ *
+ * @author Daniel Grunwald
+ */
public class FieldReference {
final int index;
@@ -1,23 +1,22 @@
package arden.codegenerator;
/**
- * Repräsentiert eine Sprungmarke im Bytecode.
+ * Represents a jump label inside the byte code.
*
- * Verwendung: <br>
- * {@code Label marke = new Label(); } <br>
- * {@code methodWriter.jump(marke); // Springe vorwärts (zu noch nicht definierter
- * Marke) } <br>
- * {@code ... // Generiere mehr Code } <br>
- * {@code methodWriter.mark(marke); // Plaziere Sprungmarke }
+ * Usage: <br>
+ * {@code Label label = new Label(); } <br>
+ * {@code methodWriter.jump(label); // Jump forwards (target label not yet defined) } <br>
+ * {@code ... // generate more Code } <br>
+ * {@code methodWriter.mark(label); // Place jump label }
*
- * @author daniel
+ * @author Daniel Grunwald
*
*/
public class Label {
- /** Zielposition, auf die das Label zeigt, -1=noch nicht gesetzt */
+ /** Target position (byte index where the label is pointing to), -1=not yet set */
int markedPosition = -1;
- /** Stackgröße an Zielposition, -1=noch unbekannt */
+ /** Stack size at target position, -1=currently unknown */
int stackSize = -1;
- /** Am Anfang true, wird von markForwardOnly() auf false gesetzt um zu signalisieren, dass Rücksprünge verboten sind */
+ /** Initially true, is set to false by markForwardOnly() to signal that backward jumps are forbidden */
boolean allowJumps = true;
}
@@ -1,15 +1,22 @@
package arden.codegenerator;
+/**
+ * Used internally by MethodWriter to resolve offsets between Labels. Represents
+ * a place in the byte code that references a label (e.g. parameter of jump
+ * instructions).
+ *
+ * @author Daniel Grunwald
+ */
class LabelReference {
/** the position of the first byte of the jump offset */
final int referencePosition;
/** the base position (start position of the jump instruction) */
final int basePosition;
-
+
final Label label;
-
+
final boolean is32BitOffset;
-
+
public LabelReference(int referencePosition, int basePosition, Label label, boolean is32BitOffset) {
this.referencePosition = referencePosition;
this.basePosition = basePosition;
Oops, something went wrong.

0 comments on commit 35de255

Please sign in to comment.