src/share/vm/prims/methodHandles.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/vm/prims/methodHandles.cpp	Tue Oct 14 09:41:23 2014
--- new/src/share/vm/prims/methodHandles.cpp	Tue Oct 14 09:41:10 2014

*** 34,43 **** --- 34,44 ---- #include "runtime/compilationPolicy.hpp" #include "runtime/javaCalls.hpp" #include "runtime/reflection.hpp" #include "runtime/signature.hpp" #include "runtime/stubRoutines.hpp" + #include "utilities/exceptions.hpp" /* * JSR 292 reference implementation: method handles * The JDK 7 reference implementation represented method handle
*** 53,82 **** --- 54,87 ---- */ bool MethodHandles::_enabled = false; // set true after successful native linkage MethodHandlesAdapterBlob* MethodHandles::_adapter_code = NULL; //------------------------------------------------------------------------------ // MethodHandles::generate_adapters // void MethodHandles::generate_adapters() { if (SystemDictionary::MethodHandle_klass() == NULL) return; + + /** + * Generates method handle adapters. Returns 'false' if memory allocation + * failed and true otherwise. + */ + bool MethodHandles::generate_adapters() { + if (SystemDictionary::MethodHandle_klass() == NULL) { + return true; + } assert(_adapter_code == NULL, "generate only once"); ResourceMark rm; TraceTime timer("MethodHandles adapters generation", TraceStartupTime); _adapter_code = MethodHandlesAdapterBlob::create(adapter_code_size); ! if (_adapter_code == NULL) { vm_exit_out_of_memory(adapter_code_size, OOM_MALLOC_ERROR, "CodeCache: no room for MethodHandles adapters"); { + return false; + } + CodeBuffer code(_adapter_code); MethodHandlesAdapterGenerator g(&code); g.generate(); code.log_section_sizes("MethodHandlesAdapterBlob"); } + return true; } //------------------------------------------------------------------------------ // MethodHandlesAdapterGenerator::generate //
*** 1399,1408 **** --- 1404,1415 ---- if (TraceInvokeDynamic) { tty->print_cr("MethodHandle support loaded (using LambdaForms)"); } if (enable_MH) { MethodHandles::generate_adapters(); + if (MethodHandles::generate_adapters() == false) { + THROW_MSG(vmSymbols::java_lang_VirtualMachineError(), "Out of space in CodeCache for method handle adapters"); + } MethodHandles::set_enabled(true); } } JVM_END

src/share/vm/prims/methodHandles.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File