|
From: <ha...@us...> - 2008-07-28 00:11:55
|
Revision: 2098
http://cogkit.svn.sourceforge.net/cogkit/?rev=2098&view=rev
Author: hategan
Date: 2008-07-28 00:11:50 +0000 (Mon, 28 Jul 2008)
Log Message:
-----------
updated compiler stuff
Modified Paths:
--------------
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Compiler.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/InlineFunction.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Lambda.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/NativeFunction.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/OutputContext.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/QName.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Scope.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Self.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/State.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Type.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/VarRef.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Access.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Catch.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Def.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Export.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/For.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Function.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/If.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Import.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Invoke.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/InvokeField.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/KType.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Main.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Named.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Native.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Or.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/ParallelFor.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Set.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/StringToken.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Var.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/types/AltType.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/types/ChannelType.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/types/NamedType.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/types/Null.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/types/SimpleType.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/types/TypeReductor.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/types/Types.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/types/UnionType.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/types/UnknownType.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/types/UserType.java
Added Paths:
-----------
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/ProcessWaiter.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/TypeDecl.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/types/PartialType.java
Removed Paths:
-------------
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/InlineValue.java
branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/TypedValue.java
Modified: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Compiler.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Compiler.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Compiler.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -24,6 +24,7 @@
import org.globus.cog.karajan.Loader;
import org.globus.cog.karajan.compiler.kernel.*;
import org.globus.cog.karajan.compiler.types.Types;
+import org.globus.cog.karajan.compiler.types.UnknownType;
import org.globus.cog.karajan.parser.ElementTree;
import org.globus.cog.karajan.parser.Node;
import org.globus.cog.karajan.runtime.Context;
@@ -43,6 +44,8 @@
private File tmpdir;
+ private static Scope kernel;
+
public Compiler() {
}
@@ -68,6 +71,10 @@
return analyze(tree.getRoot(), className(tree));
}
+ public String className(String ident) {
+ return replaceSymbols(base(ident));
+ }
+
public String className(ElementTree tree) {
return replaceSymbols(base(tree.getName()));
}
@@ -122,7 +129,7 @@
Writer wr = new IndentingWriter(new FileWriter(of));
oc.commit(wr);
wr.close();
- //copyFile(of, "../src/" + of.getName());
+ copyFile(of, "../src/" + of.getName());
compileJava(of);
return new File(of.getParentFile(), name);
}
@@ -143,7 +150,7 @@
State state = new State(kernel);
state = state.forkScope();
state.setClassName("");
- return analize(root, state);
+ return analyze(root, state);
}
catch (VariableNotFoundException e) {
throw new CompilationException(root, e);
@@ -221,8 +228,9 @@
ByteArrayOutputStream err = new ByteArrayOutputStream();
InputStream os = p.getInputStream();
InputStream es = p.getErrorStream();
+ ProcessWaiter pw = ProcessWaiter.waitFor(p);
byte[] buf = new byte[128];
- while (!processDone(p)) {
+ while (!pw.isDone()) {
int oa = os.available();
if (oa > 0) {
int len = os.read(buf, 0, Math.min(oa, buf.length));
@@ -234,22 +242,12 @@
err.write(buf, 0, len);
}
if (oa + ea == 0) {
- Thread.sleep(20);
+ Thread.sleep(50);
}
}
return new String[] { out.toString(), err.toString() };
}
- private boolean processDone(Process p) {
- try {
- p.exitValue();
- return true;
- }
- catch (IllegalThreadStateException e) {
- return false;
- }
- }
-
private void copyFile(File src, String dest) throws IOException {
byte[] buf = new byte[1024];
FileInputStream fis = new FileInputStream(src);
@@ -270,7 +268,7 @@
String name = def.compile(node, oc);
}
- private Type analize(Node node, State state) throws CompilationException,
+ private Type analyze(Node node, State state) throws CompilationException,
VariableNotFoundException {
Def def = state.getScope().lookupDef(new QName(node.getNodeType()));
return def.analyze(node, state);
@@ -278,64 +276,93 @@
public static final String KERNELNS = "k";
- private Scope initializeKernel() {
- Scope s = new Scope();
- addDef(s, "__pipe_", new Or());
- addDef(s, "seq", new Seq());
- addDef(s, "par", new Par());
- addDef(s, "main", new Main());
- addDef(s, "set", new Set());
- addDef(s, "var", new Var());
- addDef(s, "::", new Access());
- addDef(s, "number", new Num());
- addDef(s, "string", new Str());
- addDef(s, "native", new Native());
- addDef(s, "function", new Function());
- addDef(s, "type", new KType());
- addDef(s, "named", new Named());
- addDef(s, "bref", new GenericSeq());
- addDef(s, "block", new GenericSeq());
- // addDef(s, "connect", new GenericSeq());
- addDef(s, "to", new GenericSeq());
- addDef(s, "if", new If());
- addDef(s, "for", new For());
- addDef(s, "import", new Import());
- addDef(s, "export", new Export());
- addDef(s, "parallelFor", new ParallelFor());
- addDef(s, "future", new Future());
- addDef(s, "to", new ToChannel());
- addDef(s, "from", new FromChannel());
- addDef(s, "try", new Try());
- addDef(s, "catch", new Catch());
- addDef(s, "namespace", new Namespace());
- s.set(s.addVar(new QName("k", "true")), new InlineValue(Types.BOOLEAN,
- Boolean.TRUE, "Boolean.TRUE"));
- s.set(s.addVar(new QName("k", "false")), new InlineValue(Types.BOOLEAN,
- Boolean.FALSE, "Boolean.FALSE"));
- addType(s, "Integer", Types.INTEGER);
- addType(s, "Real", Types.REAL);
- addType(s, "Boolean", Types.BOOLEAN);
- addType(s, "String", Types.STRING);
- KERNEL = new Context(s.size());
- for (int i = 0; i < s.size(); i++) {
- KERNEL.set(i, s.get(i).type);
+ private Scope initializeKernel() throws CompilationException {
+ synchronized (Compiler.class) {
+ if (kernel != null) {
+ return kernel;
+ }
+ Scope s = new Scope();
+ addDef(s, "__pipe_", new Or());
+ addDef(s, "typedecl", new TypeDecl());
+ addDef(s, "seq", new Seq());
+ addDef(s, "par", new Par());
+ addDef(s, "main", new Main());
+ addDef(s, "set", new Set());
+ addDef(s, "var", new Var());
+ addDef(s, "identifier", new Var());
+ addDef(s, "::", new Access());
+ addDef(s, "number", new Num());
+ addDef(s, "string", new Str());
+ addDef(s, "native", new Native());
+ addDef(s, "function", new Function());
+ addDef(s, "type", new KType());
+ addDef(s, "named", new Named());
+ addDef(s, "bref", new GenericSeq());
+ addDef(s, "block", new GenericSeq());
+ // addDef(s, "connect", new GenericSeq());
+ addDef(s, "to", new GenericSeq());
+ addDef(s, "if", new If());
+ addDef(s, "for", new For());
+ addDef(s, "import", new Import());
+ addDef(s, "export", new Export());
+ addDef(s, "parallelFor", new ParallelFor());
+ addDef(s, "future", new Future());
+ addDef(s, "to", new ToChannel());
+ addDef(s, "from", new FromChannel());
+ addDef(s, "try", new Try());
+ addDef(s, "catch", new Catch());
+ addDef(s, "namespace", new Namespace());
+ addDef(s, "apply", new Invoke());
+ addValue(s, "true", Types.BOOLEAN.instance(Boolean.TRUE,
+ "Boolean.TRUE"));
+ addValue(s, "false", Types.BOOLEAN.instance(Boolean.FALSE,
+ "Boolean.FALSE"));
+ addValue(s, "nil", Types.NIL);
+ addSimpleType(s, "Integer", "INTEGER");
+ addSimpleType(s, "Real", "REAL");
+ addSimpleType(s, "Boolean", "BOOLEAN");
+ addSimpleType(s, "String", "STRING");
+ addSimpleType(s, "Type", "TYPE");
+ addType(s, "?", new UnknownType(), "new UnknownType()");
+ kernel = s;
+ return s;
}
- return s;
}
private void addDef(Scope s, String name, Def def) {
QName qn = new QName(KERNELNS, name);
VarRef ref = s.addVar(qn);
def.setName(qn);
- s.set(ref, new TypedValue(new Lambda(), def));
+ s.set(ref, new Lambda(def));
}
- private void addType(Scope s, String name, Type type) {
+ private void addValue(Scope s, String name, Type v) {
QName qn = new QName(KERNELNS, name);
VarRef ref = s.addVar(qn);
- s.set(ref, new TypedValue(type, type));
+ s.set(ref, v);
}
+ private void addSimpleType(Scope s, String name, String tfield)
+ throws CompilationException {
+ QName qn = new QName(KERNELNS, name);
+ VarRef ref = s.addVar(qn);
+ try {
+ Type t = (Type) Types.class.getField(tfield).get(null);
+ s.set(ref, Types.TYPE.instance(t, "Types." + tfield));
+ }
+ catch (Exception e) {
+ throw new CompilationException(null,
+ "Could not add type " + tfield, e);
+ }
+ }
+
+ private void addType(Scope s, String name, Type t, String repr)
+ throws CompilationException {
+ QName qn = new QName(KERNELNS, name);
+ VarRef ref = s.addVar(qn);
+ s.set(ref, Types.TYPE.instance(t, repr));
+ }
+
public static Context KERNEL;
public static void main(String[] args) {
@@ -343,10 +370,11 @@
error("Missing argument");
}
String project = args[0];
-
+
try {
ElementTree tree = Loader.load(project);
Compiler.getDefault().compile(tree);
+ System.exit(0);
}
catch (CompilationException e) {
e.printStackTrace();
Modified: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/InlineFunction.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/InlineFunction.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/InlineFunction.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -22,4 +22,9 @@
public String getInlineName() {
return inlineName;
}
+
+ @Override
+ public Lambda clone() {
+ return new InlineFunction(signature, inlineName);
+ }
}
Deleted: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/InlineValue.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/InlineValue.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/InlineValue.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -1,20 +0,0 @@
-//----------------------------------------------------------------------
-//This code is developed as part of the Java CoG Kit project
-//The terms of the license can be found at http://www.cogkit.org/license
-//This message may not be removed or altered.
-//----------------------------------------------------------------------
-
-/*
- * Created on Jun 13, 2008
- */
-package org.globus.cog.karajan.compiler;
-
-public class InlineValue extends TypedValue {
- public final String inlineValue;
-
- public InlineValue(Type type, Object value, String inlineValue) {
- super(type, value);
- this.inlineValue = inlineValue;
- }
-
-}
Modified: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Lambda.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Lambda.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Lambda.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -9,6 +9,7 @@
*/
package org.globus.cog.karajan.compiler;
+import org.globus.cog.karajan.compiler.kernel.Def;
import org.globus.cog.karajan.runtime.Signature;
@@ -18,6 +19,11 @@
public Lambda() {
}
+ public Lambda(Def def) {
+ this();
+ this.value = def;
+ }
+
public Lambda(Signature signature) {
this.signature = signature;
}
@@ -25,4 +31,13 @@
public String toString() {
return signature == null ? "[]" : signature.toString();
}
+
+ public Lambda clone() {
+ return new Lambda(signature);
+ }
+
+ @Override
+ public String repr() {
+ return "new Lambda(" + signature.repr() + ")";
+ }
}
Modified: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/NativeFunction.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/NativeFunction.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/NativeFunction.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -9,21 +9,100 @@
*/
package org.globus.cog.karajan.compiler;
+import java.io.InvalidClassException;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.globus.cog.karajan.runtime.NativeCallable;
import org.globus.cog.karajan.runtime.Signature;
public class NativeFunction extends Lambda {
- private int locals;
-
- public NativeFunction(Signature signature, int locals) {
- super(signature);
- this.locals = locals;
- }
-
- public int getLocals() {
- return locals;
- }
-
- public String toString() {
- return "native " + super.toString();
- }
+ private static final Map<String, NativeFunction> cache;
+ static {
+ cache = new HashMap<String, NativeFunction>();
+ }
+
+ private String clsname;
+ private NativeCallable prototype;
+
+ public NativeFunction(NativeCallable prototype, Signature signature, String clsname) {
+ super(signature);
+ this.clsname = clsname;
+ this.prototype = prototype;
+ }
+
+ public static NativeFunction getInstance(String clsname)
+ throws InvalidClassException {
+ NativeFunction t;
+ synchronized (cache) {
+ t = cache.get(clsname);
+ }
+ if (t == null) {
+ Class<NativeCallable> cls = getNativeClass(clsname);
+ t = buildNative(cls, clsname);
+ synchronized (cache) {
+ cache.put(clsname, t);
+ }
+ }
+ return t;
+ }
+
+ public static NativeFunction getInstance(Class<?> cls) {
+ try {
+ return getInstance(cls.getName());
+ }
+ catch (InvalidClassException e) {
+ throw new LinkageError(e.getMessage());
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ protected static Class<NativeCallable> getNativeClass(String clsname)
+ throws InvalidClassException {
+ try {
+ return (Class<NativeCallable>) Class.forName(clsname);
+ }
+ catch (ClassNotFoundException e) {
+ throw new InvalidClassException("Invalid native: " + clsname);
+ }
+ }
+
+ protected static NativeFunction buildNative(Class<NativeCallable> cls, String clsname)
+ throws InvalidClassException {
+ try {
+ Field f = cls.getField("SIGNATURE");
+ Signature p = (Signature) f.get(null);
+ if (p.getReturnType() == null) {
+ throw new InvalidClassException("Invalid native "
+ + cls.getName() + ". Return type is null");
+ }
+ return new NativeFunction(cls.newInstance(), p, clsname);
+ }
+ catch (InvalidClassException e) {
+ throw e;
+ }
+ catch (Exception e) {
+ throw new InvalidClassException("Invalid native " + cls.getName()
+ + ":" + e.getMessage());
+ }
+ }
+
+ @Override
+ public Lambda clone() {
+ return new NativeFunction(prototype, signature, clsname);
+ }
+
+ public String toString() {
+ return "native " + super.toString();
+ }
+
+ @Override
+ public String repr() {
+ return "NativeFunction.getInstance(" + clsname.replace('$', '.') + ".class)";
+ }
+
+ public Type invokeStatic(Type args) {
+ return prototype.invokeStatic(this, args);
+ }
}
Modified: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/OutputContext.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/OutputContext.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/OutputContext.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -95,12 +95,15 @@
return l;
}
- private int countNewLines(String str) {
+ private int countNewLines(final String str) {
int c = 0;
for (int i = 0; i < str.length(); i++) {
- if (Character.getType(str.charAt(i)) == Character.LINE_SEPARATOR) {
+ /*if (Character.getType(str.charAt(i)) == Character.LINE_SEPARATOR) {
c++;
- }
+ }*/
+ if (str.charAt(i) == '\n') {
+ c++;
+ }
}
return c;
}
Added: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/ProcessWaiter.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/ProcessWaiter.java (rev 0)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/ProcessWaiter.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -0,0 +1,50 @@
+//----------------------------------------------------------------------
+//This code is developed as part of the Java CoG Kit project
+//The terms of the license can be found at http://www.cogkit.org/license
+//This message may not be removed or altered.
+//----------------------------------------------------------------------
+
+/*
+ * Created on Jul 11, 2008
+ */
+package org.globus.cog.karajan.compiler;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+public class ProcessWaiter implements Runnable {
+ private static ExecutorService pool = Executors.newCachedThreadPool();
+
+ public static ProcessWaiter waitFor(Process p) {
+ ProcessWaiter pw = new ProcessWaiter(p);
+ pool.execute(pw);
+ return pw;
+ }
+
+ private Process p;
+ private int ec;
+
+ public ProcessWaiter(Process p) {
+ this.p = p;
+ ec = -1;
+ }
+
+
+ @Override
+ public void run() {
+ try {
+ ec = p.waitFor();
+ }
+ catch (InterruptedException e) {
+ ec = 250;
+ }
+ }
+
+ public int getExitCode() {
+ return ec;
+ }
+
+ public boolean isDone() {
+ return ec >= 0;
+ }
+}
Modified: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/QName.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/QName.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/QName.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -10,32 +10,38 @@
package org.globus.cog.karajan.compiler;
public final class QName {
- public final String ns;
- public final String name;
-
- public QName(String name) {
- int i = name.lastIndexOf('.');
- if (i == -1) {
- this.ns = null;
- this.name = name;
- }
- else {
- this.ns = name.substring(0, i);
- this.name = name.substring(i + 1);
- }
- }
-
- public QName(String ns, String name) {
- this.ns = ns;
- this.name = name;
- }
-
- public String toString() {
- if (ns == null) {
- return name;
- }
- else {
- return ns + "." + name;
- }
- }
+ public final String ns;
+ public final String name;
+
+ public QName(String name) {
+ if (name.equals("...")) {
+ this.ns = null;
+ this.name = name;
+ }
+ else {
+ int i = name.lastIndexOf('.');
+ if (i == -1) {
+ this.ns = null;
+ this.name = name;
+ }
+ else {
+ this.ns = name.substring(0, i);
+ this.name = name.substring(i + 1);
+ }
+ }
+ }
+
+ public QName(String ns, String name) {
+ this.ns = ns;
+ this.name = name;
+ }
+
+ public String toString() {
+ if (ns == null) {
+ return name;
+ }
+ else {
+ return ns + "." + name;
+ }
+ }
}
Modified: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Scope.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Scope.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Scope.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -17,9 +17,11 @@
import java.util.Map;
import org.globus.cog.karajan.compiler.kernel.Def;
+import org.globus.cog.karajan.compiler.types.Types;
+import org.globus.cog.karajan.compiler.types.UserType;
public class Scope {
- private List<TypedValue> values;
+ private List<Type> values;
private Map<String, Map<String, VarRef>> vars;
private Scope prev;
public int offset;
@@ -36,7 +38,7 @@
public Scope(Scope prev, boolean hard) {
vars = new HashMap<String, Map<String, VarRef>>();
- values = new ArrayList<TypedValue>();
+ values = new ArrayList<Type>();
softChildren = new ArrayList<Scope>();
hardChildren = new ArrayList<Scope>();
if (prev != null) {
@@ -56,6 +58,14 @@
name = prev.name + prev.softChildren.size();
}
}
+
+ public Scope dup() {
+ Scope s = new Scope();
+ s.hard = hard;
+ s.vars = vars;
+ s.values = values;
+ return s;
+ }
public Scope() {
this(null);
@@ -89,16 +99,19 @@
public Def lookupDef(QName name) {
VarRef ref = getVar(name);
- TypedValue tv = ref.get();
+ Type tv = ref.get();
if (tv == null) {
return null;
}
+ else if (tv.equals(Types.TYPE)) {
+ return null;
+ }
else {
return (Def) tv.value;
}
}
- public void set(VarRef ref, TypedValue value) {
+ public void set(VarRef ref, Type value) {
while (values.size() <= ref.addr) {
values.add(null);
}
@@ -113,11 +126,11 @@
return ref.addr;
}
- public TypedValue get(VarRef ref) {
+ public Type get(VarRef ref) {
return get(ref.addr);
}
- public TypedValue get(int index) {
+ public Type get(int index) {
try {
return values.get(index);
}
@@ -238,4 +251,15 @@
}
return depth;
}
+
+ public String allToString() {
+ StringBuffer sb = new StringBuffer();
+ sb.append(this.toString());
+ sb.append(", ");
+ for (Scope s : softChildren) {
+ sb.append(s.allToString());
+ sb.append(", ");
+ }
+ return sb.toString();
+ }
}
Modified: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Self.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Self.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Self.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -9,6 +9,52 @@
*/
package org.globus.cog.karajan.compiler;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.globus.cog.karajan.compiler.types.Types;
+
public class Self extends Lambda {
+ private List<CTask> runOnClose;
+ public Type org;
+ private String str;
+ public void runOnClose(CTask r) {
+ if (runOnClose == null) {
+ runOnClose = new LinkedList<CTask>();
+ }
+ runOnClose.add(r);
+ }
+
+ public void close(Type t) throws CompilationException {
+ org = t;
+ if (runOnClose != null) {
+ for (CTask r : runOnClose) {
+ r.run();
+ }
+ }
+ }
+
+ public static interface CTask {
+ void run() throws CompilationException;
+ }
+
+ @Override
+ public String toString() {
+ if (org == null) {
+ return "Self";
+ }
+ else {
+ return "s/" + org.toString();
+ }
+ }
+
+ public Type actualType() {
+ if (Types.TYPE.equals(org)) {
+ return (Type) org.value;
+ }
+ else {
+ return org;
+ }
+ }
}
Modified: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/State.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/State.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/State.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -33,11 +33,19 @@
public boolean customContextInitialization;
public boolean loop;
public boolean threadInit;
+ public String id;
+ private int crtid;
public State(State parent, Scope defs) {
this.scope = defs;
this.parent = parent;
lines = new HashMap<String, Map<LineMarker, Integer>>();
+ if (parent != null) {
+ id = parent.id + "/" + parent.crtid++;
+ }
+ else {
+ id = "0";
+ }
}
public State(Scope defs) {
@@ -93,6 +101,10 @@
public State forkScopeHard() {
return new State(this, new Scope(scope, true));
}
+
+ public State dup() {
+ return new State(this.parent, scope.dup());
+ }
public void setClassName(String name) {
this.className = name;
Modified: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Type.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Type.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/Type.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -10,6 +10,9 @@
package org.globus.cog.karajan.compiler;
public class Type {
+ public Object value;
+ public String inlineValue;
+
public boolean isFuture() {
return false;
}
@@ -21,4 +24,8 @@
public int getArity() {
return 1;
}
+
+ public String repr() {
+ return "?";
+ }
}
Deleted: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/TypedValue.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/TypedValue.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/TypedValue.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -1,24 +0,0 @@
-//----------------------------------------------------------------------
-//This code is developed as part of the Java CoG Kit project
-//The terms of the license can be found at http://www.cogkit.org/license
-//This message may not be removed or altered.
-//----------------------------------------------------------------------
-
-/*
- * Created on May 31, 2008
- */
-package org.globus.cog.karajan.compiler;
-
-public class TypedValue {
- public Type type;
- public Object value;
-
- public TypedValue(Type type, Object value) {
- this.type = type;
- this.value = value;
- }
-
- public String toString() {
- return type + "/" + value;
- }
-}
Modified: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/VarRef.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/VarRef.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/VarRef.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -19,7 +19,7 @@
this.addr = addr;
}
- public TypedValue get() {
+ public Type get() {
return scope.get(this);
}
@@ -31,7 +31,7 @@
return addr + scope.offset;
}
- public void set(TypedValue tv) {
+ public void set(Type tv) {
scope.set(this, tv);
}
}
Modified: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Access.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Access.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Access.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -16,9 +16,12 @@
import org.globus.cog.karajan.compiler.Lambda;
import org.globus.cog.karajan.compiler.OutputContext;
import org.globus.cog.karajan.compiler.QName;
+import org.globus.cog.karajan.compiler.Self;
import org.globus.cog.karajan.compiler.State;
import org.globus.cog.karajan.compiler.Type;
import org.globus.cog.karajan.compiler.VarRef;
+import org.globus.cog.karajan.compiler.Self.CTask;
+import org.globus.cog.karajan.compiler.types.UnknownType;
import org.globus.cog.karajan.compiler.types.UserType;
import org.globus.cog.karajan.parser.Node;
import org.globus.cog.karajan.runtime.Signature.Parameter;
@@ -26,8 +29,23 @@
public class Access extends Def {
@Override
- public Type analyze(Node n, State state) throws CompilationException {
+ public Type analyze(final Node n, final State state)
+ throws CompilationException {
Type tobj = this.analyzeChild(n.getNode(0), state);
+ if (tobj instanceof Self) {
+ Self s = (Self) tobj;
+ if (s.org == null) {
+ ((Self) tobj).runOnClose(new CTask() {
+ public void run() throws CompilationException {
+ Access.this.analyze(n, state);
+ }
+ });
+ return new UnknownType();
+ }
+ else {
+ tobj = concreteType(n, s.org);
+ }
+ }
if (!(tobj instanceof UserType)) {
throw new CompilationException(n, "Invalid access. Type " + tobj
+ " does not have any fields");
@@ -53,7 +71,8 @@
+ tobj + " does not have a field named " + field);
}
if (p.type instanceof Lambda) {
- InvokeField ivf = new InvokeField(n.getNode(1), p.type);
+ InvokeField ivf = new InvokeField(act, p.type);
+ ivf.analyze(act, state.fork());
n.setProperty("field", p);
n.setProperty("invoke", ivf);
act.setState(state.fork());
Modified: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Catch.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Catch.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Catch.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -39,7 +39,7 @@
else if (c.getNodeType().equals("k.typedecl")) {
etr = state.getScope().getVar(
new QName((String) c.getNode(1).getProperty(Node.TEXT)));
- etype = etr.get().type;
+ etype = etr.get();
ref = s2.getScope().addVar(
new QName((String) c.getNode(0).getProperty(Node.TEXT)));
}
Modified: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Def.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Def.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Def.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -17,11 +17,13 @@
import org.globus.cog.karajan.compiler.OutputContext;
import org.globus.cog.karajan.compiler.QName;
import org.globus.cog.karajan.compiler.Scope;
+import org.globus.cog.karajan.compiler.Self;
import org.globus.cog.karajan.compiler.State;
import org.globus.cog.karajan.compiler.Type;
import org.globus.cog.karajan.compiler.VarRef;
import org.globus.cog.karajan.compiler.VariableNotFoundException;
import org.globus.cog.karajan.compiler.types.TypeReductor;
+import org.globus.cog.karajan.compiler.types.Types;
import org.globus.cog.karajan.compiler.types.UnionType;
import org.globus.cog.karajan.parser.Node;
@@ -82,12 +84,13 @@
}
public Type analyzeChild(Node s, State state) throws CompilationException {
+ transform(s);
Def def;
try {
def = lookupDef(s, state);
}
catch (ClassCastException e) {
- throw new CompilationException(s, "Cannot invoke a non-lambda");
+ throw new CompilationException(s, "Cannot invoke a non-lambda", e);
}
return analyzeChild(s, def, state);
}
@@ -97,16 +100,23 @@
State fork;
fork = state.forkScope();
s.setState(fork);
- Type t = TypeReductor.reduce(def.analyze(s, fork));
- if (!def.inline(s)) {
- state.recordState = true;
+ try {
+ Type t = TypeReductor.reduce(def.analyze(s, fork));
+
+ if (!def.inline(s)) {
+ state.recordState = true;
+ }
+ if (t == null) {
+ def.analyze(s, fork);
+ throw new CompilationException(s, "Type returned was null");
+ }
+ else {
+ return t;
+ }
}
- if (t == null) {
- throw new CompilationException(s, "Type returned was null");
+ catch (RuntimeException e) {
+ throw new CompilationException(s, e.getMessage(), e);
}
- else {
- return t;
- }
}
public String compile(Node n, OutputContext oc) throws CompilationException {
@@ -123,17 +133,19 @@
protected void fnStart(Node n, State state, OutputContext oc, String name) {
Object line = unknownify(getTreeProperty(n, Node.LINE));
state.method = name;
+ state.threadInit = false;
+ state.crt = 0;
oc.emit("private void " + name + "() {");
}
-
+
protected void requireThread(Node n, OutputContext oc) {
while (n.getState().method == null) {
n = n.getParent();
}
State s = n.getState();
- if (!s.threadInit && !s.recordState) {
+ if (!s.threadInit) {
s.threadInit = true;
- oc.emit("LWThread thread = LWThread.currentThread();");
+ oc.emit("final LWThread thread = LWThread.currentThread();");
}
}
@@ -145,7 +157,7 @@
return orig.toString();
}
}
-
+
protected void stateCaptureStart(Node n, OutputContext oc) {
stateCaptureStart(n, oc, false);
}
@@ -153,14 +165,13 @@
protected void stateCaptureStart(Node n, OutputContext oc, boolean loop) {
n.getState().recordState = true;
n.getState().loop = loop;
- oc.emit("final LWThread thread = LWThread.currentThread();");
+ requireThread(n, oc);
oc.emit("thread.checkSlice();");
oc.emit("int __state__ = thread.popState();");
if (loop) {
oc.emit("while(true) {");
}
oc.emit("switch(__state__) {");
- n.getState().crt = 0;
state(n, oc);
OutputContext ocs = n.getState().getExtraInitialization();
if (ocs != null) {
@@ -181,9 +192,11 @@
@SuppressWarnings("unchecked")
protected void forkContext(Node n, OutputContext oc) {
State state = n.getState();
- if (state.getScope().collapsedSize() > 0 && !state.customContextInitialization) {
+ if (state.getScope().collapsedSize() > 0
+ && !state.customContextInitialization) {
oc.emit("//" + state.getScope().getCollapsedNames());
- List<String> l = (List<String>) n.getRoot().getProperty("methodsWithFrames");
+ List<String> l = (List<String>) n.getRoot().getProperty(
+ "methodsWithFrames");
l.add(state.method);
forkContext(n, oc, state.getScope().collapsedSize());
}
@@ -211,23 +224,32 @@
protected void compileChildren(Node n, State state, OutputContext oc)
throws CompilationException {
- for (int i = 0; i < n.nodeCount(); i++) {
+ compileChildren(n, state, oc, 0);
+ }
+
+ protected void compileChildren(Node n, State state, OutputContext oc,
+ int first) throws CompilationException {
+ for (int i = first; i < n.nodeCount(); i++) {
compileChild(n, i, oc);
}
}
protected void compileChild(Node n, int index, OutputContext oc)
throws CompilationException {
- State state = n.getState();
- Node child = n.getNode(index);
- //System.out.println(child);
+ compileChild(n.getNode(index), oc);
+ }
+
+ protected void compileChild(Node child, OutputContext oc)
+ throws CompilationException {
+ State state = child.getParent().getState();
+ // System.out.println(child);
OutputContext cc = oc.fork();
try {
Def def = lookupDef(child, state);
if (state.recordState || !def.inline(child)) {
- state(n, oc);
+ state(child.getParent(), oc);
}
- cc.emit("// " + child);
+ cc.emit("// " + def.toString(child));
String sn = def.compile(child, cc);
if (sn == null) {
// inline
@@ -239,16 +261,20 @@
}
}
catch (VariableNotFoundException e) {
- throw new CompilationException(n, e);
+ throw new CompilationException(child.getParent(), e);
}
}
+ protected String toString(Node child) {
+ return child.toString();
+ }
+
protected static void state(Node n, OutputContext oc) {
if (oc.clean) {
return;
}
State state = n.getState();
- while (!state.recordState) {
+ while (state.method == null) {
state = state.getParent();
}
@@ -372,11 +398,12 @@
sb.append("get(" + ref.getIndex() + ")");
return sb.toString();
}
-
+
protected static String set(VarRef ref, Scope s, String value) {
- return varContext("thread.ctx", s, ref) + ".set(" + ref.getIndex() + ", " + value + ");";
+ return varContext("thread.ctx", s, ref) + ".set(" + ref.getIndex()
+ + ", " + value + ");";
}
-
+
protected static int getDepth(Scope s) {
int count = 0;
while (s != null) {
@@ -430,4 +457,61 @@
public boolean isStateful() {
return false;
}
+
+ protected String getText(Node n) {
+ return (String) n.getProperty(Node.TEXT);
+ }
+
+ protected void transform(Node n) {
+ if (n.getNodeType().equals("k.apply")) {
+ // apply(fn, args) -> lambda := fn, lambda(args)
+ n.setNodeType("k.seq");
+ Node fn = n.getNode(0);
+ Node id2 = newNode(n, "lambda");
+ for (int i = 1; i < n.nodeCount(); i++) {
+ reparent(n.getNode(i), id2);
+ }
+ n.elements().clear();
+
+ Node set = newNode(n, "k.set");
+ set.setProperty("notype", Boolean.TRUE);
+ Node id1 = newNode(set, "k.var", "lambda");
+ reparent(id1, set);
+ reparent(fn, set);
+
+ reparent(set, n);
+ reparent(id2, n);
+ }
+ }
+
+ private Node newNode(Node parent, String type) {
+ return newNode(parent, type, null);
+ }
+
+ private Node newNode(Node parent, String type, String text) {
+ Node n = new Node();
+ n.setParent(parent);
+ n.setNodeType(type);
+ if (text != null) {
+ n.setProperty(Node.TEXT, text);
+ }
+ return n;
+ }
+
+ private void reparent(Node n, Node parent) {
+ parent.addNode(n);
+ n.setParent(parent);
+ }
+
+ public static Type concreteType(Node n, Type t) throws CompilationException {
+ if (t.equals(Types.TYPE)) {
+ return (Type) t.value;
+ }
+ else if (t instanceof Self) {
+ return t;
+ }
+ else {
+ throw new CompilationException(n, "Not a type: " + t);
+ }
+ }
}
Modified: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Export.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Export.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Export.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -44,6 +44,7 @@
ut.add(new NamedType((String) n.getNode(i).getProperty(Node.TEXT), l.get(i)));
}
}
+ n.setProperty("type", ut);
return ut;
}
@@ -59,6 +60,10 @@
throw new CompilationException(n, e);
}
}
+ OutputContext oc2 = oc.fork();
+ oc2.reparentToRoot();
+ Type t = (Type) n.getProperty("type");
+ oc2.emit("public static final Type TYPE = " + t.repr() + ";");
return null;
}
Modified: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/For.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/For.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/For.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -16,6 +16,7 @@
import org.globus.cog.karajan.compiler.Type;
import org.globus.cog.karajan.compiler.VarRef;
import org.globus.cog.karajan.compiler.VariableNotFoundException;
+import org.globus.cog.karajan.compiler.types.ChannelType;
import org.globus.cog.karajan.compiler.types.ProductType;
import org.globus.cog.karajan.compiler.types.Types;
import org.globus.cog.karajan.parser.Node;
@@ -35,7 +36,7 @@
n.setProperty("iterref", iterref);
n.setProperty("idref", idref);
Type it = this.analyzeChild(n.getNode(1), state);
- if (!Types.ITERABLE.equals(it)) {
+ if (!Types.ITERABLE.equals(it) && !(it instanceof ChannelType)) {
throw new CompilationException(n,
"Argument type mismatch. Expected an " + Types.ITERABLE
+ ", got " + it);
@@ -82,7 +83,7 @@
oc
.emit("thread.ctx.set("
+ ref.getIndex()
- + ", ((Collection<Object>) thread.ctx.popChannel(0).get(0)).iterator());");
+ + ", ((Iterable<Object>) thread.ctx.popChannel(0).get(0)).iterator());");
return null;
}
catch (VariableNotFoundException e) {
Modified: branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Function.java
===================================================================
--- branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Function.java 2008-07-27 23:59:47 UTC (rev 2097)
+++ branches/karajan2/src/cog/modules/karajan2/src/org/globus/cog/karajan/compiler/kernel/Function.java 2008-07-28 00:11:50 UTC (rev 2098)
@@ -10,6 +10,7 @@
package org.globus.cog.karajan.compiler.kernel;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import org.globus.cog.karajan.compiler.CompilationException;
@@ -18,135 +19,268 @@
import org.globus.cog.karajan.compiler.QName;
import org.globus.cog.karajan.compiler.State;
import org.globus.cog.karajan.compiler.Type;
-import org.globus.cog.karajan.compiler.TypedValue;
import org.globus.cog.karajan.compiler.VarRef;
+import org.globus.cog.karajan.compiler.types.ChannelType;
+import org.globus.cog.karajan.compiler.types.PartialType;
+import org.globus.cog.karajan.compiler.types.NamedType;
+import org.globus.cog.karajan.compiler.types.Null;
+import org.globus.cog.karajan.compiler.types.Types;
+import org.globus.cog.karajan.compiler.types.UnionType;
import org.globus.cog.karajan.compiler.types.UnknownType;
import org.globus.cog.karajan.parser.Node;
import org.globus.cog.karajan.runtime.Signature;
import org.globus.cog.karajan.runtime.Signature.Optional;
import org.globus.cog.karajan.runtime.Signature.Parameter;
import org.globus.cog.karajan.runtime.Signature.Positional;
+import org.globus.cog.karajan.runtime.Signature.VarArgs;
public class Function extends Def {
-
- public Type analyze(Node n, State state) throws CompilationException {
- n.setState(state);
- State s2 = state.forkScopeHard();
- for (int i = 0; i < n.nodeCount() - 1; i++) {
- Node c = n.getNode(i);
- if (c.getNodeType().equals("k.var")) {
- QName arg = new QName((String) c.getProperty(Node.TEXT));
- VarRef ref = s2.getScope().addVar(arg);
- ref.set(new TypedValue(new UnknownType(), null));
- }
- else if (c.getNodeType().equals("k.typedecl")) {
- QName arg = new QName((String) c.getNode(0).getProperty(Node.TEXT));
- VarRef ref = s2.getScope().addVar(arg);
- QName argType = new QName((String) c.getNode(1).getProperty(Node.TEXT));
- VarRef tref = s2.getScope().getVar(argType);
- ref.set(new TypedValue(tref.get().type, null));
- }
- else {
- throw new CompilationException(n, "Invalid argument: " + c);
- }
- }
- Node block = n.getNode(n.nodeCount() - 1);
- Type blockType = analyzeChild(block, s2);
- Signature s = getSignature(n, blockType);
- int pc = (s.getPositionalParameters().size() + s.getOptionalParameters().size());
- s.setLocals(s2.getScope().collapsedSize() - pc);
- //addParams(n, s, s2);
- String name = state.getUniqueID(identifier(getName().toString()));
- n.setProperty("name", name);
- n.setProperty("signature", s);
- return new InlineFunction(s, name);
- }
-
- private List<VarRef> addParams(Node n, Signature s, State state) {
- List<VarRef> l;
- l = new ArrayList<VarRef>();
- for( Parameter op : s.getOptionalParameters()) {
- l.add(state.getScope().addVar(new QName(op.name)));
- }
- n.setProperty("orefs", l);
- l = new ArrayList<VarRef>();
- for( Parameter pp : s.getPositionalParameters()) {
+
+ public Type analyze(Node n, State state) throws CompilationException {
+ return analyze(n, state, new UnionType(), false);
+ }
+
+ public Type analyze(Node n, State state, Type actual)
+ throws CompilationException {
+ return analyze(n, state, actual, true);
+ }
+
+ @SuppressWarnings("unchecked")
+ public Type analyze(Node n, State state, Type actual, boolean dependent)
+ throws CompilationException {
+ n.setState(state);
+ State s2 = state.forkScopeHard();
+ boolean dependentType = false;
+ for (int i = 0; i < n.nodeCount() - 1; i++) {
+ Node c = n.getNode(i);
+ if (c.getNodeType().equals("k.var")) {
+ QName arg = new QName(getText(c));
+ VarRef ref = s2.getScope().addVar(arg);
+ if (arg.ns == null && arg.name.equals("...")) {
+ ref.set(new ChannelType("...", false, new UnknownType()));
+ }
+ else {
+ ref.set(new UnknownType());
+ }
+ }
+ else if (c.getNodeType().equals("k.typedecl")) {
+ NamedType nt = (NamedType) this.analyzeChild(c, state);
+ QName arg = new QName(getText(c.getNode(0)));
+ VarRef ref = s2.getScope().addVar(arg);
+ Type t = concreteType(c, nt.src);
+
+ if (Types.TYPE.equals(t)) {
+ t = Types.TYPE.instance(new PartialType(arg, n, ref));
+ }
+ c.setProperty("type", t);
+ ref.set(t);
+ }
+ else {
+ throw new CompilationException(n, "Invalid argument: " + c);
+ }
+ }
+ Node block = n.getNode(n.nodeCount() - 1);
+
+ Type blockType = analyzeChild(block, s2);
+ Signature s = getSignature(n, blockType);
+ int pc = (s.getPositionalParameters().size() + s
+ .getOptionalParameters().size());
+ s.setLocals(s2.getScope().collapsedSize() - pc);
+ // addParams(n, s, s2);
+ String name = (String) block.getProperty("name");
+
+ name = state.getUniqueID(identifier(getName().toString()));
+ block.setProperty("name", name);
+
+ block.setProperty("name", name);
+ block.setProperty("signature", s);
+ InlineFunction iff = new InlineFunction(s, name);
+ // System.out.println(iff);
+ return iff;
+ }
+
+ private Type getType(Type t, int n) {
+ if (t instanceof UnionType) {
+ UnionType ut = (UnionType) t;
+ if (ut.fields != null && ut.fields.size() > n) {
+ return ut.fields.get(n);
+ }
+ else {
+ return null;
+ }
+ }
+ else {
+ return null;
+ }
+ }
+
+ private List<VarRef> addParams(Node n, Signature s, State state) {
+ List<VarRef> l;
+ l = new ArrayList<VarRef>();
+ for (Parameter<?> op : s.getOptionalParameters()) {
+ l.add(state.getScope().addVar(new QName(op.name)));
+ }
+ n.setProperty("orefs", l);
+ l = new ArrayList<VarRef>();
+ for (Parameter<?> pp : s.getPositionalParameters()) {
l.add(state.getScope().addVar(new QName(pp.name)));
}
- n.setProperty("prefs", l);
- return l;
- }
+ n.setProperty("prefs", l);
+ return l;
+ }
- @Override
- public String compile(Node n, OutputContext oc) throws CompilationException {
- State state = n.getState();
- state.recordState = false;
- Signature sig = (Signature) n.getProperty("signature");
- String name = (String) n.getProperty("name");
- oc.emit(" thread.ctx.append(0, new Callable(thread.ctx) {public void invoke(Arguments args) {" + name + "();}});");
- OutputContext oc2 = oc.fork();
- oc2.reparentToRoot();
- compileBody(n, state, oc2, name, sig);
- sig.setDefaultValuesRepr(name + "_defaults");
- return null;
- }
+ @Override
+ @SuppressWarnings("unchecked")
+ public String compile(Node n, OutputContext oc) throws CompilationException {
+ Node block = n.getNode(n.nodeCount() - 1);
+ compile(n, oc, block, n.getState());
+ return null;
+ }
- private void compileBody(Node n, State state, OutputContext oc, String name, Signature sig)
- throws CompilationException {
- oc.emit("static Object[] " + name + "_defaults = null;");
- fnStart(n, state, oc, name);
- int pc = (sig.getPositionalParameters().size() + sig.getOptionalParameters().size());
-
- Node body = n.getNode(n.nodeCount() - 1);
- OutputContext boc = new OutputContext();
- body.getState().setExtraInitialization(boc);
- boc.emit("Arguments a = (Arguments) thread.ctx;");
- body.getState().customContextInitialization = true;
- compileChild(n, n.nodeCount() - 1, oc);
- beforeFnEnd(oc);
- fnEnd(n, oc);
- }
-
- protected void beforeFnEnd(OutputContext oc) {
-
- }
+ public String compile(Node n, OutputContext oc, Node instance, State state)
+ throws CompilationException {
+ state.recordState = false;
+ Signature sig = (Signature) instance.getProperty("signature");
+ String name = (String) instance.getProperty("name");
+ oc
+ .emit(" thread.ctx.append(0, new Callable(thread.ctx) {public void invoke(Arguments args) {"
+ + name + "();} " + stringRepr(n, sig) + "});");
+ OutputContext oc2 = oc.fork();
+ oc2.reparentToRoot();
+ compileBody(n, state, instance, oc2, name, sig);
+ sig.setDefaultValuesRepr(name + "_defaults");
+ return null;
+ }
- private Signature getSignature(Node n, Type returnType) throws CompilationException {
- List<Parameter> l = new ArrayList<Parameter>();
- boolean block = false;
- for (Node c : n.elements()) {
- if (c.getNodeType().equals("k.block")) {
- block = true;
- }
- else {
- if (block) {
- throw new CompilationException(n, "Invalid argument" + c);
- }
- else {
- if (c.getNodeType() == "k.var") {
- l.add(new Positional((String) c.getProperty(Node.TEXT)));
- }
- else if (c.getNodeType() == "k.typedecl") {
- QName argType = new QName((String) c.getNode(1).getProperty(Node.TEXT));
- VarRef tref = n.getState().getScope().getVar(argType);
- l.add(new Positional((String) c.getNode(0).getProperty(Node.TEXT), tref.get().type));
- }
- else if (c.getNodeType() == "k.named") {
- l.add(new Optional((String) c.getProperty("name"), null));
- }
- }
- }
- }
- Signature sig = new Signature(l);
- sig.setReturnType(returnType);
- sig.setLocals(n.getState().getScope().size());
- return sig;
- }
+ protected String stringRepr(Node n, Signature sig) {
+ StringBuffer sb = new StringBuffer();
+ sb.append("public String toString() { return \"");
+ if (sig.isType()) {
+ sb.append(sig.getReturnType());
+ }
+ else {
+ Iterator<Parameter<?>> i;
+ i = sig.positional.iterator();
+ while (i.hasNext()) {
+ Positional<?> p = (Positional<?>) i.next();
+ sb.append(stringRepr(n, p.type));
+ if (i.hasNext() || !sig.optional.isEmpty() || sig.vargs != null) {
+ sb.append(", ");
+ }
+ }
+ i = sig.optional.iterator();
+ while (i.hasNext()) {
+ Optional<?> o = (Optional<?>) i.next();
+ sb.append(stringRepr(n, o.type));
+ if (i.hasNext() || sig.vargs != null) {
+ sb.append(", ");
+ }
+ }
+ if (sig.vargs != null) {
+ sb.append(sig.vargs);
+ }
+ sb.append(" -> ");
+ if (!Null.type.equals(sig.getReturnType())) {
+ sb.append(stringRepr(n, sig.getReturnType()));
+ }
+ }
+ sb.append("\";}");
+ return sb.toString();
+ }
- @Override
- public boolean inline(Node n) {
- return true;
- }
-
-
+ private String stringRepr(Node nref, Type t) {
+ if (t instanceof PartialType) {
+ PartialType dt = (PartialType) t;
+ Node n = ((PartialType) t).n;
+ if (n != nref) {
+ n = n.getNode(n.nodeCount() - 1);
+ VarRef ref = ((PartialType) t).ref;
+ return "\" + " + varRef("ctx", n.getState().getScope(), ref)
+ + "+ \"";
+ }
+ }
+ return t.toString();
+ }
+
+ private void c...
[truncated message content] |