summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-09-06 14:16:06 +0000
committerRich Hickey <richhickey@gmail.com>2007-09-06 14:16:06 +0000
commitc42b245685ff5a285dde2ff3664cae6a9951a3f5 (patch)
treedc66b7b039d138dfeb4a1224477443c5275a1bcc
parent424a73aa7b009304c0fc9c99033c73b39bd14d55 (diff)
added monitor-enter/exit
-rw-r--r--clojure.iml3
-rw-r--r--src/jvm/clojure/lang/BytecodeCompiler.java54
2 files changed, 52 insertions, 5 deletions
diff --git a/clojure.iml b/clojure.iml
index e09fe89f..74b43c3a 100644
--- a/clojure.iml
+++ b/clojure.iml
@@ -9,8 +9,7 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="library" name="antlr-3" level="application" />
- <orderEntry type="library" name="asm-3.0" level="project" />
+ <orderEntry type="library" exported="" name="asm-3.0" level="project" />
<orderEntryProperties />
</component>
<component name="VcsManagerConfiguration">
diff --git a/src/jvm/clojure/lang/BytecodeCompiler.java b/src/jvm/clojure/lang/BytecodeCompiler.java
index 4931df51..720ac666 100644
--- a/src/jvm/clojure/lang/BytecodeCompiler.java
+++ b/src/jvm/clojure/lang/BytecodeCompiler.java
@@ -36,6 +36,8 @@ static final Symbol DOT = Symbol.create(".");
static final Symbol ASSIGN = Symbol.create("=");
static final Symbol TRY_FINALLY = Symbol.create("try-finally");
static final Symbol THROW = Symbol.create("throw");
+static final Symbol MONITOR_ENTER = Symbol.create("monitor-enter");
+static final Symbol MONITOR_EXIT = Symbol.create("monitor-exit");
static final Symbol THISFN = Symbol.create("thisfn");
static final Symbol IFN = Symbol.create("clojure.lang", "IFn");
@@ -642,6 +644,48 @@ static class CharExpr extends LiteralExpr{
}
}
+static class MonitorEnterExpr implements Expr{
+ final Expr target;
+
+ public MonitorEnterExpr(Expr target){
+ this.target = target;
+ }
+
+ public Object eval() throws Exception{
+ throw new UnsupportedOperationException("Can't eval monitor-enter");
+ }
+
+ public void emit(C context, FnExpr fn, GeneratorAdapter gen){
+ target.emit(C.EXPRESSION, fn, gen);
+ gen.monitorEnter();
+ if(context != C.STATEMENT)
+ {
+ NIL_EXPR.emit(context, fn, gen);
+ }
+ }
+}
+
+static class MonitorExitExpr implements Expr{
+ final Expr target;
+
+ public MonitorExitExpr(Expr target){
+ this.target = target;
+ }
+
+ public Object eval() throws Exception{
+ throw new UnsupportedOperationException("Can't eval monitor-exit");
+ }
+
+ public void emit(C context, FnExpr fn, GeneratorAdapter gen){
+ target.emit(C.EXPRESSION, fn, gen);
+ gen.monitorExit();
+ if(context != C.STATEMENT)
+ {
+ NIL_EXPR.emit(context, fn, gen);
+ }
+ }
+}
+
static class TryFinallyExpr implements Expr{
final Expr tryExpr;
final Expr finallyExpr;
@@ -1496,6 +1540,10 @@ private static Expr analyzeSeq(C context, ISeq form, String name) throws Excepti
return TryFinallyExpr.parse(context, form);
else if(op.equals(THROW))
return ThrowExpr.parse(context, form);
+ else if(op.equals(MONITOR_ENTER))
+ return new MonitorEnterExpr(analyze(C.EXPRESSION, RT.second(form)));
+ else if(op.equals(MONITOR_EXIT))
+ return new MonitorExitExpr(analyze(C.EXPRESSION, RT.second(form)));
else
return InvokeExpr.parse(context, form);
}
@@ -1542,7 +1590,7 @@ static Var lookupVar(Symbol sym, boolean internNew) throws Exception{
else
{
//is it an alias?
- IPersistentMap uses = (IPersistentMap) RT.USES.get();
+ IPersistentMap uses = (IPersistentMap) RT.ALIASES.get();
var = (Var) uses.valAt(sym);
if(var == null && sym.ns == null)
var = Var.find(Symbol.intern(currentNS(), sym.name));
@@ -1606,7 +1654,7 @@ public static Object load(InputStream s) throws Exception{
{
Var.pushThreadBindings(
RT.map(LOADER, new DynamicClassLoader(),
- RT.USES, RT.USES.get(),
+ RT.ALIASES, RT.ALIASES.get(),
RT.IMPORTS, RT.IMPORTS.get()));
LineNumberingPushbackReader rdr = new LineNumberingPushbackReader(new InputStreamReader(s));
for(Object r = LispReader.read(rdr, false, EOF, false); r != EOF; r = LispReader.read(rdr, false, EOF, false))
@@ -1627,7 +1675,7 @@ public static void main(String[] args){
try
{
Var.pushThreadBindings(
- RT.map(RT.USES, RT.USES.get(),
+ RT.map(RT.ALIASES, RT.ALIASES.get(),
RT.IMPORTS, RT.IMPORTS.get()));
for(; ;)