Skip to content

Monitor.enter and Monitor.exit not generated for synchronized methods #1091

@valdisxp1

Description

@valdisxp1
object Test{
  def foo = {
    println("abc")
    synchronized {
      wait(100)
    }
  }
  def foobar = synchronized {
    wait(100)
  }
}

This generates:

define void @"Test$::foo_unit"(i8* %_1) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
_2.0:
  %_3 = call i8* () @"scala.Predef$::load"()
  call void (i8*, i8*) @"scala.Predef$::println_java.lang.Object_unit"(i8* %_3, i8* bitcast ({ i8*, i32, i32, i32, i8* }* @"__const::4" to i8*))
  %_6 = call i8* () @"scala.scalanative.runtime.package$::load"()
  %_7 = call i8* (i8*, i8*) @"scala.scalanative.runtime.package$::getMonitor_java.lang.Object_scala.scalanative.runtime.Monitor"(i8* %_6, i8* %_1)
  call void (i8*) @"scala.scalanative.runtime.Monitor::enter_unit"(i8* %_7)
  call void (i8*, i64) @"java.lang.Object::wait_i64_unit"(i8* %_1, i64 100)
  call void (i8*) @"scala.scalanative.runtime.Monitor::exit_unit"(i8* %_7)
  ret void
}
define void @"Test$::foobar_unit"(i8* %_1) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
_2.0:
  call void (i8*, i64) @"java.lang.Object::wait_i64_unit"(i8* %_1, i64 100)
  ret void
}

There is no Monitor.enter and Monitor.exit around wait in foobar, like when synchonized is statement in the method (foo).

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions