--- old/src/share/vm/classfile/javaClasses.cpp 2015-10-08 22:15:39.909489298 +0200 +++ new/src/share/vm/classfile/javaClasses.cpp 2015-10-08 22:15:39.807491734 +0200 @@ -212,7 +212,9 @@ int length = UTF8::unicode_length(utf8_str); Handle h_obj = basic_create(length, CHECK_NH); if (length > 0) { - UTF8::convert_to_unicode(utf8_str, value(h_obj())->char_at_addr(0), length); + typeArrayOop buffer = value(h_obj()); + buffer = typeArrayOop(oopDesc::bs()->write_barrier(buffer)); + UTF8::convert_to_unicode(utf8_str, buffer->char_at_addr(0), length); } return h_obj; } @@ -226,7 +228,9 @@ int length = UTF8::unicode_length((char*)symbol->bytes(), symbol->utf8_length()); Handle h_obj = basic_create(length, CHECK_NH); if (length > 0) { - UTF8::convert_to_unicode((char*)symbol->bytes(), value(h_obj())->char_at_addr(0), length); + typeArrayOop buffer = value(h_obj()); + buffer = typeArrayOop(oopDesc::bs()->write_barrier(buffer)); + UTF8::convert_to_unicode((char*)symbol->bytes(), buffer->char_at_addr(0), length); } return h_obj; } @@ -347,6 +351,7 @@ typeArrayOop value = java_lang_String::value(java_string); int offset = java_lang_String::offset(java_string); + value = typeArrayOop(oopDesc::bs()->read_barrier(value)); return java_lang_String::hash_code(value->char_at_addr(offset), length); } @@ -355,6 +360,7 @@ int offset = java_lang_String::offset(java_string); int length = java_lang_String::length(java_string); + value = typeArrayOop(oopDesc::bs()->read_barrier(value)); jchar* base = (length == 0) ? NULL : value->char_at_addr(offset); if (base == NULL) return NULL; @@ -375,6 +381,7 @@ typeArrayOop value = java_lang_String::value(java_string); int offset = java_lang_String::offset(java_string); + value = typeArrayOop(oopDesc::bs()->read_barrier(value)); return StringTable::hash_string(value->char_at_addr(offset), length); } @@ -383,6 +390,7 @@ typeArrayOop value = java_lang_String::value(obj); int offset = java_lang_String::offset(obj); int length = java_lang_String::length(obj); + value = typeArrayOop(oopDesc::bs()->read_barrier(value)); jchar* base = (length == 0) ? NULL : value->char_at_addr(offset); Symbol* sym = SymbolTable::lookup_unicode(base, length, THREAD); return sym; @@ -392,6 +400,7 @@ typeArrayOop value = java_lang_String::value(java_string); int offset = java_lang_String::offset(java_string); int length = java_lang_String::length(java_string); + value = typeArrayOop(oopDesc::bs()->read_barrier(value)); jchar* base = (length == 0) ? NULL : value->char_at_addr(offset); return SymbolTable::probe_unicode(base, length); } @@ -401,6 +410,7 @@ typeArrayOop value = java_lang_String::value(java_string); int offset = java_lang_String::offset(java_string); int length = java_lang_String::length(java_string); + value = typeArrayOop(oopDesc::bs()->read_barrier(value)); jchar* position = (length == 0) ? NULL : value->char_at_addr(offset); return UNICODE::utf8_length(position, length); } @@ -409,6 +419,7 @@ typeArrayOop value = java_lang_String::value(java_string); int offset = java_lang_String::offset(java_string); int length = java_lang_String::length(java_string); + value = typeArrayOop(oopDesc::bs()->read_barrier(value)); jchar* position = (length == 0) ? NULL : value->char_at_addr(offset); return UNICODE::as_utf8(position, length); } @@ -417,6 +428,7 @@ typeArrayOop value = java_lang_String::value(java_string); int offset = java_lang_String::offset(java_string); int length = java_lang_String::length(java_string); + value = typeArrayOop(oopDesc::bs()->read_barrier(value)); jchar* position = (length == 0) ? NULL : value->char_at_addr(offset); return UNICODE::as_utf8(position, length, buf, buflen); } @@ -426,6 +438,7 @@ int offset = java_lang_String::offset(java_string); int length = java_lang_String::length(java_string); assert(start + len <= length, "just checking"); + value = typeArrayOop(oopDesc::bs()->read_barrier(value)); jchar* position = value->char_at_addr(offset + start); return UNICODE::as_utf8(position, len); } @@ -435,6 +448,7 @@ int offset = java_lang_String::offset(java_string); int length = java_lang_String::length(java_string); assert(start + len <= length, "just checking"); + value = typeArrayOop(oopDesc::bs()->read_barrier(value)); jchar* position = value->char_at_addr(offset + start); return UNICODE::as_utf8(position, len, buf, buflen); } @@ -443,6 +457,9 @@ assert(java_string->klass() == SystemDictionary::String_klass(), "must be java_string"); typeArrayOop value = java_lang_String::value(java_string); + if (ShenandoahVerifyReadsToFromSpace) { + value = (typeArrayOop) oopDesc::bs()->read_barrier(value); + } int offset = java_lang_String::offset(java_string); int length = java_lang_String::length(java_string); if (length != len) { @@ -863,9 +880,9 @@ // Note: create_basic_type_mirror above initializes ak to a non-null value. type = ArrayKlass::cast(ak)->element_type(); } else { - assert(java_class == Universe::void_mirror(), "only valid non-array primitive"); + assert(oopDesc::bs()->write_barrier(java_class) == oopDesc::bs()->write_barrier(Universe::void_mirror()), "only valid non-array primitive"); } - assert(Universe::java_mirror(type) == java_class, "must be consistent"); + assert(oopDesc::bs()->write_barrier(Universe::java_mirror(type)) == oopDesc::bs()->write_barrier(java_class), "must be consistent"); return type; } @@ -3091,6 +3108,7 @@ } ClassLoaderData* java_lang_ClassLoader::loader_data(oop loader) { + loader = oopDesc::bs()->read_barrier(loader); return *java_lang_ClassLoader::loader_data_addr(loader); } @@ -3107,6 +3125,9 @@ } oop java_lang_ClassLoader::parent(oop loader) { + if (ShenandoahVerifyReadsToFromSpace) { + loader = oopDesc::bs()->read_barrier(loader); + } assert(is_instance(loader), "loader must be oop"); return loader->obj_field(parent_offset); }