diff --git a/compiler/src/jlang/ast/SynchronizedChange.java b/compiler/src/jlang/ast/AbstractSynchronized.java similarity index 81% rename from compiler/src/jlang/ast/SynchronizedChange.java rename to compiler/src/jlang/ast/AbstractSynchronized.java index 02ab67e0..ddcaf55e 100644 --- a/compiler/src/jlang/ast/SynchronizedChange.java +++ b/compiler/src/jlang/ast/AbstractSynchronized.java @@ -9,10 +9,10 @@ import java.util.List; -public abstract class SynchronizedChange extends Stmt_c { +public abstract class AbstractSynchronized extends Stmt_c { protected Expr expr; - public SynchronizedChange(Position pos, Expr expr, Ext ext) { + public AbstractSynchronized(Position pos, Expr expr, Ext ext) { super(pos, ext); this.expr = expr; } @@ -32,14 +32,14 @@ public Expr expr() { return expr; } - protected N expr(N n, Expr expr) { + protected N expr(N n, Expr expr) { if (n.expr == expr) return n; n = copyIfNeeded(n); n.expr = expr; return n; } - protected N reconstruct(N n, Expr expr) { + protected N reconstruct(N n, Expr expr) { return expr(n, expr); } diff --git a/compiler/src/jlang/ast/SynchronizedEnter_c.java b/compiler/src/jlang/ast/SynchronizedEnter_c.java index 6fd5c1e3..14d46285 100644 --- a/compiler/src/jlang/ast/SynchronizedEnter_c.java +++ b/compiler/src/jlang/ast/SynchronizedEnter_c.java @@ -5,7 +5,7 @@ import polyglot.util.Position; import polyglot.visit.PrettyPrinter; -public class SynchronizedEnter_c extends SynchronizedChange implements SynchronizedEnter { +public class SynchronizedEnter_c extends AbstractSynchronized implements SynchronizedEnter { SynchronizedEnter_c(Position pos, Expr expr, Ext ext) { super(pos, expr, ext); diff --git a/compiler/src/jlang/ast/SynchronizedExit_c.java b/compiler/src/jlang/ast/SynchronizedExit_c.java index 7fe34517..0099be46 100644 --- a/compiler/src/jlang/ast/SynchronizedExit_c.java +++ b/compiler/src/jlang/ast/SynchronizedExit_c.java @@ -6,7 +6,7 @@ import polyglot.util.Position; import polyglot.visit.PrettyPrinter; -public class SynchronizedExit_c extends SynchronizedChange implements SynchronizedExit { +public class SynchronizedExit_c extends AbstractSynchronized implements SynchronizedExit { SynchronizedExit_c(Position pos, Expr expr, Ext ext) { super(pos, expr, ext); diff --git a/compiler/src/jlang/visit/DesugarSynchronized.java b/compiler/src/jlang/visit/DesugarSynchronized.java index d09bc6a9..ebe7da01 100644 --- a/compiler/src/jlang/visit/DesugarSynchronized.java +++ b/compiler/src/jlang/visit/DesugarSynchronized.java @@ -33,7 +33,9 @@ protected Node leaveDesugar(Node n) throws SemanticException { return desugarSynchronizedNode((Synchronized) n); } else if (n instanceof MethodDecl) { MethodDecl node = (MethodDecl) n; - if (node.flags().isSynchronized()) { + if (node.flags().isSynchronized() && node.body() != null) { + // TODO: how to handle public synchronized native void foo() + // Remove && node.body() != null after figure out how to handle it Block body = node.body(); Expr synchronizedObj; if (node.flags().isStatic()) { @@ -64,14 +66,13 @@ protected Node leaveDesugar(Node n) throws SemanticException { */ private Block desugarSynchronizedNode(Synchronized node) { Position pos = node.position(); - // TempSSA or TempVar? Create unique name for each use? + LocalDecl declObj = tnf.TempSSA("syncObj", node.expr()); Local obj = tnf.Local(pos, declObj); SynchronizedEnter syncEnter = nf.SynchronizedEnter(pos, copy(obj)); SynchronizedExit syncExit = nf.SynchronizedExit(pos, copy(obj)); - // Should we copy the node? Block tryBlock = nf.Block(pos, syncEnter, node.body()); Block finallyBlock = nf.Block(pos, syncExit);