From b420616d98704bc6a7ddfb71f2ea9177a71bb35c Mon Sep 17 00:00:00 2001 From: Yiteng Guo Date: Sat, 23 Nov 2019 02:55:04 -0500 Subject: [PATCH] synchronize class loading functions --- compiler/src/jlang/util/LLVMUtils.java | 6 ++++++ compiler/src/jlang/visit/DesugarSynchronized.java | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/compiler/src/jlang/util/LLVMUtils.java b/compiler/src/jlang/util/LLVMUtils.java index ebba177d..40ebfadd 100644 --- a/compiler/src/jlang/util/LLVMUtils.java +++ b/compiler/src/jlang/util/LLVMUtils.java @@ -22,6 +22,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; +import static jlang.extension.JLangSynchronizedExt.buildMonitorFunc; import static org.bytedeco.javacpp.LLVM.*; /** @@ -804,6 +805,9 @@ public LLVMValueRef buildGlobalCStr(String str) { /** Emits a check to ensure that the given class has been loaded by the runtime. */ public void buildClassLoadCheck(ClassType ct) { + // Synchronize the class loading function. + buildMonitorFunc(v, Constants.MONITOR_ENTER, LLVMConstNull(v.utils.toLL(v.ts.Object()))); + LLVMBasicBlockRef loadClass = v.utils.buildBlock("load.class"); LLVMBasicBlockRef end = v.utils.buildBlock("continue"); String classMangled = v.mangler.classObj(ct); @@ -821,6 +825,8 @@ public void buildClassLoadCheck(ClassType ct) { LLVMBuildBr(v.builder, end); LLVMPositionBuilderAtEnd(v.builder, end); + + buildMonitorFunc(v, Constants.MONITOR_EXIT, LLVMConstNull(v.utils.toLL(v.ts.Object()))); } /** diff --git a/compiler/src/jlang/visit/DesugarSynchronized.java b/compiler/src/jlang/visit/DesugarSynchronized.java index fe98579a..2e0c6c09 100644 --- a/compiler/src/jlang/visit/DesugarSynchronized.java +++ b/compiler/src/jlang/visit/DesugarSynchronized.java @@ -34,9 +34,9 @@ protected Node leaveDesugar(Node n) throws SemanticException { // synchronized(o) {...} // To // { - // Object temp = o; - // try { MonitorEnter(o); ... } - // finally { MonitorExit(o); } + // Object syncObj = o; + // try { MonitorEnter(syncObj); ... } + // finally { MonitorExit(syncObj); } // } Synchronized node = (Synchronized) n; Position pos = node.position();