// Computes a CPC map (new_index -> original_index) for constant pool entries // that are referred to by the interpreter at runtime via the constant pool cache. // Also computes a CP map (original_index -> new_index). // Marks entries in CP which require additional processing. void Rewriter::compute_index_maps() { const int length = _pool->length(); init_cp_map(length); bool saw_mh_symbol = false; for (int i = 0; i < length; i++) { int tag = _pool->tag_at(i).value(); switch (tag) { case JVM_CONSTANT_InterfaceMethodref: case JVM_CONSTANT_Fieldref : // fall through case JVM_CONSTANT_Methodref : // fall through case JVM_CONSTANT_MethodHandle : // fall through case JVM_CONSTANT_MethodType : // fall through case JVM_CONSTANT_InvokeDynamic : // fall through add_cp_cache_entry(i); break; case JVM_CONSTANT_Utf8: if (_pool->symbol_at(i) == vmSymbols::java_lang_invoke_MethodHandle()) saw_mh_symbol = true; break; } } guarantee((int)_cp_cache_map.length()-1 <= (int)((u2)-1), "all cp cache indexes fit in a u2"); if (saw_mh_symbol) _method_handle_invokers.initialize(length, (int)0); }
// Computes a CPC map (new_index -> original_index) for constant pool entries // that are referred to by the interpreter at runtime via the constant pool cache. // Also computes a CP map (original_index -> new_index). // Marks entries in CP which require additional processing. void Rewriter::compute_index_maps() { const int length = _pool->length(); init_cp_map(length); for (int i = 0; i < length; i++) { int tag = _pool->tag_at(i).value(); switch (tag) { case JVM_CONSTANT_InterfaceMethodref: case JVM_CONSTANT_Fieldref : // fall through case JVM_CONSTANT_Methodref : // fall through add_cp_cache_entry(i); break; } } guarantee((int)_cp_cache_map.length()-1 <= (int)((u2)-1), "all cp cache indexes fit in a u2"); }
// Computes a CPC map (new_index -> original_index) for constant pool entries // that are referred to by the interpreter at runtime via the constant pool cache. // Also computes a CP map (original_index -> new_index). // Marks entries in CP which require additional processing. void Rewriter::compute_index_maps() { const int length = _pool->length(); init_cp_map(length); jint tag_mask = 0; for (int i = 0; i < length; i++) { int tag = _pool->tag_at(i).value(); tag_mask |= (1 << tag); switch (tag) { case JVM_CONSTANT_InterfaceMethodref: case JVM_CONSTANT_Fieldref : // fall through case JVM_CONSTANT_Methodref : // fall through case JVM_CONSTANT_MethodHandle : // fall through case JVM_CONSTANT_MethodType : // fall through case JVM_CONSTANT_InvokeDynamic : // fall through add_cp_cache_entry(i); break; } } guarantee((int)_cp_cache_map.length()-1 <= (int)((u2)-1), "all cp cache indexes fit in a u2"); _have_invoke_dynamic = ((tag_mask & (1 << JVM_CONSTANT_InvokeDynamic)) != 0); }
int maybe_add_cp_cache_entry(int i) { return has_cp_cache(i) ? _cp_map[i] : add_cp_cache_entry(i); }