SlowSignatureHandler(methodHandle method, intptr_t* from, intptr_t* to) : NativeSignatureIterator(method) { _from = from; _to = to; _reg_args = to - (method->is_static() ? 4 : 5); _fp_identifiers = to - 2; _to = _to + 4; // Windows reserves stack space for register arguments *(int*) _fp_identifiers = 0; _num_args = (method->is_static() ? 1 : 0); }
// Creation SignatureHandlerGenerator(methodHandle method, CodeBuffer* buffer) : NativeSignatureIterator(method) { _masm = new MacroAssembler(buffer); #ifdef AMD64 #ifdef _WIN64 _num_args = (method->is_static() ? 1 : 0); _stack_offset = (Argument::n_int_register_parameters_c+1)* wordSize; // don't overwrite return address #else _num_int_args = (method->is_static() ? 1 : 0); _num_fp_args = 0; _stack_offset = wordSize; // don't overwrite return address #endif // _WIN64 #endif // AMD64 }
SlowSignatureHandler(methodHandle method, intptr_t* from, intptr_t* to) : NativeSignatureIterator(method) { _from = from; _to = to; _int_args = to - (method->is_static() ? 14 : 15); _fp_args = to - 9; _fp_identifiers = to - 10; *(int*) _fp_identifiers = 0; _num_int_args = (method->is_static() ? 1 : 0); _num_fp_args = 0; }
// Check all the formats of native implementation name to see if there is one // for the specified method. address NativeLookup::lookup_critical_entry(methodHandle method) { if (!CriticalJNINatives) return NULL; if (method->is_synchronized() || !method->is_static()) { // Only static non-synchronized methods are allowed return NULL; } ResourceMark rm; address entry = NULL; Symbol* signature = method->signature(); for (int end = 0; end < signature->utf8_length(); end++) { if (signature->byte_at(end) == 'L') { // Don't allow object types return NULL; } } // Compute critical name char* critical_name = critical_jni_name(method); // Compute argument size int args_size = 1 // JNIEnv + (method->is_static() ? 1 : 0) // class for static methods + method->size_of_parameters(); // actual parameters // 1) Try JNI short style entry = lookup_critical_style(method, critical_name, "", args_size, true); if (entry != NULL) return entry; // Compute long name char* long_name = long_jni_name(method); // 2) Try JNI long style entry = lookup_critical_style(method, critical_name, long_name, args_size, true); if (entry != NULL) return entry; // 3) Try JNI short style without os prefix/suffix entry = lookup_critical_style(method, critical_name, "", args_size, false); if (entry != NULL) return entry; // 4) Try JNI long style without os prefix/suffix entry = lookup_critical_style(method, critical_name, long_name, args_size, false); return entry; // NULL indicates not found }
SlowSignatureHandler(methodHandle method, intptr_t* from, intptr_t* to, intptr_t *RegArgSig) : NativeSignatureIterator(method) { _from = from; _to = to; _RegArgSignature = RegArgSig; *_RegArgSignature = 0; _argcount = method->is_static() ? 2 : 1; }
// Check all the formats of native implementation name to see if there is one // for the specified method. address NativeLookup::lookup_entry(methodHandle method, bool& in_base_library, TRAPS) { address entry = NULL; in_base_library = false; // Compute pure name char* pure_name = pure_jni_name(method); //计算指定本地方法的参数数量 int args_size = 1 // JNIEnv + (method->is_static() ? 1 : 0) // class for static methods + method->size_of_parameters(); // actual parameters // 1) Try JNI short style entry = lookup_style(method, pure_name, "", args_size, true, in_base_library, CHECK_NULL); if (entry != NULL) return entry; // Compute long name char* long_name = long_jni_name(method); // 2) Try JNI long style entry = lookup_style(method, pure_name, long_name, args_size, true, in_base_library, CHECK_NULL); if (entry != NULL) return entry; // 3) Try JNI short style without os prefix/suffix entry = lookup_style(method, pure_name, "", args_size, false, in_base_library, CHECK_NULL); if (entry != NULL) return entry; // 4) Try JNI long style without os prefix/suffix entry = lookup_style(method, pure_name, long_name, args_size, false, in_base_library, CHECK_NULL); return entry; // NULL indicates not found }
VerificationType StackMapFrame::set_locals_from_arg( const methodHandle m, VerificationType thisKlass, TRAPS) { SignatureStream ss(m->signature()); int init_local_num = 0; if (!m->is_static()) { init_local_num++; // add one extra argument for instance method if (m->name() == vmSymbols::object_initializer_name() && thisKlass.name() != vmSymbols::java_lang_Object()) { _locals[0] = VerificationType::uninitialized_this_type(); _flags |= FLAG_THIS_UNINIT; } else { _locals[0] = thisKlass; } } // local num may be greater than size of parameters because long/double occupies two slots while(!ss.at_return_type()) { init_local_num += _verifier->change_sig_to_verificationType( &ss, &_locals[init_local_num], CHECK_VERIFY_(verifier(), VerificationType::bogus_type())); ss.next(); } _locals_size = init_local_num; switch (ss.type()) { case T_OBJECT: case T_ARRAY: { Symbol* sig = ss.as_symbol(CHECK_(VerificationType::bogus_type())); // Create another symbol to save as signature stream unreferences // this symbol. Symbol* sig_copy = verifier()->create_temporary_symbol(sig, 0, sig->utf8_length(), CHECK_(VerificationType::bogus_type())); assert(sig_copy == sig, "symbols don't match"); return VerificationType::reference_type(sig_copy); } case T_INT: return VerificationType::integer_type(); case T_BYTE: return VerificationType::byte_type(); case T_CHAR: return VerificationType::char_type(); case T_SHORT: return VerificationType::short_type(); case T_BOOLEAN: return VerificationType::boolean_type(); case T_FLOAT: return VerificationType::float_type(); case T_DOUBLE: return VerificationType::double_type(); case T_LONG: return VerificationType::long_type(); case T_VOID: return VerificationType::bogus_type(); default: ShouldNotReachHere(); } return VerificationType::bogus_type(); }
uint64_t fingerprint() { // See if we fingerprinted this method already if (mh->constMethod()->fingerprint() != CONST64(0)) { return mh->constMethod()->fingerprint(); } if (mh->size_of_parameters() > max_size_of_parameters ) { _fingerprint = UCONST64(-1); mh->constMethod()->set_fingerprint(_fingerprint); return _fingerprint; } assert( (int)mh->result_type() <= (int)result_feature_mask, "bad result type"); _fingerprint = mh->result_type(); _fingerprint <<= static_feature_size; if (mh->is_static()) _fingerprint |= 1; _shift_count = result_feature_size + static_feature_size; iterate_parameters(); _fingerprint |= ((uint64_t)done_parm) << _shift_count;// mark end of sig mh->constMethod()->set_fingerprint(_fingerprint); return _fingerprint; }