--- old/src/hotspot/share/runtime/javaCalls.cpp 2019-04-24 13:36:45.000000000 -0700 +++ new/src/hotspot/share/runtime/javaCalls.cpp 2019-04-24 13:36:45.000000000 -0700 @@ -304,6 +304,19 @@ Handle JavaCalls::construct_new_instance(InstanceKlass* klass, Symbol* constructor_signature, JavaCallArguments* args, TRAPS) { klass->initialize(CHECK_NH); // Quick no-op if already initialized. + + // Special case for factory methods + if (!constructor_signature->is_void_method_signature()) { + assert(klass->is_value(), "inline classes must use factory methods"); + JavaValue factory_result(T_OBJECT); + JavaCalls::call_static(&factory_result, klass, + vmSymbols::object_initializer_name(), + constructor_signature, args, CHECK_NH); + return Handle(THREAD, (oop)factory_result.get_jobject()); + } + + // main branch of code creates a non-inline object: + assert(!klass->is_value(), "classic constructors are only for non-inline classes"); Handle obj = klass->allocate_instance_handle(CHECK_NH); JavaValue void_result(T_VOID); args->set_receiver(obj); // inserts as the first argument.