summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--output/ex16.java2
-rw-r--r--st/ClassInstance.java35
-rw-r--r--st/SymbolTable.java2
3 files changed, 32 insertions, 7 deletions
diff --git a/output/ex16.java b/output/ex16.java
index 71dcede..c8d21f7 100644
--- a/output/ex16.java
+++ b/output/ex16.java
@@ -11,6 +11,8 @@ class Test {
public int start() {
i = new int[10];
+ test = new Test();
+ System.out.println(2);
test = (test).next();
return 0;
}
diff --git a/st/ClassInstance.java b/st/ClassInstance.java
index d51446f..804b1b0 100644
--- a/st/ClassInstance.java
+++ b/st/ClassInstance.java
@@ -29,13 +29,9 @@ public class ClassInstance extends AbstractInstance {
else
return false;
- if (o.getName().equals(this.getName())) {
- MinimalLogger.info(String.format("Found extension end."));
- if (o.getExtend() != null && o.getExtend().equals(this.getExtend()))
- throw new TypecheckException(String.format("Recursive extension on %s detected",
- this.toString()));
+ if (o.getName().equals(this.getName()))
return true;
- } else
+ else
MinimalLogger.info(String.format("I (%s) do not have the same name as %s... Checking if I extend...",
this.getName(), o.getName()));
@@ -53,6 +49,33 @@ public class ClassInstance extends AbstractInstance {
return false;
}
+ public void recursiveExtendFilter() {
+ ClassInstance ce = this.getExtend();
+ if (ce != null)
+ this.findMyselfHelper(ce);
+ }
+
+ public boolean findMyselfHelper(ClassInstance c) {
+ /**
+ * Returns true if there is a path through extensions that reaches
+ * the original class. Such a case is a type error.
+ */
+ if (this.getName().equals(c.getName())) {
+ MinimalLogger.info(String.format("%s is part of an extension loop!",
+ this.getName()));
+ throw new TypecheckException(String.format("Recursive extension detected!"));
+ }
+
+ if (c.getExtend() == null) {
+ MinimalLogger.info(String.format("Search ended at %s.",
+ c.getName()));
+ return false;
+ }
+
+ ClassInstance ce = c.getExtend();
+ return this.findMyselfHelper(ce);
+ }
+
public ClassInstance getExtend() {
/**
* Returns the parent class, or
diff --git a/st/SymbolTable.java b/st/SymbolTable.java
index 7b509b2..68a2829 100644
--- a/st/SymbolTable.java
+++ b/st/SymbolTable.java
@@ -56,7 +56,7 @@ public class SymbolTable {
cls.getName(),
ext.getName()));
cls.setExtend(ext);
- ext.equalsOnExtend(cls); // finds recursive extensions
+ cls.recursiveExtendFilter();
TokenKey k;
for (TypeInstance t : ext.getLocals()) {
k = new TokenKey(t.getName(), TypeEnum.integer,