72 void next(TRAPS) { |
72 void next(TRAPS) { |
73 assert(!is_last(), ""); |
73 assert(!is_last(), ""); |
74 set_method_handle(MethodHandle_vmtarget_oop(), THREAD); |
74 set_method_handle(MethodHandle_vmtarget_oop(), THREAD); |
75 } |
75 } |
76 |
76 |
|
77 Handle root() { return _root; } |
77 Handle method_handle() { return _method_handle; } |
78 Handle method_handle() { return _method_handle; } |
78 oop method_handle_oop() { return _method_handle(); } |
79 oop method_handle_oop() { return _method_handle(); } |
79 oop method_type_oop() { return MethodHandle_type_oop(); } |
80 oop method_type_oop() { return MethodHandle_type_oop(); } |
80 oop vmtarget_oop() { return MethodHandle_vmtarget_oop(); } |
81 oop vmtarget_oop() { return MethodHandle_vmtarget_oop(); } |
81 |
82 |
108 #ifdef ASSERT |
109 #ifdef ASSERT |
109 // Print a symbolic description of a method handle chain, including |
110 // Print a symbolic description of a method handle chain, including |
110 // the signature for each method. The signatures are printed in |
111 // the signature for each method. The signatures are printed in |
111 // slot order to make it easier to understand. |
112 // slot order to make it easier to understand. |
112 void print(); |
113 void print(); |
113 static void print(Handle mh); |
|
114 static void print(oopDesc* mh); |
114 static void print(oopDesc* mh); |
115 #endif |
115 #endif |
116 }; |
116 }; |
117 |
117 |
118 |
118 |
275 KlassHandle _rklass; // Return type for casting. |
275 KlassHandle _rklass; // Return type for casting. |
276 BasicType _rtype; |
276 BasicType _rtype; |
277 KlassHandle _target_klass; |
277 KlassHandle _target_klass; |
278 Thread* _thread; |
278 Thread* _thread; |
279 |
279 |
|
280 int _selectAlternative_bci; // These are used for capturing profiles from GWTs |
|
281 int _taken_count; |
|
282 int _not_taken_count; |
|
283 |
280 // Values used by the compiler. |
284 // Values used by the compiler. |
281 static jvalue zero_jvalue; |
285 static jvalue zero_jvalue; |
282 static jvalue one_jvalue; |
286 static jvalue one_jvalue; |
283 |
287 |
284 // Fake constant pool entry. |
288 // Fake constant pool entry. |
370 assert(_cur_stack >= 0, "sanity"); |
374 assert(_cur_stack >= 0, "sanity"); |
371 } |
375 } |
372 |
376 |
373 unsigned char* bytecode() const { return _bytecode.adr_at(0); } |
377 unsigned char* bytecode() const { return _bytecode.adr_at(0); } |
374 int bytecode_length() const { return _bytecode.length(); } |
378 int bytecode_length() const { return _bytecode.length(); } |
|
379 int cur_bci() const { return _bytecode.length(); } |
375 |
380 |
376 // Fake constant pool. |
381 // Fake constant pool. |
377 int cpool_oop_put(int tag, Handle con) { |
382 int cpool_oop_put(int tag, Handle con) { |
378 if (con.is_null()) return 0; |
383 if (con.is_null()) return 0; |
379 ConstantValue* cv = new ConstantValue(tag, con); |
384 ConstantValue* cv = new ConstantValue(tag, con); |
434 int cpool_name_and_type_put(int name_index, int signature_index) { |
439 int cpool_name_and_type_put(int name_index, int signature_index) { |
435 return cpool_oop_reference_put(JVM_CONSTANT_NameAndType, name_index, signature_index, methodHandle()); |
440 return cpool_oop_reference_put(JVM_CONSTANT_NameAndType, name_index, signature_index, methodHandle()); |
436 } |
441 } |
437 |
442 |
438 void emit_bc(Bytecodes::Code op, int index = 0, int args_size = -1); |
443 void emit_bc(Bytecodes::Code op, int index = 0, int args_size = -1); |
|
444 void update_branch_dest(int src, int dst); |
|
445 void emit_load(ArgToken arg); |
439 void emit_load(BasicType bt, int index); |
446 void emit_load(BasicType bt, int index); |
440 void emit_store(BasicType bt, int index); |
447 void emit_store(BasicType bt, int index); |
441 void emit_load_constant(ArgToken arg); |
448 void emit_load_constant(ArgToken arg); |
442 |
449 |
443 virtual ArgToken make_parameter(BasicType type, klassOop tk, int argnum, TRAPS) { |
450 virtual ArgToken make_parameter(BasicType type, klassOop tk, int argnum, TRAPS) { |
453 |
460 |
454 virtual ArgToken make_conversion(BasicType type, klassOop tk, Bytecodes::Code op, const ArgToken& src, TRAPS); |
461 virtual ArgToken make_conversion(BasicType type, klassOop tk, Bytecodes::Code op, const ArgToken& src, TRAPS); |
455 virtual ArgToken make_fetch(BasicType type, klassOop tk, Bytecodes::Code op, const ArgToken& base, const ArgToken& offset, TRAPS); |
462 virtual ArgToken make_fetch(BasicType type, klassOop tk, Bytecodes::Code op, const ArgToken& base, const ArgToken& offset, TRAPS); |
456 virtual ArgToken make_invoke(methodHandle m, vmIntrinsics::ID iid, Bytecodes::Code op, bool tailcall, int argc, ArgToken* argv, TRAPS); |
463 virtual ArgToken make_invoke(methodHandle m, vmIntrinsics::ID iid, Bytecodes::Code op, bool tailcall, int argc, ArgToken* argv, TRAPS); |
457 |
464 |
|
465 // Check for profiling information on a GWT and return true if it's found |
|
466 bool fetch_counts(ArgToken a1, ArgToken a2); |
|
467 |
458 // Get a real constant pool. |
468 // Get a real constant pool. |
459 constantPoolHandle get_constant_pool(TRAPS) const; |
469 constantPoolHandle get_constant_pool(TRAPS) const; |
460 |
470 |
461 // Get a real methodOop. |
471 // Get a real methodOop. |
462 methodHandle get_method_oop(TRAPS) const; |
472 methodHandle get_method_oop(TRAPS); |
463 |
473 |
464 public: |
474 public: |
465 MethodHandleCompiler(Handle root, Symbol* name, Symbol* signature, int invoke_count, bool for_invokedynamic, TRAPS); |
475 MethodHandleCompiler(Handle root, Symbol* name, Symbol* signature, int invoke_count, bool for_invokedynamic, TRAPS); |
466 |
476 |
467 // Compile the given MH chain into bytecode. |
477 // Compile the given MH chain into bytecode. |