mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 06:45:07 +02:00
Merge
This commit is contained in:
commit
929fc23c45
250 changed files with 6022 additions and 3870 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -514,11 +514,10 @@ char* java_lang_String::as_quoted_ascii(oop java_string) {
|
|||
return result;
|
||||
}
|
||||
|
||||
Symbol* java_lang_String::as_symbol(Handle java_string, TRAPS) {
|
||||
oop obj = java_string();
|
||||
typeArrayOop value = java_lang_String::value(obj);
|
||||
int length = java_lang_String::length(obj);
|
||||
bool is_latin1 = java_lang_String::is_latin1(obj);
|
||||
Symbol* java_lang_String::as_symbol(oop java_string, TRAPS) {
|
||||
typeArrayOop value = java_lang_String::value(java_string);
|
||||
int length = java_lang_String::length(java_string);
|
||||
bool is_latin1 = java_lang_String::is_latin1(java_string);
|
||||
if (!is_latin1) {
|
||||
jchar* base = (length == 0) ? NULL : value->char_at_addr(0);
|
||||
Symbol* sym = SymbolTable::lookup_unicode(base, length, THREAD);
|
||||
|
@ -753,7 +752,7 @@ void java_lang_Class::fixup_mirror(KlassHandle k, TRAPS) {
|
|||
}
|
||||
}
|
||||
}
|
||||
create_mirror(k, Handle(NULL), Handle(NULL), Handle(NULL), CHECK);
|
||||
create_mirror(k, Handle(), Handle(), Handle(), CHECK);
|
||||
}
|
||||
|
||||
void java_lang_Class::initialize_mirror_fields(KlassHandle k,
|
||||
|
@ -828,7 +827,8 @@ void java_lang_Class::create_mirror(KlassHandle k, Handle class_loader,
|
|||
// the mirror.
|
||||
if (SystemDictionary::Class_klass_loaded()) {
|
||||
// Allocate mirror (java.lang.Class instance)
|
||||
Handle mirror = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK);
|
||||
oop mirror_oop = InstanceMirrorKlass::cast(SystemDictionary::Class_klass())->allocate_instance(k, CHECK);
|
||||
Handle mirror(THREAD, mirror_oop);
|
||||
|
||||
// Setup indirection from mirror->klass
|
||||
if (!k.is_null()) {
|
||||
|
@ -842,7 +842,7 @@ void java_lang_Class::create_mirror(KlassHandle k, Handle class_loader,
|
|||
|
||||
// It might also have a component mirror. This mirror must already exist.
|
||||
if (k->is_array_klass()) {
|
||||
Handle comp_mirror;
|
||||
oop comp_mirror;
|
||||
if (k->is_typeArray_klass()) {
|
||||
BasicType type = TypeArrayKlass::cast(k())->element_type();
|
||||
comp_mirror = Universe::java_mirror(type);
|
||||
|
@ -852,12 +852,12 @@ void java_lang_Class::create_mirror(KlassHandle k, Handle class_loader,
|
|||
assert(element_klass != NULL, "Must have an element klass");
|
||||
comp_mirror = element_klass->java_mirror();
|
||||
}
|
||||
assert(comp_mirror.not_null(), "must have a mirror");
|
||||
assert(comp_mirror != NULL, "must have a mirror");
|
||||
|
||||
// Two-way link between the array klass and its component mirror:
|
||||
// (array_klass) k -> mirror -> component_mirror -> array_klass -> k
|
||||
set_component_mirror(mirror(), comp_mirror());
|
||||
set_array_klass(comp_mirror(), k());
|
||||
set_component_mirror(mirror(), comp_mirror);
|
||||
set_array_klass(comp_mirror, k());
|
||||
} else {
|
||||
assert(k->is_instance_klass(), "Must be");
|
||||
|
||||
|
@ -1518,7 +1518,7 @@ void java_lang_Throwable::set_depth(oop throwable, int value) {
|
|||
throwable->int_field_put(depth_offset, value);
|
||||
}
|
||||
|
||||
oop java_lang_Throwable::message(Handle throwable) {
|
||||
oop java_lang_Throwable::message(oop throwable) {
|
||||
return throwable->obj_field(detailMessage_offset);
|
||||
}
|
||||
|
||||
|
@ -1547,7 +1547,7 @@ void java_lang_Throwable::clear_stacktrace(oop throwable) {
|
|||
}
|
||||
|
||||
|
||||
void java_lang_Throwable::print(Handle throwable, outputStream* st) {
|
||||
void java_lang_Throwable::print(oop throwable, outputStream* st) {
|
||||
ResourceMark rm;
|
||||
Klass* k = throwable->klass();
|
||||
assert(k != NULL, "just checking");
|
||||
|
@ -1578,7 +1578,7 @@ class BacktraceBuilder: public StackObj {
|
|||
typeArrayOop _methods;
|
||||
typeArrayOop _bcis;
|
||||
objArrayOop _mirrors;
|
||||
typeArrayOop _cprefs; // needed to insulate method name against redefinition
|
||||
typeArrayOop _names; // needed to insulate method name against redefinition
|
||||
int _index;
|
||||
NoSafepointVerifier _nsv;
|
||||
|
||||
|
@ -1586,7 +1586,7 @@ class BacktraceBuilder: public StackObj {
|
|||
trace_methods_offset = java_lang_Throwable::trace_methods_offset,
|
||||
trace_bcis_offset = java_lang_Throwable::trace_bcis_offset,
|
||||
trace_mirrors_offset = java_lang_Throwable::trace_mirrors_offset,
|
||||
trace_cprefs_offset = java_lang_Throwable::trace_cprefs_offset,
|
||||
trace_names_offset = java_lang_Throwable::trace_names_offset,
|
||||
trace_next_offset = java_lang_Throwable::trace_next_offset,
|
||||
trace_size = java_lang_Throwable::trace_size,
|
||||
trace_chunk_size = java_lang_Throwable::trace_chunk_size
|
||||
|
@ -1608,32 +1608,34 @@ class BacktraceBuilder: public StackObj {
|
|||
assert(mirrors != NULL, "mirror array should be initialized in backtrace");
|
||||
return mirrors;
|
||||
}
|
||||
static typeArrayOop get_cprefs(objArrayHandle chunk) {
|
||||
typeArrayOop cprefs = typeArrayOop(chunk->obj_at(trace_cprefs_offset));
|
||||
assert(cprefs != NULL, "cprefs array should be initialized in backtrace");
|
||||
return cprefs;
|
||||
static typeArrayOop get_names(objArrayHandle chunk) {
|
||||
typeArrayOop names = typeArrayOop(chunk->obj_at(trace_names_offset));
|
||||
assert(names != NULL, "names array should be initialized in backtrace");
|
||||
return names;
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
// constructor for new backtrace
|
||||
BacktraceBuilder(TRAPS): _methods(NULL), _bcis(NULL), _head(NULL), _mirrors(NULL), _cprefs(NULL) {
|
||||
BacktraceBuilder(TRAPS): _methods(NULL), _bcis(NULL), _head(NULL), _mirrors(NULL), _names(NULL) {
|
||||
expand(CHECK);
|
||||
_backtrace = _head;
|
||||
_backtrace = Handle(THREAD, _head);
|
||||
_index = 0;
|
||||
}
|
||||
|
||||
BacktraceBuilder(objArrayHandle backtrace) {
|
||||
BacktraceBuilder(Thread* thread, objArrayHandle backtrace) {
|
||||
_methods = get_methods(backtrace);
|
||||
_bcis = get_bcis(backtrace);
|
||||
_mirrors = get_mirrors(backtrace);
|
||||
_cprefs = get_cprefs(backtrace);
|
||||
_names = get_names(backtrace);
|
||||
assert(_methods->length() == _bcis->length() &&
|
||||
_methods->length() == _mirrors->length(),
|
||||
_methods->length() == _mirrors->length() &&
|
||||
_mirrors->length() == _names->length(),
|
||||
"method and source information arrays should match");
|
||||
|
||||
// head is the preallocated backtrace
|
||||
_backtrace = _head = backtrace();
|
||||
_head = backtrace();
|
||||
_backtrace = Handle(thread, _head);
|
||||
_index = 0;
|
||||
}
|
||||
|
||||
|
@ -1653,8 +1655,8 @@ class BacktraceBuilder: public StackObj {
|
|||
objArrayOop mirrors = oopFactory::new_objectArray(trace_chunk_size, CHECK);
|
||||
objArrayHandle new_mirrors(THREAD, mirrors);
|
||||
|
||||
typeArrayOop cprefs = oopFactory::new_shortArray(trace_chunk_size, CHECK);
|
||||
typeArrayHandle new_cprefs(THREAD, cprefs);
|
||||
typeArrayOop names = oopFactory::new_symbolArray(trace_chunk_size, CHECK);
|
||||
typeArrayHandle new_names(THREAD, names);
|
||||
|
||||
if (!old_head.is_null()) {
|
||||
old_head->obj_at_put(trace_next_offset, new_head());
|
||||
|
@ -1662,13 +1664,13 @@ class BacktraceBuilder: public StackObj {
|
|||
new_head->obj_at_put(trace_methods_offset, new_methods());
|
||||
new_head->obj_at_put(trace_bcis_offset, new_bcis());
|
||||
new_head->obj_at_put(trace_mirrors_offset, new_mirrors());
|
||||
new_head->obj_at_put(trace_cprefs_offset, new_cprefs());
|
||||
new_head->obj_at_put(trace_names_offset, new_names());
|
||||
|
||||
_head = new_head();
|
||||
_methods = new_methods();
|
||||
_bcis = new_bcis();
|
||||
_mirrors = new_mirrors();
|
||||
_cprefs = new_cprefs();
|
||||
_names = new_names();
|
||||
_index = 0;
|
||||
}
|
||||
|
||||
|
@ -1690,7 +1692,11 @@ class BacktraceBuilder: public StackObj {
|
|||
|
||||
_methods->short_at_put(_index, method->orig_method_idnum());
|
||||
_bcis->int_at_put(_index, Backtrace::merge_bci_and_version(bci, method->constants()->version()));
|
||||
_cprefs->short_at_put(_index, method->name_index());
|
||||
|
||||
// Note:this doesn't leak symbols because the mirror in the backtrace keeps the
|
||||
// klass owning the symbols alive so their refcounts aren't decremented.
|
||||
Symbol* name = method->name();
|
||||
_names->symbol_at_put(_index, name);
|
||||
|
||||
// We need to save the mirrors in the backtrace to keep the class
|
||||
// from being unloaded while we still have this stack trace.
|
||||
|
@ -1705,10 +1711,10 @@ struct BacktraceElement : public StackObj {
|
|||
int _method_id;
|
||||
int _bci;
|
||||
int _version;
|
||||
int _cpref;
|
||||
Symbol* _name;
|
||||
Handle _mirror;
|
||||
BacktraceElement(Handle mirror, int mid, int version, int bci, int cpref) :
|
||||
_mirror(mirror), _method_id(mid), _version(version), _bci(bci), _cpref(cpref) {}
|
||||
BacktraceElement(Handle mirror, int mid, int version, int bci, Symbol* name) :
|
||||
_mirror(mirror), _method_id(mid), _version(version), _bci(bci), _name(name) {}
|
||||
};
|
||||
|
||||
class BacktraceIterator : public StackObj {
|
||||
|
@ -1717,7 +1723,7 @@ class BacktraceIterator : public StackObj {
|
|||
objArrayHandle _mirrors;
|
||||
typeArrayHandle _methods;
|
||||
typeArrayHandle _bcis;
|
||||
typeArrayHandle _cprefs;
|
||||
typeArrayHandle _names;
|
||||
|
||||
void init(objArrayHandle result, Thread* thread) {
|
||||
// Get method id, bci, version and mirror from chunk
|
||||
|
@ -1726,7 +1732,7 @@ class BacktraceIterator : public StackObj {
|
|||
_methods = typeArrayHandle(thread, BacktraceBuilder::get_methods(_result));
|
||||
_bcis = typeArrayHandle(thread, BacktraceBuilder::get_bcis(_result));
|
||||
_mirrors = objArrayHandle(thread, BacktraceBuilder::get_mirrors(_result));
|
||||
_cprefs = typeArrayHandle(thread, BacktraceBuilder::get_cprefs(_result));
|
||||
_names = typeArrayHandle(thread, BacktraceBuilder::get_names(_result));
|
||||
_index = 0;
|
||||
}
|
||||
}
|
||||
|
@ -1741,7 +1747,7 @@ class BacktraceIterator : public StackObj {
|
|||
_methods->short_at(_index),
|
||||
Backtrace::version_at(_bcis->int_at(_index)),
|
||||
Backtrace::bci_at(_bcis->int_at(_index)),
|
||||
_cprefs->short_at(_index));
|
||||
_names->symbol_at(_index));
|
||||
_index++;
|
||||
|
||||
if (_index >= java_lang_Throwable::trace_chunk_size) {
|
||||
|
@ -1761,7 +1767,7 @@ class BacktraceIterator : public StackObj {
|
|||
|
||||
// Print stack trace element to resource allocated buffer
|
||||
static void print_stack_element_to_stream(outputStream* st, Handle mirror, int method_id,
|
||||
int version, int bci, int cpref) {
|
||||
int version, int bci, Symbol* name) {
|
||||
ResourceMark rm;
|
||||
|
||||
// Get strings and string lengths
|
||||
|
@ -1769,11 +1775,7 @@ static void print_stack_element_to_stream(outputStream* st, Handle mirror, int m
|
|||
const char* klass_name = holder->external_name();
|
||||
int buf_len = (int)strlen(klass_name);
|
||||
|
||||
Method* method = holder->method_with_orig_idnum(method_id, version);
|
||||
|
||||
// The method can be NULL if the requested class version is gone
|
||||
Symbol* sym = (method != NULL) ? method->name() : holder->constants()->symbol_at(cpref);
|
||||
char* method_name = sym->as_C_string();
|
||||
char* method_name = name->as_C_string();
|
||||
buf_len += (int)strlen(method_name);
|
||||
|
||||
char* source_file_name = NULL;
|
||||
|
@ -1809,6 +1811,8 @@ static void print_stack_element_to_stream(outputStream* st, Handle mirror, int m
|
|||
}
|
||||
}
|
||||
|
||||
// The method can be NULL if the requested class version is gone
|
||||
Method* method = holder->method_with_orig_idnum(method_id, version);
|
||||
if (!version_matches(method, version)) {
|
||||
strcat(buf, "Redefined)");
|
||||
} else {
|
||||
|
@ -1837,11 +1841,10 @@ static void print_stack_element_to_stream(outputStream* st, Handle mirror, int m
|
|||
}
|
||||
|
||||
void java_lang_Throwable::print_stack_element(outputStream *st, const methodHandle& method, int bci) {
|
||||
Handle mirror = method->method_holder()->java_mirror();
|
||||
Handle mirror (Thread::current(), method->method_holder()->java_mirror());
|
||||
int method_id = method->orig_method_idnum();
|
||||
int version = method->constants()->version();
|
||||
int cpref = method->name_index();
|
||||
print_stack_element_to_stream(st, mirror, method_id, version, bci, cpref);
|
||||
print_stack_element_to_stream(st, mirror, method_id, version, bci, method->name());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1850,7 +1853,7 @@ void java_lang_Throwable::print_stack_element(outputStream *st, const methodHand
|
|||
*/
|
||||
void java_lang_Throwable::print_stack_trace(Handle throwable, outputStream* st) {
|
||||
// First, print the message.
|
||||
print(throwable, st);
|
||||
print(throwable(), st);
|
||||
st->cr();
|
||||
|
||||
// Now print the stack trace.
|
||||
|
@ -1865,7 +1868,7 @@ void java_lang_Throwable::print_stack_trace(Handle throwable, outputStream* st)
|
|||
|
||||
while (iter.repeat()) {
|
||||
BacktraceElement bte = iter.next(THREAD);
|
||||
print_stack_element_to_stream(st, bte._mirror, bte._method_id, bte._version, bte._bci, bte._cpref);
|
||||
print_stack_element_to_stream(st, bte._mirror, bte._method_id, bte._version, bte._bci, bte._name);
|
||||
}
|
||||
{
|
||||
// Call getCause() which doesn't necessarily return the _cause field.
|
||||
|
@ -1885,7 +1888,7 @@ void java_lang_Throwable::print_stack_trace(Handle throwable, outputStream* st)
|
|||
throwable = Handle(THREAD, (oop) cause.get_jobject());
|
||||
if (throwable.not_null()) {
|
||||
st->print("Caused by: ");
|
||||
print(throwable, st);
|
||||
print(throwable(), st);
|
||||
st->cr();
|
||||
}
|
||||
}
|
||||
|
@ -2089,7 +2092,7 @@ void java_lang_Throwable::fill_in_stack_trace_of_preallocated_backtrace(Handle t
|
|||
ResourceMark rm(THREAD);
|
||||
vframeStream st(THREAD);
|
||||
|
||||
BacktraceBuilder bt(backtrace);
|
||||
BacktraceBuilder bt(THREAD, backtrace);
|
||||
|
||||
// Unlike fill_in_stack_trace we do not skip fillInStackTrace or throwable init
|
||||
// methods as preallocated errors aren't created by "java" code.
|
||||
|
@ -2144,7 +2147,7 @@ void java_lang_Throwable::get_stack_trace_elements(Handle throwable,
|
|||
method,
|
||||
bte._version,
|
||||
bte._bci,
|
||||
bte._cpref, CHECK);
|
||||
bte._name, CHECK);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2159,15 +2162,14 @@ oop java_lang_StackTraceElement::create(const methodHandle& method, int bci, TRA
|
|||
|
||||
Handle element = ik->allocate_instance_handle(CHECK_0);
|
||||
|
||||
int cpref = method->name_index();
|
||||
int version = method->constants()->version();
|
||||
fill_in(element, method->method_holder(), method, version, bci, cpref, CHECK_0);
|
||||
fill_in(element, method->method_holder(), method, version, bci, method->name(), CHECK_0);
|
||||
return element();
|
||||
}
|
||||
|
||||
void java_lang_StackTraceElement::fill_in(Handle element,
|
||||
InstanceKlass* holder, const methodHandle& method,
|
||||
int version, int bci, int cpref, TRAPS) {
|
||||
int version, int bci, Symbol* name, TRAPS) {
|
||||
assert(element->is_a(SystemDictionary::StackTraceElement_klass()), "sanity check");
|
||||
|
||||
// Fill in class name
|
||||
|
@ -2184,11 +2186,8 @@ void java_lang_StackTraceElement::fill_in(Handle element,
|
|||
java_lang_StackTraceElement::set_classLoaderName(element(), loader_name);
|
||||
}
|
||||
|
||||
// The method can be NULL if the requested class version is gone
|
||||
Symbol* sym = !method.is_null() ? method->name() : holder->constants()->symbol_at(cpref);
|
||||
|
||||
// Fill in method name
|
||||
oop methodname = StringTable::intern(sym, CHECK);
|
||||
oop methodname = StringTable::intern(name, CHECK);
|
||||
java_lang_StackTraceElement::set_methodName(element(), methodname);
|
||||
|
||||
// Fill in module name and version
|
||||
|
@ -2205,7 +2204,7 @@ void java_lang_StackTraceElement::fill_in(Handle element,
|
|||
java_lang_StackTraceElement::set_moduleVersion(element(), module_version);
|
||||
}
|
||||
|
||||
if (!version_matches(method(), version)) {
|
||||
if (method() == NULL || !version_matches(method(), version)) {
|
||||
// The method was redefined, accurate line number information isn't available
|
||||
java_lang_StackTraceElement::set_fileName(element(), NULL);
|
||||
java_lang_StackTraceElement::set_lineNumber(element(), -1);
|
||||
|
@ -2232,7 +2231,7 @@ Method* java_lang_StackFrameInfo::get_method(Handle stackFrame, InstanceKlass* h
|
|||
|
||||
void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci) {
|
||||
// set Method* or mid/cpref
|
||||
oop mname = stackFrame->obj_field(_memberName_offset);
|
||||
Handle mname(Thread::current(), stackFrame->obj_field(_memberName_offset));
|
||||
InstanceKlass* ik = method->method_holder();
|
||||
CallInfo info(method(), ik);
|
||||
MethodHandles::init_method_MemberName(mname, info);
|
||||
|
@ -2252,8 +2251,8 @@ void java_lang_StackFrameInfo::to_stack_trace_element(Handle stackFrame, Handle
|
|||
|
||||
short version = stackFrame->short_field(_version_offset);
|
||||
short bci = stackFrame->short_field(_bci_offset);
|
||||
int cpref = method->name_index();
|
||||
java_lang_StackTraceElement::fill_in(stack_trace_element, holder, method, version, bci, cpref, CHECK);
|
||||
Symbol* name = method->name();
|
||||
java_lang_StackTraceElement::fill_in(stack_trace_element, holder, method, version, bci, name, CHECK);
|
||||
}
|
||||
|
||||
void java_lang_StackFrameInfo::compute_offsets() {
|
||||
|
@ -3966,7 +3965,6 @@ bool JavaClasses::check_constant(const char *klass_name, int hardcoded_constant,
|
|||
|
||||
void JavaClasses::check_offsets() {
|
||||
bool valid = true;
|
||||
HandleMark hm;
|
||||
|
||||
#define CHECK_OFFSET(klass_name, cpp_klass_name, field_name, field_sig) \
|
||||
valid &= check_offset(klass_name, cpp_klass_name :: field_name ## _offset, #field_name, field_sig)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue