This commit is contained in:
J. Duke 2017-07-05 19:44:04 +02:00
commit 86493e8e1a
1609 changed files with 43666 additions and 22407 deletions

View File

@ -258,3 +258,4 @@ ab55a18a95e1990a588929d5d29db3eb9985fea0 jdk9-b11
5800456add07e1a68170a229fb5e27376f8875e5 jdk9-b13 5800456add07e1a68170a229fb5e27376f8875e5 jdk9-b13
4e3aa9723e9972623e3dafc321b368e7db7e9b3b jdk9-b14 4e3aa9723e9972623e3dafc321b368e7db7e9b3b jdk9-b14
b114474fb25af4e73cb7219f7c04bd8994da03a5 jdk9-b15 b114474fb25af4e73cb7219f7c04bd8994da03a5 jdk9-b15
cf22a728521f91a4692b433d39d730a0a1b23155 jdk9-b16

View File

@ -49,7 +49,7 @@ fi
### ###
run_autogen_or_fail() { run_autogen_or_fail() {
if test "x`which autoconf 2> /dev/null`" = x; then if test "x`which autoconf 2> /dev/null | grep -v '^no autoconf in'`" = x; then
echo "Cannot locate autoconf, unable to correct situation." echo "Cannot locate autoconf, unable to correct situation."
echo "Please install autoconf and run 'bash autogen.sh' to update the generated files." echo "Please install autoconf and run 'bash autogen.sh' to update the generated files."
echo "Error: Cannot continue" 1>&2 echo "Error: Cannot continue" 1>&2
@ -80,7 +80,7 @@ check_autoconf_timestamps() {
} }
check_hg_updates() { check_hg_updates() {
if test "x`which hg 2> /dev/null`" != x; then if test "x`which hg 2> /dev/null | grep -v '^no hg in'`" != x; then
conf_updated_autoconf_files=`cd $conf_script_dir && hg status -mard 2> /dev/null | grep autoconf` conf_updated_autoconf_files=`cd $conf_script_dir && hg status -mard 2> /dev/null | grep autoconf`
if test "x$conf_updated_autoconf_files" != x; then if test "x$conf_updated_autoconf_files" != x; then
echo "Configure source code has been updated, checking time stamps" echo "Configure source code has been updated, checking time stamps"

View File

@ -258,3 +258,4 @@ e212cdcc8c11f0ba5acf6f5ddb596c4c545a93f9 jdk9-b12
088eec4c36f4d7f250fcd19c4969bf698e3d2cdc jdk9-b13 088eec4c36f4d7f250fcd19c4969bf698e3d2cdc jdk9-b13
a2b82f863ba95a596da555a4c1b871c404863e7e jdk9-b14 a2b82f863ba95a596da555a4c1b871c404863e7e jdk9-b14
e54022d0dd92106fff7f7fe670010cd7e6517ee3 jdk9-b15 e54022d0dd92106fff7f7fe670010cd7e6517ee3 jdk9-b15
422ef9d29d84f571453f015c4cb8713c3af70ee4 jdk9-b16

View File

@ -418,3 +418,4 @@ ebc44d040cd149d2120d69fe183a3dae7840f4b4 jdk9-b10
456ad9c99133803d4e1433124c85a6fd141b9ac9 jdk9-b13 456ad9c99133803d4e1433124c85a6fd141b9ac9 jdk9-b13
bd333491bb6c012d7b606939406d0fa9a5ac7ffd jdk9-b14 bd333491bb6c012d7b606939406d0fa9a5ac7ffd jdk9-b14
170f6d733d7aec062f743a6b8c1cce940a7a984a jdk9-b15 170f6d733d7aec062f743a6b8c1cce940a7a984a jdk9-b15
b14e7c0b7d3ec04127f565cda1d84122e205680c jdk9-b16

View File

@ -1221,10 +1221,8 @@ void LIRGenerator::do_UnsafeGetAndSetObject(UnsafeGetAndSetObject* x) {
bool is_obj = (type == T_ARRAY || type == T_OBJECT); bool is_obj = (type == T_ARRAY || type == T_OBJECT);
LIR_Opr offset = off.result(); LIR_Opr offset = off.result();
if (data != dst) { // Because we want a 2-arg form of xchg
__ move(data, dst); __ move(data, dst);
data = dst;
}
assert (!x->is_add() && (type == T_INT || (is_obj LP64_ONLY(&& UseCompressedOops))), "unexpected type"); assert (!x->is_add() && (type == T_INT || (is_obj LP64_ONLY(&& UseCompressedOops))), "unexpected type");
LIR_Address* addr; LIR_Address* addr;
@ -1254,7 +1252,7 @@ void LIRGenerator::do_UnsafeGetAndSetObject(UnsafeGetAndSetObject* x) {
pre_barrier(ptr, LIR_OprFact::illegalOpr /* pre_val */, pre_barrier(ptr, LIR_OprFact::illegalOpr /* pre_val */,
true /* do_load */, false /* patch */, NULL); true /* do_load */, false /* patch */, NULL);
} }
__ xchg(LIR_OprFact::address(addr), data, dst, tmp); __ xchg(LIR_OprFact::address(addr), dst, dst, tmp);
if (is_obj) { if (is_obj) {
// Seems to be a precise address // Seems to be a precise address
post_barrier(ptr, data); post_barrier(ptr, data);

View File

@ -184,7 +184,7 @@ static void pd_fill_to_aligned_words(HeapWord* tohw, size_t count, juint value)
assert(MinObjAlignmentInBytes >= BytesPerLong, "need alternate implementation"); assert(MinObjAlignmentInBytes >= BytesPerLong, "need alternate implementation");
if (value == 0 && UseBlockZeroing && if (value == 0 && UseBlockZeroing &&
(count > (BlockZeroingLowLimit >> LogHeapWordSize))) { (count > (size_t)(BlockZeroingLowLimit >> LogHeapWordSize))) {
// Call it only when block zeroing is used // Call it only when block zeroing is used
((_zero_Fn)StubRoutines::zero_aligned_words())(tohw, count); ((_zero_Fn)StubRoutines::zero_aligned_words())(tohw, count);
} else { } else {

View File

@ -231,6 +231,9 @@ public class CallSite {
// identical call sites with the same method name/bci are // identical call sites with the same method name/bci are
// possible so we have to try them all until we find the late // possible so we have to try them all until we find the late
// inline call site that has a matching inline id. // inline call site that has a matching inline id.
if (calls == null) {
return null;
}
CallSite site = sites.pop(); CallSite site = sites.pop();
for (CallSite c : calls) { for (CallSite c : calls) {
if (c.matches(site)) { if (c.matches(site)) {
@ -250,6 +253,27 @@ public class CallSite {
return null; return null;
} }
public ArrayDeque<CallSite> findCallSite2(CallSite site) {
if (calls == null) {
return null;
}
for (CallSite c : calls) {
if (c.matches(site)) {
ArrayDeque<CallSite> stack = new ArrayDeque<CallSite>();
stack.push(c);
return stack;
} else {
ArrayDeque<CallSite> stack = c.findCallSite2(site);
if (stack != null) {
stack.push(c);
return stack;
}
}
}
return null;
}
public long getInlineId() { public long getInlineId() {
return inlineId; return inlineId;
} }

View File

@ -49,6 +49,12 @@ public class Compilation implements LogEvent {
this.id = id; this.id = id;
} }
void reset() {
call = new CallSite();
lateInlineCall = new CallSite();
phases = new ArrayList<Phase>(4);
}
Phase getPhase(String s) { Phase getPhase(String s) {
for (Phase p : getPhases()) { for (Phase p : getPhases()) {
if (p.getName().equals(s)) { if (p.getName().equals(s)) {
@ -212,10 +218,6 @@ public class Compilation implements LogEvent {
return phases; return phases;
} }
public void setPhases(ArrayList<Phase> phases) {
this.setPhases(phases);
}
public String getFailureReason() { public String getFailureReason() {
return failureReason; return failureReason;
} }
@ -240,10 +242,6 @@ public class Compilation implements LogEvent {
return call; return call;
} }
public void setCall(CallSite call) {
this.call = call;
}
public CallSite getLateInlineCall() { public CallSite getLateInlineCall() {
return lateInlineCall; return lateInlineCall;
} }

View File

@ -395,6 +395,7 @@ public class LogParser extends DefaultHandler implements ErrorHandler, Constants
compile.setEnd(Double.parseDouble(search(atts, "stamp"))); compile.setEnd(Double.parseDouble(search(atts, "stamp")));
if (Integer.parseInt(search(atts, "success")) == 0) { if (Integer.parseInt(search(atts, "success")) == 0) {
compile.setFailureReason(failureReason); compile.setFailureReason(failureReason);
failureReason = null;
} }
} else if (qname.equals("make_not_entrant")) { } else if (qname.equals("make_not_entrant")) {
String id = makeId(atts); String id = makeId(atts);
@ -451,6 +452,12 @@ public class LogParser extends DefaultHandler implements ErrorHandler, Constants
nmethods.put(id, nm); nmethods.put(id, nm);
events.add(nm); events.add(nm);
} else if (qname.equals("parse")) { } else if (qname.equals("parse")) {
if (failureReason != null && scopes.size() == 0 && !lateInlining) {
failureReason = null;
compile.reset();
site = compile.getCall();
}
if (methodHandleSite != null) { if (methodHandleSite != null) {
throw new InternalError("method handle site should have been replaced"); throw new InternalError("method handle site should have been replaced");
} }
@ -529,6 +536,18 @@ public class LogParser extends DefaultHandler implements ErrorHandler, Constants
site = compile.getCall().findCallSite(thisCallScopes); site = compile.getCall().findCallSite(thisCallScopes);
if (site == null) { if (site == null) {
System.out.println("call scopes:");
for (CallSite c : thisCallScopes) {
System.out.println(c.getMethod() + " " + c.getBci() + " " + c.getInlineId());
}
CallSite c = thisCallScopes.getLast();
if (c.getInlineId() != 0) {
System.out.println("Looking for call site in entire tree:");
ArrayDeque<CallSite> stack = compile.getCall().findCallSite2(c);
for (CallSite c2 : stack) {
System.out.println(c2.getMethod() + " " + c2.getBci() + " " + c2.getInlineId());
}
}
System.out.println(caller.getMethod() + " bci: " + bci); System.out.println(caller.getMethod() + " bci: " + bci);
throw new InternalError("couldn't find call site"); throw new InternalError("couldn't find call site");
} }

View File

@ -1083,7 +1083,7 @@ void LIR_OpLabel::emit_code(LIR_Assembler* masm) {
void LIR_OpArrayCopy::emit_code(LIR_Assembler* masm) { void LIR_OpArrayCopy::emit_code(LIR_Assembler* masm) {
masm->emit_arraycopy(this); masm->emit_arraycopy(this);
masm->emit_code_stub(stub()); masm->append_code_stub(stub());
} }
void LIR_OpUpdateCRC32::emit_code(LIR_Assembler* masm) { void LIR_OpUpdateCRC32::emit_code(LIR_Assembler* masm) {
@ -1100,20 +1100,20 @@ void LIR_Op1::emit_code(LIR_Assembler* masm) {
void LIR_OpAllocObj::emit_code(LIR_Assembler* masm) { void LIR_OpAllocObj::emit_code(LIR_Assembler* masm) {
masm->emit_alloc_obj(this); masm->emit_alloc_obj(this);
masm->emit_code_stub(stub()); masm->append_code_stub(stub());
} }
void LIR_OpBranch::emit_code(LIR_Assembler* masm) { void LIR_OpBranch::emit_code(LIR_Assembler* masm) {
masm->emit_opBranch(this); masm->emit_opBranch(this);
if (stub()) { if (stub()) {
masm->emit_code_stub(stub()); masm->append_code_stub(stub());
} }
} }
void LIR_OpConvert::emit_code(LIR_Assembler* masm) { void LIR_OpConvert::emit_code(LIR_Assembler* masm) {
masm->emit_opConvert(this); masm->emit_opConvert(this);
if (stub() != NULL) { if (stub() != NULL) {
masm->emit_code_stub(stub()); masm->append_code_stub(stub());
} }
} }
@ -1123,13 +1123,13 @@ void LIR_Op2::emit_code(LIR_Assembler* masm) {
void LIR_OpAllocArray::emit_code(LIR_Assembler* masm) { void LIR_OpAllocArray::emit_code(LIR_Assembler* masm) {
masm->emit_alloc_array(this); masm->emit_alloc_array(this);
masm->emit_code_stub(stub()); masm->append_code_stub(stub());
} }
void LIR_OpTypeCheck::emit_code(LIR_Assembler* masm) { void LIR_OpTypeCheck::emit_code(LIR_Assembler* masm) {
masm->emit_opTypeCheck(this); masm->emit_opTypeCheck(this);
if (stub()) { if (stub()) {
masm->emit_code_stub(stub()); masm->append_code_stub(stub());
} }
} }
@ -1144,7 +1144,7 @@ void LIR_Op3::emit_code(LIR_Assembler* masm) {
void LIR_OpLock::emit_code(LIR_Assembler* masm) { void LIR_OpLock::emit_code(LIR_Assembler* masm) {
masm->emit_lock(this); masm->emit_lock(this);
if (stub()) { if (stub()) {
masm->emit_code_stub(stub()); masm->append_code_stub(stub());
} }
} }

View File

@ -1127,6 +1127,7 @@ class LIR_Op: public CompilationResourceObj {
virtual void print_instr(outputStream* out) const = 0; virtual void print_instr(outputStream* out) const = 0;
virtual void print_on(outputStream* st) const PRODUCT_RETURN; virtual void print_on(outputStream* st) const PRODUCT_RETURN;
virtual bool is_patching() { return false; }
virtual LIR_OpCall* as_OpCall() { return NULL; } virtual LIR_OpCall* as_OpCall() { return NULL; }
virtual LIR_OpJavaCall* as_OpJavaCall() { return NULL; } virtual LIR_OpJavaCall* as_OpJavaCall() { return NULL; }
virtual LIR_OpLabel* as_OpLabel() { return NULL; } virtual LIR_OpLabel* as_OpLabel() { return NULL; }
@ -1387,6 +1388,7 @@ class LIR_Op1: public LIR_Op {
return (LIR_MoveKind)_flags; return (LIR_MoveKind)_flags;
} }
virtual bool is_patching() { return _patch != lir_patch_none; }
virtual void emit_code(LIR_Assembler* masm); virtual void emit_code(LIR_Assembler* masm);
virtual LIR_Op1* as_Op1() { return this; } virtual LIR_Op1* as_Op1() { return this; }
virtual const char * name() const PRODUCT_RETURN0; virtual const char * name() const PRODUCT_RETURN0;
@ -1619,6 +1621,7 @@ public:
int profiled_bci() const { return _profiled_bci; } int profiled_bci() const { return _profiled_bci; }
bool should_profile() const { return _should_profile; } bool should_profile() const { return _should_profile; }
virtual bool is_patching() { return _info_for_patch != NULL; }
virtual void emit_code(LIR_Assembler* masm); virtual void emit_code(LIR_Assembler* masm);
virtual LIR_OpTypeCheck* as_OpTypeCheck() { return this; } virtual LIR_OpTypeCheck* as_OpTypeCheck() { return this; }
void print_instr(outputStream* out) const PRODUCT_RETURN; void print_instr(outputStream* out) const PRODUCT_RETURN;

View File

@ -58,7 +58,7 @@ void LIR_Assembler::patching_epilog(PatchingStub* patch, LIR_PatchCode patch_cod
_masm->nop(); _masm->nop();
} }
patch->install(_masm, patch_code, obj, info); patch->install(_masm, patch_code, obj, info);
append_patching_stub(patch); append_code_stub(patch);
#ifdef ASSERT #ifdef ASSERT
Bytecodes::Code code = info->scope()->method()->java_code_at_bci(info->stack()->bci()); Bytecodes::Code code = info->scope()->method()->java_code_at_bci(info->stack()->bci());
@ -131,11 +131,6 @@ LIR_Assembler::~LIR_Assembler() {
} }
void LIR_Assembler::append_patching_stub(PatchingStub* stub) {
_slow_case_stubs->append(stub);
}
void LIR_Assembler::check_codespace() { void LIR_Assembler::check_codespace() {
CodeSection* cs = _masm->code_section(); CodeSection* cs = _masm->code_section();
if (cs->remaining() < (int)(NOT_LP64(1*K)LP64_ONLY(2*K))) { if (cs->remaining() < (int)(NOT_LP64(1*K)LP64_ONLY(2*K))) {
@ -144,7 +139,7 @@ void LIR_Assembler::check_codespace() {
} }
void LIR_Assembler::emit_code_stub(CodeStub* stub) { void LIR_Assembler::append_code_stub(CodeStub* stub) {
_slow_case_stubs->append(stub); _slow_case_stubs->append(stub);
} }
@ -442,7 +437,7 @@ void LIR_Assembler::add_debug_info_for_null_check_here(CodeEmitInfo* cinfo) {
void LIR_Assembler::add_debug_info_for_null_check(int pc_offset, CodeEmitInfo* cinfo) { void LIR_Assembler::add_debug_info_for_null_check(int pc_offset, CodeEmitInfo* cinfo) {
ImplicitNullCheckStub* stub = new ImplicitNullCheckStub(pc_offset, cinfo); ImplicitNullCheckStub* stub = new ImplicitNullCheckStub(pc_offset, cinfo);
emit_code_stub(stub); append_code_stub(stub);
} }
void LIR_Assembler::add_debug_info_for_div0_here(CodeEmitInfo* info) { void LIR_Assembler::add_debug_info_for_div0_here(CodeEmitInfo* info) {
@ -451,7 +446,7 @@ void LIR_Assembler::add_debug_info_for_div0_here(CodeEmitInfo* info) {
void LIR_Assembler::add_debug_info_for_div0(int pc_offset, CodeEmitInfo* cinfo) { void LIR_Assembler::add_debug_info_for_div0(int pc_offset, CodeEmitInfo* cinfo) {
DivByZeroStub* stub = new DivByZeroStub(pc_offset, cinfo); DivByZeroStub* stub = new DivByZeroStub(pc_offset, cinfo);
emit_code_stub(stub); append_code_stub(stub);
} }
void LIR_Assembler::emit_rtcall(LIR_OpRTCall* op) { void LIR_Assembler::emit_rtcall(LIR_OpRTCall* op) {

View File

@ -144,7 +144,7 @@ class LIR_Assembler: public CompilationResourceObj {
// stubs // stubs
void emit_slow_case_stubs(); void emit_slow_case_stubs();
void emit_static_call_stub(); void emit_static_call_stub();
void emit_code_stub(CodeStub* op); void append_code_stub(CodeStub* op);
void add_call_info_here(CodeEmitInfo* info) { add_call_info(code_offset(), info); } void add_call_info_here(CodeEmitInfo* info) { add_call_info(code_offset(), info); }
// code patterns // code patterns

View File

@ -2382,16 +2382,6 @@ OopMap* LinearScan::compute_oop_map(IntervalWalker* iw, LIR_Op* op, CodeEmitInfo
int arg_count = frame_map()->oop_map_arg_count(); int arg_count = frame_map()->oop_map_arg_count();
OopMap* map = new OopMap(frame_size, arg_count); OopMap* map = new OopMap(frame_size, arg_count);
// Check if this is a patch site.
bool is_patch_info = false;
if (op->code() == lir_move) {
assert(!is_call_site, "move must not be a call site");
assert(op->as_Op1() != NULL, "move must be LIR_Op1");
LIR_Op1* move = (LIR_Op1*)op;
is_patch_info = move->patch_code() != lir_patch_none;
}
// Iterate through active intervals // Iterate through active intervals
for (Interval* interval = iw->active_first(fixedKind); interval != Interval::end(); interval = interval->next()) { for (Interval* interval = iw->active_first(fixedKind); interval != Interval::end(); interval = interval->next()) {
int assigned_reg = interval->assigned_reg(); int assigned_reg = interval->assigned_reg();
@ -2406,7 +2396,7 @@ OopMap* LinearScan::compute_oop_map(IntervalWalker* iw, LIR_Op* op, CodeEmitInfo
// moves, any intervals which end at this instruction are included // moves, any intervals which end at this instruction are included
// in the oop map since we may safepoint while doing the patch // in the oop map since we may safepoint while doing the patch
// before we've consumed the inputs. // before we've consumed the inputs.
if (is_patch_info || op->id() < interval->current_to()) { if (op->is_patching() || op->id() < interval->current_to()) {
// caller-save registers must not be included into oop-maps at calls // caller-save registers must not be included into oop-maps at calls
assert(!is_call_site || assigned_reg >= nof_regs || !is_caller_save(assigned_reg), "interval is in a caller-save register at a call -> register will be overwritten"); assert(!is_call_site || assigned_reg >= nof_regs || !is_caller_save(assigned_reg), "interval is in a caller-save register at a call -> register will be overwritten");

View File

@ -274,6 +274,8 @@ void ClassLoaderData::add_class(Klass* k) {
MutexLockerEx ml(metaspace_lock(), Mutex::_no_safepoint_check_flag); MutexLockerEx ml(metaspace_lock(), Mutex::_no_safepoint_check_flag);
Klass* old_value = _klasses; Klass* old_value = _klasses;
k->set_next_link(old_value); k->set_next_link(old_value);
// Make sure linked class is stable, since the class list is walked without a lock
OrderAccess::storestore();
// link the new item into the list // link the new item into the list
_klasses = k; _klasses = k;

View File

@ -2036,7 +2036,7 @@ void ClassVerifier::verify_switch(
while ((bcp + padding_offset) < aligned_bcp) { while ((bcp + padding_offset) < aligned_bcp) {
if(*(bcp + padding_offset) != 0) { if(*(bcp + padding_offset) != 0) {
verify_error(ErrorContext::bad_code(bci), verify_error(ErrorContext::bad_code(bci),
"Nonzero padding byte in lookswitch or tableswitch"); "Nonzero padding byte in lookupswitch or tableswitch");
return; return;
} }
padding_offset++; padding_offset++;

View File

@ -307,6 +307,9 @@ bool CompilerOracle::should_print(methodHandle method) {
return (check_predicate(PrintCommand, method)); return (check_predicate(PrintCommand, method));
} }
bool CompilerOracle::should_print_methods() {
return lists[PrintCommand] != NULL;
}
bool CompilerOracle::should_log(methodHandle method) { bool CompilerOracle::should_log(methodHandle method) {
if (!LogCompilation) return false; if (!LogCompilation) return false;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -73,6 +73,9 @@ class CompilerOracle : AllStatic {
// For updating the oracle file // For updating the oracle file
static void append_comment_to_file(const char* message); static void append_comment_to_file(const char* message);
static void append_exclude_to_file(methodHandle method); static void append_exclude_to_file(methodHandle method);
// Tells whether there are any methods to print for print_method_statistics()
static bool should_print_methods();
}; };
#endif // SHARE_VM_COMPILER_COMPILERORACLE_HPP #endif // SHARE_VM_COMPILER_COMPILERORACLE_HPP

View File

@ -1267,8 +1267,10 @@ IRT_END
// This is a support of the JVMTI PopFrame interface. // This is a support of the JVMTI PopFrame interface.
// Make sure it is an invokestatic of a polymorphic intrinsic that has a member_name argument // Make sure it is an invokestatic of a polymorphic intrinsic that has a member_name argument
// and return it as a vm_result so that it can be reloaded in the list of invokestatic parameters. // and return it as a vm_result so that it can be reloaded in the list of invokestatic parameters.
// The dmh argument is a reference to a DirectMethoHandle that has a member name field. // The member_name argument is a saved reference (in local#0) to the member_name.
IRT_ENTRY(void, InterpreterRuntime::member_name_arg_or_null(JavaThread* thread, address dmh, // For backward compatibility with some JDK versions (7, 8) it can also be a direct method handle.
// FIXME: remove DMH case after j.l.i.InvokerBytecodeGenerator code shape is updated.
IRT_ENTRY(void, InterpreterRuntime::member_name_arg_or_null(JavaThread* thread, address member_name,
Method* method, address bcp)) Method* method, address bcp))
Bytecodes::Code code = Bytecodes::code_at(method, bcp); Bytecodes::Code code = Bytecodes::code_at(method, bcp);
if (code != Bytecodes::_invokestatic) { if (code != Bytecodes::_invokestatic) {
@ -1280,8 +1282,12 @@ IRT_ENTRY(void, InterpreterRuntime::member_name_arg_or_null(JavaThread* thread,
Symbol* mname = cpool->name_ref_at(cp_index); Symbol* mname = cpool->name_ref_at(cp_index);
if (MethodHandles::has_member_arg(cname, mname)) { if (MethodHandles::has_member_arg(cname, mname)) {
oop member_name = java_lang_invoke_DirectMethodHandle::member((oop)dmh); oop member_name_oop = (oop) member_name;
thread->set_vm_result(member_name); if (java_lang_invoke_DirectMethodHandle::is_instance(member_name_oop)) {
// FIXME: remove after j.l.i.InvokerBytecodeGenerator code shape is updated.
member_name_oop = java_lang_invoke_DirectMethodHandle::member(member_name_oop);
}
thread->set_vm_result(member_name_oop);
} }
IRT_END IRT_END
#endif // INCLUDE_JVMTI #endif // INCLUDE_JVMTI

View File

@ -3095,7 +3095,7 @@ void Metaspace::ergo_initialize() {
void Metaspace::global_initialize() { void Metaspace::global_initialize() {
// Initialize the alignment for shared spaces. // Initialize the alignment for shared spaces.
int max_alignment = os::vm_page_size(); int max_alignment = os::vm_allocation_granularity();
size_t cds_total = 0; size_t cds_total = 0;
MetaspaceShared::set_max_alignment(max_alignment); MetaspaceShared::set_max_alignment(max_alignment);

View File

@ -1273,6 +1273,12 @@ bool InstanceKlass::find_field_from_offset(int offset, bool is_static, fieldDesc
void InstanceKlass::methods_do(void f(Method* method)) { void InstanceKlass::methods_do(void f(Method* method)) {
// Methods aren't stable until they are loaded. This can be read outside
// a lock through the ClassLoaderData for profiling
if (!is_loaded()) {
return;
}
int len = methods()->length(); int len = methods()->length();
for (int index = 0; index < len; index++) { for (int index = 0; index < len; index++) {
Method* m = methods()->at(index); Method* m = methods()->at(index);

View File

@ -155,6 +155,9 @@ void C2Compiler::compile_method(ciEnv* env, ciMethod* target, int entry_bci) {
} }
} }
// print inlining for last compilation only
C.dump_print_inlining();
// No retry; just break the loop. // No retry; just break the loop.
break; break;
} }

View File

@ -672,6 +672,7 @@ Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr
_print_inlining_list(NULL), _print_inlining_list(NULL),
_print_inlining_stream(NULL), _print_inlining_stream(NULL),
_print_inlining_idx(0), _print_inlining_idx(0),
_print_inlining_output(NULL),
_preserve_jvm_state(0), _preserve_jvm_state(0),
_interpreter_frame_size(0) { _interpreter_frame_size(0) {
C = this; C = this;
@ -978,6 +979,7 @@ Compile::Compile( ciEnv* ci_env,
_print_inlining_list(NULL), _print_inlining_list(NULL),
_print_inlining_stream(NULL), _print_inlining_stream(NULL),
_print_inlining_idx(0), _print_inlining_idx(0),
_print_inlining_output(NULL),
_preserve_jvm_state(0), _preserve_jvm_state(0),
_allowed_reasons(0), _allowed_reasons(0),
_interpreter_frame_size(0) { _interpreter_frame_size(0) {
@ -2207,7 +2209,7 @@ void Compile::Optimize() {
} // (End scope of igvn; run destructor if necessary for asserts.) } // (End scope of igvn; run destructor if necessary for asserts.)
dump_inlining(); process_print_inlining();
// A method with only infinite loops has no edges entering loops from root // A method with only infinite loops has no edges entering loops from root
{ {
NOT_PRODUCT( TracePhase t2("graphReshape", &_t_graphReshaping, TimeCompiler); ) NOT_PRODUCT( TracePhase t2("graphReshape", &_t_graphReshaping, TimeCompiler); )
@ -3868,7 +3870,7 @@ void Compile::print_inlining_assert_ready() {
assert(!_print_inlining || _print_inlining_stream->size() == 0, "loosing data"); assert(!_print_inlining || _print_inlining_stream->size() == 0, "loosing data");
} }
void Compile::dump_inlining() { void Compile::process_print_inlining() {
bool do_print_inlining = print_inlining() || print_intrinsics(); bool do_print_inlining = print_inlining() || print_intrinsics();
if (do_print_inlining || log() != NULL) { if (do_print_inlining || log() != NULL) {
// Print inlining message for candidates that we couldn't inline // Print inlining message for candidates that we couldn't inline
@ -3885,9 +3887,21 @@ void Compile::dump_inlining() {
} }
} }
if (do_print_inlining) { if (do_print_inlining) {
ResourceMark rm;
stringStream ss;
for (int i = 0; i < _print_inlining_list->length(); i++) { for (int i = 0; i < _print_inlining_list->length(); i++) {
tty->print("%s", _print_inlining_list->adr_at(i)->ss()->as_string()); ss.print("%s", _print_inlining_list->adr_at(i)->ss()->as_string());
} }
size_t end = ss.size();
_print_inlining_output = NEW_ARENA_ARRAY(comp_arena(), char, end+1);
strncpy(_print_inlining_output, ss.base(), end+1);
_print_inlining_output[end] = 0;
}
}
void Compile::dump_print_inlining() {
if (_print_inlining_output != NULL) {
tty->print_raw(_print_inlining_output);
} }
} }

View File

@ -420,6 +420,7 @@ class Compile : public Phase {
stringStream* _print_inlining_stream; stringStream* _print_inlining_stream;
GrowableArray<PrintInliningBuffer>* _print_inlining_list; GrowableArray<PrintInliningBuffer>* _print_inlining_list;
int _print_inlining_idx; int _print_inlining_idx;
char* _print_inlining_output;
// Only keep nodes in the expensive node list that need to be optimized // Only keep nodes in the expensive node list that need to be optimized
void cleanup_expensive_nodes(PhaseIterGVN &igvn); void cleanup_expensive_nodes(PhaseIterGVN &igvn);
@ -917,7 +918,8 @@ class Compile : public Phase {
void remove_useless_late_inlines(GrowableArray<CallGenerator*>* inlines, Unique_Node_List &useful); void remove_useless_late_inlines(GrowableArray<CallGenerator*>* inlines, Unique_Node_List &useful);
void dump_inlining(); void process_print_inlining();
void dump_print_inlining();
bool over_inlining_cutoff() const { bool over_inlining_cutoff() const {
if (!inlining_incrementally()) { if (!inlining_incrementally()) {

View File

@ -307,9 +307,9 @@ JvmtiEnv::GetObjectSize(jobject object, jlong* size_ptr) {
!java_lang_Class::is_primitive(mirror)) { !java_lang_Class::is_primitive(mirror)) {
Klass* k = java_lang_Class::as_Klass(mirror); Klass* k = java_lang_Class::as_Klass(mirror);
assert(k != NULL, "class for non-primitive mirror must exist"); assert(k != NULL, "class for non-primitive mirror must exist");
*size_ptr = k->size() * wordSize; *size_ptr = (jlong)k->size() * wordSize;
} else { } else {
*size_ptr = mirror->size() * wordSize; *size_ptr = (jlong)mirror->size() * wordSize;
} }
return JVMTI_ERROR_NONE; return JVMTI_ERROR_NONE;
} /* end GetObjectSize */ } /* end GetObjectSize */

View File

@ -33,9 +33,11 @@
#include "prims/whitebox.hpp" #include "prims/whitebox.hpp"
#include "prims/wbtestmethods/parserTests.hpp" #include "prims/wbtestmethods/parserTests.hpp"
#include "runtime/thread.hpp"
#include "runtime/arguments.hpp" #include "runtime/arguments.hpp"
#include "runtime/interfaceSupport.hpp" #include "runtime/interfaceSupport.hpp"
#include "runtime/os.hpp" #include "runtime/os.hpp"
#include "utilities/debug.hpp" #include "utilities/debug.hpp"
#include "utilities/macros.hpp" #include "utilities/macros.hpp"
#include "utilities/exceptions.hpp" #include "utilities/exceptions.hpp"
@ -576,6 +578,15 @@ WB_ENTRY(jobjectArray, WB_GetNMethod(JNIEnv* env, jobject o, jobject method, jbo
WB_END WB_END
WB_ENTRY(jlong, WB_GetThreadStackSize(JNIEnv* env, jobject o))
return (jlong) Thread::current()->stack_size();
WB_END
WB_ENTRY(jlong, WB_GetThreadRemainingStackSize(JNIEnv* env, jobject o))
JavaThread* t = JavaThread::current();
return (jlong) t->stack_available(os::current_stack_pointer()) - (jlong) StackShadowPages * os::vm_page_size();
WB_END
//Some convenience methods to deal with objects from java //Some convenience methods to deal with objects from java
int WhiteBox::offset_for_field(const char* field_name, oop object, int WhiteBox::offset_for_field(const char* field_name, oop object,
Symbol* signature_symbol) { Symbol* signature_symbol) {
@ -690,6 +701,8 @@ static JNINativeMethod methods[] = {
{CC"getCPUFeatures", CC"()Ljava/lang/String;", (void*)&WB_GetCPUFeatures }, {CC"getCPUFeatures", CC"()Ljava/lang/String;", (void*)&WB_GetCPUFeatures },
{CC"getNMethod", CC"(Ljava/lang/reflect/Executable;Z)[Ljava/lang/Object;", {CC"getNMethod", CC"(Ljava/lang/reflect/Executable;Z)[Ljava/lang/Object;",
(void*)&WB_GetNMethod }, (void*)&WB_GetNMethod },
{CC"getThreadStackSize", CC"()J", (void*)&WB_GetThreadStackSize },
{CC"getThreadRemainingStackSize", CC"()J", (void*)&WB_GetThreadRemainingStackSize },
}; };
#undef CC #undef CC

View File

@ -1449,7 +1449,7 @@ bool verify_object_alignment() {
return true; return true;
} }
uintx Arguments::max_heap_for_compressed_oops() { size_t Arguments::max_heap_for_compressed_oops() {
// Avoid sign flip. // Avoid sign flip.
assert(OopEncodingHeapMax > (uint64_t)os::vm_page_size(), "Unusual page size"); assert(OopEncodingHeapMax > (uint64_t)os::vm_page_size(), "Unusual page size");
// We need to fit both the NULL page and the heap into the memory budget, while // We need to fit both the NULL page and the heap into the memory budget, while

View File

@ -120,7 +120,8 @@ void collect_profiled_methods(Method* m) {
} }
void print_method_profiling_data() { void print_method_profiling_data() {
if (ProfileInterpreter COMPILER1_PRESENT(|| C1UpdateMethodData)) { if (ProfileInterpreter COMPILER1_PRESENT(|| C1UpdateMethodData) &&
(PrintMethodData || CompilerOracle::should_print_methods())) {
ResourceMark rm; ResourceMark rm;
HandleMark hm; HandleMark hm;
collected_profiled_methods = new GrowableArray<Method*>(1024); collected_profiled_methods = new GrowableArray<Method*>(1024);

View File

@ -0,0 +1,97 @@
/*
* Copyright (c) 2014, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
#ifndef SHARE_VM_RUNTIME_SHAREDRUNTIMEMATH_HPP
#define SHARE_VM_RUNTIME_SHAREDRUNTIMEMATH_HPP
#include <math.h>
// VM_LITTLE_ENDIAN is #defined appropriately in the Makefiles
// [jk] this is not 100% correct because the float word order may different
// from the byte order (e.g. on ARM FPA)
#ifdef VM_LITTLE_ENDIAN
# define __HI(x) *(1+(int*)&x)
# define __LO(x) *(int*)&x
#else
# define __HI(x) *(int*)&x
# define __LO(x) *(1+(int*)&x)
#endif
static double copysignA(double x, double y) {
__HI(x) = (__HI(x)&0x7fffffff)|(__HI(y)&0x80000000);
return x;
}
/*
* ====================================================
* Copyright (c) 1998 Oracle and/or its affiliates. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* scalbn (double x, int n)
* scalbn(x,n) returns x* 2**n computed by exponent
* manipulation rather than by actually performing an
* exponentiation or a multiplication.
*/
static const double
two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
twom54 = 5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
hugeX = 1.0e+300,
tiny = 1.0e-300;
static double scalbnA (double x, int n) {
int k,hx,lx;
hx = __HI(x);
lx = __LO(x);
k = (hx&0x7ff00000)>>20; /* extract exponent */
if (k==0) { /* 0 or subnormal x */
if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
x *= two54;
hx = __HI(x);
k = ((hx&0x7ff00000)>>20) - 54;
if (n< -50000) return tiny*x; /*underflow*/
}
if (k==0x7ff) return x+x; /* NaN or Inf */
k = k+n;
if (k > 0x7fe) return hugeX*copysignA(hugeX,x); /* overflow */
if (k > 0) /* normal result */
{__HI(x) = (hx&0x800fffff)|(k<<20); return x;}
if (k <= -54) {
if (n > 50000) /* in case integer overflow in n+k */
return hugeX*copysignA(hugeX,x); /*overflow*/
else return tiny*copysignA(tiny,x); /*underflow*/
}
k += 54; /* subnormal result */
__HI(x) = (hx&0x800fffff)|(k<<20);
return x*twom54;
}
#endif // SHARE_VM_RUNTIME_SHAREDRUNTIMEMATH_HPP

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -43,78 +43,7 @@
# pragma optimize ( "", off ) # pragma optimize ( "", off )
#endif #endif
#include <math.h> #include "runtime/sharedRuntimeMath.hpp"
// VM_LITTLE_ENDIAN is #defined appropriately in the Makefiles
// [jk] this is not 100% correct because the float word order may different
// from the byte order (e.g. on ARM)
#ifdef VM_LITTLE_ENDIAN
# define __HI(x) *(1+(int*)&x)
# define __LO(x) *(int*)&x
#else
# define __HI(x) *(int*)&x
# define __LO(x) *(1+(int*)&x)
#endif
#if !defined(AIX)
double copysign(double x, double y) {
__HI(x) = (__HI(x)&0x7fffffff)|(__HI(y)&0x80000000);
return x;
}
#endif
/*
* ====================================================
* Copyright (c) 1998 Oracle and/or its affiliates. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
/*
* scalbn (double x, int n)
* scalbn(x,n) returns x* 2**n computed by exponent
* manipulation rather than by actually performing an
* exponentiation or a multiplication.
*/
static const double
two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
twom54 = 5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
hugeX = 1.0e+300,
tiny = 1.0e-300;
#if !defined(AIX)
double scalbn (double x, int n) {
int k,hx,lx;
hx = __HI(x);
lx = __LO(x);
k = (hx&0x7ff00000)>>20; /* extract exponent */
if (k==0) { /* 0 or subnormal x */
if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
x *= two54;
hx = __HI(x);
k = ((hx&0x7ff00000)>>20) - 54;
if (n< -50000) return tiny*x; /*underflow*/
}
if (k==0x7ff) return x+x; /* NaN or Inf */
k = k+n;
if (k > 0x7fe) return hugeX*copysign(hugeX,x); /* overflow */
if (k > 0) /* normal result */
{__HI(x) = (hx&0x800fffff)|(k<<20); return x;}
if (k <= -54) {
if (n > 50000) /* in case integer overflow in n+k */
return hugeX*copysign(hugeX,x); /*overflow*/
else return tiny*copysign(tiny,x); /*underflow*/
}
k += 54; /* subnormal result */
__HI(x) = (hx&0x800fffff)|(k<<20);
return x*twom54;
}
#endif
/* __ieee754_log(x) /* __ieee754_log(x)
* Return the logarithm of x * Return the logarithm of x
@ -719,7 +648,7 @@ double __ieee754_pow(double x, double y) {
z = one-(r-z); z = one-(r-z);
j = __HI(z); j = __HI(z);
j += (n<<20); j += (n<<20);
if((j>>20)<=0) z = scalbn(z,n); /* subnormal output */ if((j>>20)<=0) z = scalbnA(z,n); /* subnormal output */
else __HI(z) += (n<<20); else __HI(z) += (n<<20);
return s*z; return s*z;
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -63,63 +63,7 @@
#define SAFEBUF #define SAFEBUF
#endif #endif
#include <math.h> #include "runtime/sharedRuntimeMath.hpp"
// VM_LITTLE_ENDIAN is #defined appropriately in the Makefiles
// [jk] this is not 100% correct because the float word order may different
// from the byte order (e.g. on ARM)
#ifdef VM_LITTLE_ENDIAN
# define __HI(x) *(1+(int*)&x)
# define __LO(x) *(int*)&x
#else
# define __HI(x) *(int*)&x
# define __LO(x) *(1+(int*)&x)
#endif
static double copysignA(double x, double y) {
__HI(x) = (__HI(x)&0x7fffffff)|(__HI(y)&0x80000000);
return x;
}
/*
* scalbn (double x, int n)
* scalbn(x,n) returns x* 2**n computed by exponent
* manipulation rather than by actually performing an
* exponentiation or a multiplication.
*/
static const double
two54 = 1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
twom54 = 5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
hugeX = 1.0e+300,
tiny = 1.0e-300;
static double scalbnA (double x, int n) {
int k,hx,lx;
hx = __HI(x);
lx = __LO(x);
k = (hx&0x7ff00000)>>20; /* extract exponent */
if (k==0) { /* 0 or subnormal x */
if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
x *= two54;
hx = __HI(x);
k = ((hx&0x7ff00000)>>20) - 54;
if (n< -50000) return tiny*x; /*underflow*/
}
if (k==0x7ff) return x+x; /* NaN or Inf */
k = k+n;
if (k > 0x7fe) return hugeX*copysignA(hugeX,x); /* overflow */
if (k > 0) /* normal result */
{__HI(x) = (hx&0x800fffff)|(k<<20); return x;}
if (k <= -54) {
if (n > 50000) /* in case integer overflow in n+k */
return hugeX*copysignA(hugeX,x); /*overflow*/
else return tiny*copysignA(tiny,x); /*underflow*/
}
k += 54; /* subnormal result */
__HI(x) = (hx&0x800fffff)|(k<<20);
return x*twom54;
}
/* /*
* __kernel_rem_pio2(x,y,e0,nx,prec,ipio2) * __kernel_rem_pio2(x,y,e0,nx,prec,ipio2)

View File

@ -83,6 +83,7 @@ needs_jdk = \
runtime/RedefineObject/TestRedefineObject.java \ runtime/RedefineObject/TestRedefineObject.java \
runtime/XCheckJniJsig/XCheckJSig.java \ runtime/XCheckJniJsig/XCheckJSig.java \
serviceability/attach/AttachWithStalePidFile.java \ serviceability/attach/AttachWithStalePidFile.java \
serviceability/jvmti/8036666/GetObjectLockCount.java \
serviceability/sa/jmap-hprof/JMapHProfLargeHeapTest.java \ serviceability/sa/jmap-hprof/JMapHProfLargeHeapTest.java \
serviceability/dcmd/DynLibDcmdTest.java serviceability/dcmd/DynLibDcmdTest.java
@ -134,9 +135,12 @@ needs_compact3 = \
gc/parallelScavenge/TestDynShrinkHeap.java \ gc/parallelScavenge/TestDynShrinkHeap.java \
runtime/InternalApi/ThreadCpuTimesDeadlock.java \ runtime/InternalApi/ThreadCpuTimesDeadlock.java \
serviceability/threads/TestFalseDeadLock.java \ serviceability/threads/TestFalseDeadLock.java \
serviceability/jvmti/GetObjectSizeOverflow.java \
serviceability/jvmti/TestRedefineWithUnresolvedClass.java \
compiler/tiered/NonTieredLevelsTest.java \ compiler/tiered/NonTieredLevelsTest.java \
compiler/tiered/TieredLevelsTest.java \ compiler/tiered/TieredLevelsTest.java \
compiler/intrinsics/bmi/verifycode compiler/intrinsics/bmi/verifycode \
runtime/whitebox/WBStackSize.java
# Compact 2 adds full VM tests # Compact 2 adds full VM tests
compact2 = \ compact2 = \

View File

@ -25,7 +25,6 @@
/** /**
* @test * @test
* @bug 7005594 * @bug 7005594
* @ignore 7117034
* @summary Array overflow not handled correctly with loop optimzations * @summary Array overflow not handled correctly with loop optimzations
* *
* @run shell Test7005594.sh * @run shell Test7005594.sh

View File

@ -78,7 +78,7 @@ cp ${TESTSRC}/Test7005594.sh .
${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} -d . Test7005594.java ${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} -d . Test7005594.java
${TESTJAVA}/bin/java ${TESTVMOPTS} -Xms1600m -XX:+IgnoreUnrecognizedVMOptions -XX:-ZapUnusedHeapArea -Xcomp -XX:CompileOnly=Test7005594.test Test7005594 > test.out 2>&1 ${TESTJAVA}/bin/java ${TESTVMOPTS} -Xmx1600m -Xms1600m -XX:+IgnoreUnrecognizedVMOptions -XX:-ZapUnusedHeapArea -Xcomp -XX:CompileOnly=Test7005594.test Test7005594 > test.out 2>&1
result=$? result=$?
@ -97,7 +97,7 @@ then
fi fi
# The test should pass when no enough space for object heap # The test should pass when no enough space for object heap
grep "Could not reserve enough space for object heap" test.out grep "Could not reserve enough space for .*object heap" test.out
if [ $? = 0 ] if [ $? = 0 ]
then then
echo "Passed" echo "Passed"

View File

@ -25,6 +25,12 @@ import com.oracle.java.testlibrary.cli.*;
/** /**
* Base class for all X86 bit manipulation related command line options. * Base class for all X86 bit manipulation related command line options.
*
* Note that this test intended to verify that VM could be launched with
* specific options and that values of these options processed correctly.
* In order to do that test launch a new VM with tested options, the same
* flavor-specific flag as one that was used for parent VM (-client, -server,
* -minimal, -graal) and '-version'.
*/ */
public abstract class BMICommandLineOptionTestBase public abstract class BMICommandLineOptionTestBase
extends CPUSpecificCommandLineOptionTest { extends CPUSpecificCommandLineOptionTest {
@ -58,10 +64,11 @@ public abstract class BMICommandLineOptionTestBase
String supportedCPUFeatures[], String supportedCPUFeatures[],
String unsupportedCPUFeatures[]) { String unsupportedCPUFeatures[]) {
super(".*", supportedCPUFeatures, unsupportedCPUFeatures); super(".*", supportedCPUFeatures, unsupportedCPUFeatures);
this.optionName = optionName; this.optionName = optionName;
this.warningMessage = warningMessage; this.warningMessage = warningMessage;
this.errorMessage = CommandLineOptionTest. this.errorMessage = String.format(
UNRECOGNIZED_OPTION_ERROR_FORMAT.format(optionName); CommandLineOptionTest.UNRECOGNIZED_OPTION_ERROR_FORMAT,
optionName);
} }
} }

View File

@ -28,6 +28,12 @@ import com.oracle.java.testlibrary.cli.*;
* Test on bit manipulation related command line options, * Test on bit manipulation related command line options,
* that should be executed on CPU that supports all required * that should be executed on CPU that supports all required
* features. * features.
*
* Note that this test intended to verify that VM could be launched with
* specific options and that values of these options processed correctly.
* In order to do that test launch a new VM with tested options, the same
* flavor-specific flag as one that was used for parent VM (-client, -server,
* -minimal, -graal) and '-version'.
*/ */
public class BMISupportedCPUTest extends BMICommandLineOptionTestBase { public class BMISupportedCPUTest extends BMICommandLineOptionTestBase {
@ -49,24 +55,38 @@ public class BMISupportedCPUTest extends BMICommandLineOptionTestBase {
@Override @Override
public void runTestCases() throws Throwable { public void runTestCases() throws Throwable {
// verify that VM will succesfully start up whithout warnings /*
CommandLineOptionTest. Verify that VM will successfully start up without warnings.
verifyJVMStartup("-XX:+" + optionName, VM will be launched with following flags:
null, new String[] { warningMessage }, -XX:+<tested option> -version
ExitCode.OK); */
CommandLineOptionTest.verifySameJVMStartup(null,
new String[] { warningMessage }, ExitCode.OK,
CommandLineOptionTest.prepareBooleanFlag(optionName, true));
// verify that VM will succesfully start up whithout warnings /*
CommandLineOptionTest. Verify that VM will successfully start up without warnings.
verifyJVMStartup("-XX:-" + optionName, VM will be launched with following flags:
null, new String[] { warningMessage }, -XX:-<tested option> -version
ExitCode.OK); */
CommandLineOptionTest.verifySameJVMStartup(null,
new String[] { warningMessage }, ExitCode.OK,
CommandLineOptionTest.prepareBooleanFlag(optionName, false));
// verify that on appropriate CPU option in on by default /*
CommandLineOptionTest.verifyOptionValue(optionName, "true"); Verify that on appropriate CPU option in on by default.
VM will be launched with following flags:
-version
*/
CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "true");
// verify that option could be explicitly turned off /*
CommandLineOptionTest.verifyOptionValue(optionName, "false", Verify that option could be explicitly turned off.
"-XX:-" + optionName); VM will be launched with following flags:
-XX:-<tested option> -version
*/
CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false",
CommandLineOptionTest.prepareBooleanFlag(optionName, false));
} }
} }

View File

@ -28,6 +28,12 @@ import com.oracle.java.testlibrary.cli.*;
* Test on bit manipulation related command line options, * Test on bit manipulation related command line options,
* that should be executed on CPU that does not support * that should be executed on CPU that does not support
* required features. * required features.
*
* Note that this test intended to verify that VM could be launched with
* specific options and that values of these options processed correctly.
* In order to do that test launch a new VM with tested options, the same
* flavor-specific flag as one that was used for parent VM (-client, -server,
* -minimal, -graal) and '-version'.
*/ */
public class BMIUnsupportedCPUTest extends BMICommandLineOptionTestBase { public class BMIUnsupportedCPUTest extends BMICommandLineOptionTestBase {
@ -64,28 +70,38 @@ public class BMIUnsupportedCPUTest extends BMICommandLineOptionTestBase {
*/ */
public void unsupportedX86CPUTestCases() throws Throwable { public void unsupportedX86CPUTestCases() throws Throwable {
// verify that VM will succesfully start up, but output will /*
// contain a warning Verify that VM will successfully start up, but output will contain a
CommandLineOptionTest. warning. VM will be launched with following options:
verifyJVMStartup("-XX:+" + optionName, -XX:+<tested option> -version
new String[] { warningMessage }, */
new String[] { errorMessage }, CommandLineOptionTest.verifySameJVMStartup(
ExitCode.OK); new String[] { warningMessage }, new String[] { errorMessage },
ExitCode.OK, CommandLineOptionTest.prepareBooleanFlag(
optionName, true));
// verify that VM will succesfully startup without any warnings /*
CommandLineOptionTest. Verify that VM will successfully startup without any warnings.
verifyJVMStartup("-XX:-" + optionName, VM will be launched with following options:
null, -XX:-<tested option> -version
new String[] { warningMessage, errorMessage }, */
ExitCode.OK); CommandLineOptionTest.verifySameJVMStartup(null,
new String[] { warningMessage, errorMessage }, ExitCode.OK,
CommandLineOptionTest.prepareBooleanFlag(optionName, false));
// verify that on unsupported CPUs option is off by default /*
CommandLineOptionTest.verifyOptionValue(optionName, "false"); Verify that on unsupported CPUs option is off by default.
VM will be launched with following options: -version
*/
CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false");
// verify that on unsupported CPUs option will be off even if /*
// it was explicitly turned on by uset Verify that on unsupported CPUs option will be off even if
CommandLineOptionTest.verifyOptionValue(optionName, "false", it was explicitly turned on by user. VM will be launched with
"-XX:+" + optionName); following options: -XX:+<tested option> -version
*/
CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false",
CommandLineOptionTest.prepareBooleanFlag(optionName, true));
} }
@ -97,18 +113,17 @@ public class BMIUnsupportedCPUTest extends BMICommandLineOptionTestBase {
*/ */
public void unsupportedNonX86CPUTestCases() throws Throwable { public void unsupportedNonX86CPUTestCases() throws Throwable {
// verify that VM known nothing about tested option /*
CommandLineOptionTest. Verify that VM known nothing about tested option. VM will be launched
verifyJVMStartup("-XX:+" + optionName, with following options: -XX:[+-]<tested option> -version
new String[] { errorMessage }, */
null, CommandLineOptionTest.verifySameJVMStartup(
ExitCode.FAIL); new String[] { errorMessage }, null, ExitCode.FAIL,
CommandLineOptionTest.prepareBooleanFlag(optionName, true));
CommandLineOptionTest. CommandLineOptionTest.verifySameJVMStartup(
verifyJVMStartup("-XX:-" + optionName, new String[] { errorMessage }, null, ExitCode.FAIL,
new String[] { errorMessage }, CommandLineOptionTest.prepareBooleanFlag(optionName, false));
null,
ExitCode.FAIL);
} }
} }

View File

@ -40,7 +40,8 @@ import com.oracle.java.testlibrary.*;
import com.oracle.java.testlibrary.cli.*; import com.oracle.java.testlibrary.cli.*;
public class TestUseCountTrailingZerosInstructionOnSupportedCPU public class TestUseCountTrailingZerosInstructionOnSupportedCPU
extends BMISupportedCPUTest { extends BMISupportedCPUTest {
private static final String DISABLE_BMI = "-XX:-UseBMI1Instructions";
public TestUseCountTrailingZerosInstructionOnSupportedCPU() { public TestUseCountTrailingZerosInstructionOnSupportedCPU() {
super("UseCountTrailingZerosInstruction", TZCNT_WARNING, "bmi1"); super("UseCountTrailingZerosInstruction", TZCNT_WARNING, "bmi1");
@ -51,18 +52,23 @@ public class TestUseCountTrailingZerosInstructionOnSupportedCPU
super.runTestCases(); super.runTestCases();
// verify that option will be disabled if all BMI1 instuctions /*
// are explicitly disabled Verify that option will be disabled if all BMI1 instructions
CommandLineOptionTest. are explicitly disabled. VM will be launched with following options:
verifyOptionValue("UseCountTrailingZerosInstruction", "false", -XX:-UseBMI1Instructions -version
"-XX:-UseBMI1Instructions"); */
CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false",
TestUseCountTrailingZerosInstructionOnSupportedCPU.DISABLE_BMI);
// verify that option could be turned on even if other BMI1 /*
// instructions were turned off Verify that option could be turned on even if other BMI1
CommandLineOptionTest. instructions were turned off. VM will be launched with following
verifyOptionValue("UseCountTrailingZerosInstruction", "true", options: -XX:-UseBMI1Instructions
"-XX:-UseBMI1Instructions", -XX:+UseCountTrailingZerosInstruction -version
"-XX:+UseCountTrailingZerosInstruction"); */
CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "true",
TestUseCountTrailingZerosInstructionOnSupportedCPU.DISABLE_BMI,
CommandLineOptionTest.prepareBooleanFlag(optionName, true));
} }
public static void main(String args[]) throws Throwable { public static void main(String args[]) throws Throwable {

View File

@ -25,7 +25,7 @@
* @test * @test
* @bug 8031321 * @bug 8031321
* @summary Verify processing of UseCountTrailingZerosInstruction option * @summary Verify processing of UseCountTrailingZerosInstruction option
* on CPU without TZCNT instuction (BMI1 feature) support. * on CPU without TZCNT instruction (BMI1 feature) support.
* @library /testlibrary /testlibrary/whitebox * @library /testlibrary /testlibrary/whitebox
* @build TestUseCountTrailingZerosInstructionOnUnsupportedCPU * @build TestUseCountTrailingZerosInstructionOnUnsupportedCPU
* BMIUnsupportedCPUTest * BMIUnsupportedCPUTest
@ -40,7 +40,8 @@ import com.oracle.java.testlibrary.*;
import com.oracle.java.testlibrary.cli.*; import com.oracle.java.testlibrary.cli.*;
public class TestUseCountTrailingZerosInstructionOnUnsupportedCPU public class TestUseCountTrailingZerosInstructionOnUnsupportedCPU
extends BMIUnsupportedCPUTest { extends BMIUnsupportedCPUTest {
private static final String ENABLE_BMI = "-XX:+UseBMI1Instructions";
public TestUseCountTrailingZerosInstructionOnUnsupportedCPU() { public TestUseCountTrailingZerosInstructionOnUnsupportedCPU() {
super("UseCountTrailingZerosInstruction", TZCNT_WARNING, "bmi1"); super("UseCountTrailingZerosInstruction", TZCNT_WARNING, "bmi1");
@ -51,16 +52,24 @@ public class TestUseCountTrailingZerosInstructionOnUnsupportedCPU
super.unsupportedX86CPUTestCases(); super.unsupportedX86CPUTestCases();
// verify that option will not be turned on during /*
// UseBMI1Instuctions processing Verify that option will not be turned on during UseBMI1Instructions
CommandLineOptionTest. processing. VM will be launched with following options:
verifyOptionValue("UseCountTrailingZerosInstruction", "false", -XX:+UseBMI1Instructions -version
"-XX:+UseBMI1Instructions"); */
CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false",
TestUseCountTrailingZerosInstructionOnUnsupportedCPU.
ENABLE_BMI);
CommandLineOptionTest. /*
verifyOptionValue("UseCountTrailingZerosInstruction", "false", VM will be launched with following options:
"-XX:+UseCountTrailingZerosInstruction", -XX:+UseCountTrailingZerosInstruction -XX:+UseBMI1Instructions
"-XX:+UseBMI1Instructions"); -version
*/
CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false",
CommandLineOptionTest.prepareBooleanFlag(optionName, true),
TestUseCountTrailingZerosInstructionOnUnsupportedCPU.
ENABLE_BMI);
} }
public static void main(String args[]) throws Throwable { public static void main(String args[]) throws Throwable {

View File

@ -25,7 +25,7 @@
* @test * @test
* @bug 8031752 * @bug 8031752
* @summary speculative traps need to be cleaned up at GC * @summary speculative traps need to be cleaned up at GC
* @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -XX:+UseTypeSpeculation -XX:TypeProfileLevel=222 -XX:CompileCommand=exclude,java.lang.reflect.Method::invoke -XX:CompileCommand=exclude,sun.reflect.DelegatingMethodAccessorImpl::invoke -Xmx1M TestSpecTrapClassUnloading * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -XX:+UseTypeSpeculation -XX:TypeProfileLevel=222 -XX:CompileCommand=exclude,java.lang.reflect.Method::invoke -XX:CompileCommand=exclude,sun.reflect.DelegatingMethodAccessorImpl::invoke -Xmx512M TestSpecTrapClassUnloading
* *
*/ */
@ -45,7 +45,7 @@ public class TestSpecTrapClassUnloading {
MemoryChunk other; MemoryChunk other;
long[] array; long[] array;
MemoryChunk(MemoryChunk other) { MemoryChunk(MemoryChunk other) {
other = other; this.other = other;
array = new long[1024 * 1024 * 1024]; array = new long[1024 * 1024 * 1024];
} }
} }

View File

@ -26,7 +26,7 @@
* @bug 8016479 * @bug 8016479
* @summary Verify that the heap shrinks after full GC according to the current values of the Min/MaxHeapFreeRatio flags * @summary Verify that the heap shrinks after full GC according to the current values of the Min/MaxHeapFreeRatio flags
* @library /testlibrary * @library /testlibrary
* @run main/othervm -XX:+UseAdaptiveSizePolicyWithSystemGC -XX:+UseParallelGC -XX:MinHeapFreeRatio=0 -XX:MaxHeapFreeRatio=100 -verbose:gc TestDynShrinkHeap * @run main/othervm -XX:+UseAdaptiveSizePolicyWithSystemGC -XX:+UseParallelGC -XX:MinHeapFreeRatio=0 -XX:MaxHeapFreeRatio=100 -Xmx1g -verbose:gc TestDynShrinkHeap
*/ */
import com.oracle.java.testlibrary.DynamicVMOption; import com.oracle.java.testlibrary.DynamicVMOption;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
@ -41,7 +41,7 @@ public class TestDynShrinkHeap {
public static final String MAX_FREE_RATIO_FLAG_NAME = "MaxHeapFreeRatio"; public static final String MAX_FREE_RATIO_FLAG_NAME = "MaxHeapFreeRatio";
private static ArrayList<byte[]> list = new ArrayList<>(0); private static ArrayList<byte[]> list = new ArrayList<>(0);
private static final int M = 1024 * 1024; // to make heap more manageable by test code private static final int LEN = 512 * 1024 + 1;
public TestDynShrinkHeap() { public TestDynShrinkHeap() {
} }
@ -69,12 +69,12 @@ public class TestDynShrinkHeap {
} }
private void eat() { private void eat() {
for (int i = 0; i < M; i++) { for (int i = 0; i < LEN; i++) {
list.add(new byte[1024]); list.add(new byte[1024]);
} }
MemoryUsagePrinter.printMemoryUsage("allocated " + M + " arrays"); MemoryUsagePrinter.printMemoryUsage("allocated " + LEN + " arrays");
list.subList(0, M / 2).clear(); list.subList(0, LEN / 2).clear();
System.gc(); System.gc();
MemoryUsagePrinter.printMemoryUsage("array halved"); MemoryUsagePrinter.printMemoryUsage("array halved");
} }

View File

@ -1,12 +0,0 @@
public class T
{
public static boolean foo(boolean bar)
{
return bar;
}
public static void printIt()
{
System.out.println("Hello");
}
}

View File

@ -1,90 +0,0 @@
#include <assert.h>
#include <jni.h>
#include <alloca.h>
#include <pthread.h>
union env_union
{
void *void_env;
JNIEnv *jni_env;
};
union env_union tmp;
JNIEnv* env;
JavaVM* jvm;
JavaVMInitArgs vm_args;
JavaVMOption options[1];
jclass class_id;
jmethodID method_id;
jint result;
long product(unsigned long n, unsigned long m) {
if (m == 1) {
return n;
} else {
int *p = alloca(sizeof (int));
*p = n;
return product (n, m-1) + *p;
}
}
void *
floobydust (void *p)
{
(*jvm)->AttachCurrentThread(jvm, &tmp.void_env, NULL);
env = tmp.jni_env;
class_id = (*env)->FindClass (env, "T");
assert (class_id);
method_id = (*env)->GetStaticMethodID (env, class_id, "printIt", "()V");
assert (method_id);
(*env)->CallStaticVoidMethod (env, class_id, method_id, NULL);
(*jvm)->DetachCurrentThread(jvm);
printf("%ld\n", product(5000,5000));
(*jvm)->AttachCurrentThread(jvm, &tmp.void_env, NULL);
env = tmp.jni_env;
class_id = (*env)->FindClass (env, "T");
assert (class_id);
method_id = (*env)->GetStaticMethodID (env, class_id, "printIt", "()V");
assert (method_id);
(*env)->CallStaticVoidMethod (env, class_id, method_id, NULL);
(*jvm)->DetachCurrentThread(jvm);
printf("%ld\n", product(5000,5000));
return NULL;
}
int
main (int argc, const char** argv)
{
options[0].optionString = "-Xss320k";
vm_args.version = JNI_VERSION_1_2;
vm_args.ignoreUnrecognized = JNI_TRUE;
vm_args.options = options;
vm_args.nOptions = 1;
result = JNI_CreateJavaVM (&jvm, &tmp.void_env, &vm_args);
assert (result >= 0);
env = tmp.jni_env;
floobydust (NULL);
pthread_t thr;
pthread_create (&thr, NULL, floobydust, NULL);
pthread_join (thr, NULL);
return 0;
}

View File

@ -1,72 +0,0 @@
/*
* Copyright (c) 2013, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
#include <assert.h>
#include <jni.h>
#include <pthread.h>
JavaVM* jvm;
void *
floobydust (void *p) {
JNIEnv *env;
jclass class_id;
jmethodID method_id;
(*jvm)->AttachCurrentThread(jvm, (void**)&env, NULL);
class_id = (*env)->FindClass (env, "DoOverflow");
assert (class_id);
method_id = (*env)->GetStaticMethodID(env, class_id, "printIt", "()V");
assert (method_id);
(*env)->CallStaticVoidMethod(env, class_id, method_id, NULL);
(*jvm)->DetachCurrentThread(jvm);
}
int
main (int argc, const char** argv) {
JavaVMOption options[1];
options[0].optionString = (char*) "-Xss320k";
JavaVMInitArgs vm_args;
vm_args.version = JNI_VERSION_1_2;
vm_args.ignoreUnrecognized = JNI_TRUE;
vm_args.options = options;
vm_args.nOptions = 1;
JNIEnv* env;
jint result = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
assert(result >= 0);
pthread_t thr;
pthread_create(&thr, NULL, floobydust, NULL);
pthread_join(thr, NULL);
floobydust(NULL);
return 0;
}

View File

@ -1,77 +0,0 @@
#!/bin/sh
# Copyright (c) 2013 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
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
# @test testme.sh
# @bug 8009062
# @summary Poor performance of JNI AttachCurrentThread after fix for 7017193
# @compile DoOverflow.java
# @run shell testme.sh
set -x
if [ "${TESTSRC}" = "" ]
then
TESTSRC=${PWD}
echo "TESTSRC not set. Using "${TESTSRC}" as default"
fi
echo "TESTSRC=${TESTSRC}"
## Adding common setup Variables for running shell tests.
. ${TESTSRC}/../../test_env.sh
if [ "${VM_OS}" != "linux" ]
then
echo "Test only valid for Linux"
exit 0
fi
gcc_cmd=`which gcc`
if [ "x$gcc_cmd" = "x" ]; then
echo "WARNING: gcc not found. Cannot execute test." 2>&1
exit 0;
fi
CFLAGS="-m${VM_BITS}"
LD_LIBRARY_PATH=.:${TESTJAVA}/jre/lib/${VM_CPU}/${VM_TYPE}:/usr/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
cp ${TESTSRC}/invoke.c .
# Copy the result of our @compile action:
cp ${TESTCLASSES}/DoOverflow.class .
echo "Architecture: ${VM_CPU}"
echo "Compilation flag: ${CFLAGS}"
echo "VM type: ${VM_TYPE}"
echo "LD_LIBRARY_PATH: ${LD_LIBRARY_PATH}"
# Note pthread may not be found thus invoke creation will fail to be created.
# Check to ensure you have a /usr/lib/libpthread.so if you don't please look
# for /usr/lib/`uname -m`-linux-gnu version ensure to add that path to below compilation.
$gcc_cmd -DLINUX ${CFLAGS} -o invoke \
-I${TESTJAVA}/include -I${TESTJAVA}/include/linux \
-L${TESTJAVA}/jre/lib/${VM_CPU}/${VM_TYPE} \
-ljvm -lpthread invoke.c
./invoke
exit $?

View File

@ -30,12 +30,16 @@ public class DoOverflow {
overflow(); overflow();
} }
public static void printAlive() {
System.out.println("Java thread is alive.");
}
public static void printIt() { public static void printIt() {
System.out.println("Going to overflow stack"); System.out.println("Going to overflow stack");
try { try {
new DoOverflow().overflow(); new DoOverflow().overflow();
} catch(java.lang.StackOverflowError e) { } catch(java.lang.StackOverflowError e) {
System.out.println("Overflow OK " + count); System.out.println("Test PASSED. Got StackOverflowError at " + count + " iteration");
} }
} }
} }

View File

@ -0,0 +1,266 @@
/*
* Copyright (c) 2010, 2014, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
/* This code tests the fact that we actually remove stack guard page when calling
* JavaThread::exit() i.e. when detaching from current thread.
* We overflow the stack and check that we get access error because of a guard page.
* Than we detach from vm thread and overflow stack once again. This time we shouldn't
* get access error because stack guard page is removed
*
* Notice: due a complicated interaction of signal handlers, the test may crash.
* It's OK - don't file a bug.
*/
#include <assert.h>
#include <jni.h>
#include <alloca.h>
#include <signal.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <sys/ucontext.h>
#include <setjmp.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <errno.h>
#include <pthread.h>
JavaVM* _jvm;
static jmp_buf context;
static int _last_si_code = -1;
static int _failures = 0;
static int _rec_count = 0;
static int _kp_rec_count = 0;
pid_t gettid() {
return (pid_t) syscall(SYS_gettid);
}
static void handler(int sig, siginfo_t *si, void *unused) {
_last_si_code = si->si_code;
printf("Got SIGSEGV(%d) at address: 0x%lx\n",si->si_code, (long) si->si_addr);
longjmp(context, 1);
}
void set_signal_handler() {
static char altstack[SIGSTKSZ];
stack_t ss = {
.ss_size = SIGSTKSZ,
.ss_flags = 0,
.ss_sp = altstack
};
struct sigaction sa = {
.sa_sigaction = handler,
.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_RESETHAND
};
_last_si_code = -1;
sigaltstack(&ss, 0);
sigemptyset(&sa.sa_mask);
if (sigaction(SIGSEGV, &sa, NULL) == -1) {
fprintf(stderr, "Test ERROR. Can't set sigaction (%d)\n", errno);
exit(7);
}
}
void *run_java_overflow (void *p) {
JNIEnv *env;
jclass class_id;
jmethodID method_id;
int res;
res = (*_jvm)->AttachCurrentThread(_jvm, (void**)&env, NULL);
if (res != JNI_OK) {
fprintf(stderr, "Test ERROR. Can't attach to current thread\n");
exit(7);
}
class_id = (*env)->FindClass (env, "DoOverflow");
if (class_id == NULL) {
fprintf(stderr, "Test ERROR. Can't load class DoOverflow\n");
exit(7);
}
method_id = (*env)->GetStaticMethodID(env, class_id, "printIt", "()V");
if (method_id == NULL) {
fprintf(stderr, "Test ERROR. Can't find method DoOverflow.printIt\n");
exit(7);
}
(*env)->CallStaticVoidMethod(env, class_id, method_id, NULL);
res = (*_jvm)->DetachCurrentThread(_jvm);
if (res != JNI_OK) {
fprintf(stderr, "Test ERROR. Can't call detach from current thread\n");
exit(7);
}
}
void do_overflow(){
int *p = alloca(sizeof(int));
if (_kp_rec_count == 0 || _rec_count < _kp_rec_count) {
_rec_count ++;
do_overflow();
}
}
void *run_native_overflow(void *p) {
// Test that stack guard page is correctly set for initial and non initial thread
// and correctly removed for the initial thread
JNIEnv *env;
jclass class_id;
jmethodID method_id;
int res;
printf("run_native_overflow %ld\n", (long) gettid());
res = (*_jvm)->AttachCurrentThread(_jvm, (void **)&env, NULL);
if (res != JNI_OK) {
fprintf(stderr, "Test ERROR. Can't attach to current thread\n");
exit(7);
}
class_id = (*env)->FindClass (env, "DoOverflow");
if (class_id == NULL) {
fprintf(stderr, "Test ERROR. Can't load class DoOverflow\n");
exit(7);
}
method_id = (*env)->GetStaticMethodID (env, class_id, "printAlive", "()V");
if (method_id == NULL) {
fprintf(stderr, "Test ERROR. Can't find method DoOverflow.printAlive\n");
exit(7);
}
(*env)->CallStaticVoidMethod (env, class_id, method_id, NULL);
set_signal_handler();
if (! setjmp(context)) {
do_overflow();
}
if (_last_si_code == SEGV_ACCERR) {
printf("Test PASSED. Got access violation accessing guard page at %d\n", _rec_count);
}
res = (*_jvm)->DetachCurrentThread(_jvm);
if (res != JNI_OK) {
fprintf(stderr, "Test ERROR. Can't call detach from current thread\n");
exit(7);
}
if (getpid() != gettid()) {
// For non-initial thread we don't unmap the region but call os::uncommit_memory and keep PROT_NONE
// so if host has enough swap space we will get the same SEGV with code SEGV_ACCERR(2) trying
// to access it as if the guard page is present.
// We have no way to check this, so bail out, marking test as succeeded
printf("Test PASSED. Not initial thread\n");
return NULL;
}
// Limit depth of recursion for second run. It can't exceed one for first run.
_kp_rec_count = _rec_count;
_rec_count = 0;
set_signal_handler();
if (! setjmp(context)) {
do_overflow();
}
if (_last_si_code == SEGV_ACCERR) {
++ _failures;
fprintf(stderr,"Test FAILED. Stack guard page is still there at %d\n", _rec_count);
} else if (_last_si_code == -1) {
printf("Test PASSED. No stack guard page is present. Maximum recursion level reached at %d\n", _rec_count);
}
else{
printf("Test PASSED. No stack guard page is present. SIGSEGV(%d) at %d\n", _last_si_code, _rec_count);
}
return NULL;
}
void usage() {
fprintf(stderr, "Usage: invoke test_java_overflow\n");
fprintf(stderr, " invoke test_native_overflow\n");
exit(7);
}
int main (int argc, const char** argv) {
JavaVMInitArgs vm_args;
JavaVMOption options[2];
JNIEnv* env;
printf("Test started with pid: %ld\n", (long) getpid());
options[0].optionString = "-Xint";
options[1].optionString = "-Xss320k";
vm_args.version = JNI_VERSION_1_2;
vm_args.ignoreUnrecognized = JNI_TRUE;
vm_args.options = options;
vm_args.nOptions = 2;
if (JNI_CreateJavaVM (&_jvm, (void **)&env, &vm_args) < 0 ) {
fprintf(stderr, "Test ERROR. Can't create JavaVM\n");
exit(7);
}
pthread_t thr;
if (argc > 1 && strcmp(argv[1], "test_java_overflow") == 0) {
printf("\nTesting JAVA_OVERFLOW\n");
printf("Testing stack guard page behaviour for other thread\n");
pthread_create (&thr, NULL, run_java_overflow, NULL);
pthread_join (thr, NULL);
printf("Testing stack guard page behaviour for initial thread\n");
run_java_overflow(NULL);
// This test crash on error
exit(0);
}
if (argc > 1 && strcmp(argv[1], "test_native_overflow") == 0) {
printf("\nTesting NATIVE_OVERFLOW\n");
printf("Testing stack guard page behaviour for other thread\n");
pthread_create (&thr, NULL, run_native_overflow, NULL);
pthread_join (thr, NULL);
printf("Testing stack guard page behaviour for initial thread\n");
run_native_overflow(NULL);
exit((_failures > 0) ? 1 : 0);
}
fprintf(stderr, "Test ERROR. Unknown parameter %s\n", ((argc > 1) ? argv[1] : "none"));
usage();
}

View File

@ -1,13 +1,10 @@
#!/bin/sh #!/bin/sh
## #
## @test Test6929067.sh # @test testme.sh
## @bug 6929067 # @summary Stack guard pages should be installed correctly and removed when thread is detached
## @bug 8021296 # @run shell testme.sh
## @bug 8025519 #
## @summary Stack guard pages should be removed when thread is detached
## @run shell Test6929067.sh
##
if [ "${TESTSRC}" = "" ] if [ "${TESTSRC}" = "" ]
then then
@ -32,12 +29,9 @@ fi
CFLAGS=-m${VM_BITS} CFLAGS=-m${VM_BITS}
LD_LIBRARY_PATH=.:${TESTJAVA}/jre/lib/${VM_CPU}/${VM_TYPE}:/usr/lib:$LD_LIBRARY_PATH LD_LIBRARY_PATH=.:${TESTJAVA}/jre/lib/${VM_CPU}/${VM_TYPE}:${TESTJAVA}/lib/${VM_CPU}/${VM_TYPE}:/usr/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH export LD_LIBRARY_PATH
cp ${TESTSRC}/*.java ${THIS_DIR}
${COMPILEJAVA}/bin/javac *.java
echo "Architecture: ${VM_CPU}" echo "Architecture: ${VM_CPU}"
echo "Compilation flag: ${CFLAGS}" echo "Compilation flag: ${CFLAGS}"
echo "VM type: ${VM_TYPE}" echo "VM type: ${VM_TYPE}"
@ -47,10 +41,20 @@ echo "LD_LIBRARY_PATH: ${LD_LIBRARY_PATH}"
# Check to ensure you have a /usr/lib/libpthread.so if you don't please look # Check to ensure you have a /usr/lib/libpthread.so if you don't please look
# for /usr/lib/`uname -m`-linux-gnu version ensure to add that path to below compilation. # for /usr/lib/`uname -m`-linux-gnu version ensure to add that path to below compilation.
$gcc_cmd -DLINUX ${CFLAGS} -o invoke \ cp ${TESTSRC}/DoOverflow.java .
${COMPILEJAVA}/bin/javac DoOverflow.java
$gcc_cmd -DLINUX -g3 ${CFLAGS} -o invoke \
-I${TESTJAVA}/include -I${TESTJAVA}/include/linux \ -I${TESTJAVA}/include -I${TESTJAVA}/include/linux \
-L${TESTJAVA}/jre/lib/${VM_CPU}/${VM_TYPE} \ -L${TESTJAVA}/jre/lib/${VM_CPU}/${VM_TYPE} \
-L${TESTJAVA}/lib/${VM_CPU}/${VM_TYPE} \
${TESTSRC}/invoke.c -ljvm -lpthread ${TESTSRC}/invoke.c -ljvm -lpthread
./invoke if [ $? -ne 0 ] ; then
echo "Compile failed, Ignoring failed compilation and forcing the test to pass"
exit 0
fi
./invoke test_java_overflow
./invoke test_native_overflow
exit $? exit $?

View File

@ -0,0 +1,121 @@
/*
* Copyright (c) 2014, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test WBStackSize
* @summary verify that whitebox functions getThreadFullStackSize() and getThreadRemainingStackSize are working
* @library /testlibrary /testlibrary/whitebox
* @build WBStackSize
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xss512k WBStackSize
*/
/*
* The test may product a false failure if too big StackYellowPages/StackRedPages/ShackShadowPages
* VM options are specified. The proper test would retrieve the page size from VM and account for these options
* instead of check below:
* Math.abs(actualStackSize - configStackSize) > configStackSize * 0.1
*
* Please file a test bug, if this is a problem.
*/
import com.sun.management.HotSpotDiagnosticMXBean;
import sun.hotspot.WhiteBox;
public class WBStackSize {
static final long K = 1024;
static final long MIN_STACK_SIZE = 8 * K;
static final long MAX_STACK_SIZE_ALLOCATED_IN_MAIN = 200 * K; // current value is about 130k on 64-bit platforms
static final WhiteBox wb = WhiteBox.getWhiteBox();
static long stackSizeOnOverflow = -1;
static int eatAllStack() {
return eatAllStack() * 2;
}
static void testStackOverflow() {
stackSizeOnOverflow = wb.getThreadRemainingStackSize();
if (stackSizeOnOverflow > MIN_STACK_SIZE) {
try {
testStackOverflow();
} catch (StackOverflowError e) {
// We caught SOE too early. The error will be reported in main()
}
} else {
try {
eatAllStack();
throw new RuntimeException("Haven't caught StackOverflowError at all");
} catch (StackOverflowError e) {
// OK: we caught the anticipated error
}
}
}
public static void main(String[] args) {
HotSpotDiagnosticMXBean bean = sun.management.ManagementFactoryHelper.getDiagnosticMXBean();
long configStackSize = Long.valueOf(bean.getVMOption("ThreadStackSize").getValue()) * K;
System.out.println("ThreadStackSize VM option: " + configStackSize);
long actualStackSize = wb.getThreadStackSize();
System.out.println("Full stack size: " + actualStackSize);
if (Math.abs(actualStackSize - configStackSize) > configStackSize * 0.1) {
throw new RuntimeException("getThreadFullStackSize value [" + actualStackSize
+ "] should be within 90%..110% of the value returned by HotSpotDiagnosticMXBean");
}
long remainingStackSize = wb.getThreadRemainingStackSize();
System.out.println("Remaining stack size in main(): " + remainingStackSize);
// Up to 200k can be already allocated by VM
if (remainingStackSize > configStackSize
|| (configStackSize > MAX_STACK_SIZE_ALLOCATED_IN_MAIN
&& remainingStackSize < configStackSize - MAX_STACK_SIZE_ALLOCATED_IN_MAIN)) {
throw new RuntimeException("getThreadRemainingStackSize value [" + remainingStackSize
+ "] should be at least ThreadStackSize value [" + configStackSize + "] minus ["
+ MAX_STACK_SIZE_ALLOCATED_IN_MAIN + "]");
}
testStackOverflow();
if (stackSizeOnOverflow > MIN_STACK_SIZE) {
throw new RuntimeException("Caught StackOverflowError too early: when there were "
+ stackSizeOnOverflow + " bytes in stack");
} else if (stackSizeOnOverflow < 0) {
throw new RuntimeException("Internal test error: stackRemainingSize < 0");
} else {
System.out.println("Caught StackOverflowError as expected");
}
}
}

View File

@ -0,0 +1,64 @@
/*
* Copyright (c) 2014 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.io.PrintWriter;
import com.oracle.java.testlibrary.*;
/*
* Test to verify GetObjectSize does not overflow on a 600M element int[]
*
* @test
* @bug 8027230
* @library /testlibrary
* @build GetObjectSizeOverflowAgent
* @run main ClassFileInstaller GetObjectSizeOverflowAgent
* @run main GetObjectSizeOverflow
*/
public class GetObjectSizeOverflow {
public static void main(String[] args) throws Exception {
if (!Platform.is64bit()) {
System.out.println("Test needs a 4GB heap and can only be run as a 64bit process, skipping.");
return;
}
PrintWriter pw = new PrintWriter("MANIFEST.MF");
pw.println("Premain-Class: GetObjectSizeOverflowAgent");
pw.close();
ProcessBuilder pb = new ProcessBuilder();
pb.command(new String[] { JDKToolFinder.getJDKTool("jar"), "cmf", "MANIFEST.MF", "agent.jar", "GetObjectSizeOverflowAgent.class"});
pb.start().waitFor();
ProcessBuilder pt = ProcessTools.createJavaProcessBuilder(true, "-Xmx4000m", "-javaagent:agent.jar", "GetObjectSizeOverflowAgent");
OutputAnalyzer output = new OutputAnalyzer(pt.start());
if (output.getStdout().contains("Could not reserve enough space") || output.getStderr().contains("java.lang.OutOfMemoryError")) {
System.out.println("stdout: " + output.getStdout());
System.out.println("stderr: " + output.getStderr());
System.out.println("Test could not reserve or allocate enough space, skipping");
return;
}
output.stdoutShouldContain("GetObjectSizeOverflow passed");
}
}

View File

@ -0,0 +1,43 @@
/*
* Copyright (c) 2014, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.lang.instrument.*;
public class GetObjectSizeOverflowAgent {
static Instrumentation instrumentation;
public static void premain(String agentArgs, Instrumentation instrumentation) {
GetObjectSizeOverflowAgent.instrumentation = instrumentation;
}
public static void main(String[] args) throws Exception {
int[] a = new int[600_000_000];
long size = instrumentation.getObjectSize(a);
if (size < 2_400_000_000L) {
throw new RuntimeException("Invalid size of array, expected >= 2400000000, got " + size);
}
System.out.println("GetObjectSizeOverflow passed");
}
}

View File

@ -150,6 +150,8 @@ public class WhiteBox {
public native int stressVirtualSpaceResize(long reservedSpaceSize, long magnitude, long iterations); public native int stressVirtualSpaceResize(long reservedSpaceSize, long magnitude, long iterations);
public native void runMemoryUnitTests(); public native void runMemoryUnitTests();
public native void readFromNoaccessArea(); public native void readFromNoaccessArea();
public native long getThreadStackSize();
public native long getThreadRemainingStackSize();
// CPU features // CPU features
public native String getCPUFeatures(); public native String getCPUFeatures();

View File

@ -258,3 +258,4 @@ e88cecf5a21b760ff7d7761c2db6bb8c82bc9f0c jdk9-b12
5eaf717f6e36037a6d3744ffeee0e4c88e64a0d2 jdk9-b13 5eaf717f6e36037a6d3744ffeee0e4c88e64a0d2 jdk9-b13
32b3fc4bc7374a34d52b7f4e2391b4b4b0c084e8 jdk9-b14 32b3fc4bc7374a34d52b7f4e2391b4b4b0c084e8 jdk9-b14
6bad71866c7598587860e0981b0b0e51ec8c0476 jdk9-b15 6bad71866c7598587860e0981b0b0e51ec8c0476 jdk9-b15
a1461221b05d4620e4d7d1907e2a0282aaedf31c jdk9-b16

View File

@ -261,3 +261,4 @@ c9e8bb8c1144a966ca7b481142c6b5e55d14a29c jdk9-b09
3d42204854c9f703e3ccdc8891248e73057713ab jdk9-b13 3d42204854c9f703e3ccdc8891248e73057713ab jdk9-b13
02e58850b7062825308413d420f2b02c1f25a724 jdk9-b14 02e58850b7062825308413d420f2b02c1f25a724 jdk9-b14
e9780330017a6b464a385356d77e5136f9de8d09 jdk9-b15 e9780330017a6b464a385356d77e5136f9de8d09 jdk9-b15
1e1a3b2215b7551d88e89d1ca8c1e1ebe3d3c0ab jdk9-b16

View File

@ -258,3 +258,4 @@ ab06ba2894313a47e4969ca37792ff119c49e711 jdk9-b10
c7c8002d02721e02131d104549ebeb8b379fb8d2 jdk9-b13 c7c8002d02721e02131d104549ebeb8b379fb8d2 jdk9-b13
5c7a17a81afd0906b53ee31d95a3211c96ff6b25 jdk9-b14 5c7a17a81afd0906b53ee31d95a3211c96ff6b25 jdk9-b14
4537360f09fe23ab339ee588747b657feb12d0c8 jdk9-b15 4537360f09fe23ab339ee588747b657feb12d0c8 jdk9-b15
ab7d2c565b0de5bee1361d282d4029371327fc9e jdk9-b16

View File

@ -74,19 +74,16 @@ ifeq ($(OPENJDK_TARGET_OS), macosx)
JDK_TARGET_LIST := $(subst $(JDK_IMAGE_DIR)/,$(JDK_BUNDLE_DIR)/Home/,$(JDK_FILE_LIST)) JDK_TARGET_LIST := $(subst $(JDK_IMAGE_DIR)/,$(JDK_BUNDLE_DIR)/Home/,$(JDK_FILE_LIST))
JRE_TARGET_LIST := $(subst $(JRE_IMAGE_DIR)/,$(JRE_BUNDLE_DIR)/Home/,$(JRE_FILE_LIST)) JRE_TARGET_LIST := $(subst $(JRE_IMAGE_DIR)/,$(JRE_BUNDLE_DIR)/Home/,$(JRE_FILE_LIST))
# The old builds implementation of this did not preserve symlinks so
# make sure they are followed and the contents copied instead.
# To fix this, remove -L
# Copy empty directories (jre/lib/applet). # Copy empty directories (jre/lib/applet).
$(JDK_BUNDLE_DIR)/Home/%: $(JDK_IMAGE_DIR)/% $(JDK_BUNDLE_DIR)/Home/%: $(JDK_IMAGE_DIR)/%
$(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@)
$(MKDIR) -p $(@D) $(MKDIR) -p $(@D)
if [ -d "$<" ]; then $(MKDIR) -p $@; else $(CP) -f -R -L '$<' '$@'; fi if [ -d "$<" ]; then $(MKDIR) -p $@; else $(CP) -f -R -P '$<' '$@'; fi
$(JRE_BUNDLE_DIR)/Home/%: $(JRE_IMAGE_DIR)/% $(JRE_BUNDLE_DIR)/Home/%: $(JRE_IMAGE_DIR)/%
$(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(ECHO) Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@)
$(MKDIR) -p $(@D) $(MKDIR) -p $(@D)
if [ -d "$<" ]; then $(MKDIR) -p $@; else $(CP) -f -R -L '$<' '$@'; fi if [ -d "$<" ]; then $(MKDIR) -p $@; else $(CP) -f -R -P '$<' '$@'; fi
$(JDK_BUNDLE_DIR)/MacOS/libjli.dylib: $(JDK_BUNDLE_DIR)/MacOS/libjli.dylib:
$(ECHO) Creating link $(patsubst $(OUTPUT_ROOT)/%,%,$@) $(ECHO) Creating link $(patsubst $(OUTPUT_ROOT)/%,%,$@)

View File

@ -373,7 +373,7 @@ ifndef OPENJDK
JAVAC_FLAGS := -cp $(JDK_OUTPUTDIR)/classes, \ JAVAC_FLAGS := -cp $(JDK_OUTPUTDIR)/classes, \
SRC := $(JDK_OUTPUTDIR)/gensrc_ab/32bit, \ SRC := $(JDK_OUTPUTDIR)/gensrc_ab/32bit, \
BIN := $(JDK_OUTPUTDIR)/classes_ab/32bit, \ BIN := $(JDK_OUTPUTDIR)/classes_ab/32bit, \
HEADERS := $(JDK_OUTPUTDIR)/gensrc_headers)) HEADERS := $(JDK_OUTPUTDIR)/gensrc_headers_ab/32))
$(BUILD_ACCESSBRIDGE_32): $(BUILD_JDK) $(BUILD_ACCESSBRIDGE_32): $(BUILD_JDK)
@ -382,7 +382,7 @@ ifndef OPENJDK
JAVAC_FLAGS := -cp $(JDK_OUTPUTDIR)/classes, \ JAVAC_FLAGS := -cp $(JDK_OUTPUTDIR)/classes, \
SRC := $(JDK_OUTPUTDIR)/gensrc_ab/legacy, \ SRC := $(JDK_OUTPUTDIR)/gensrc_ab/legacy, \
BIN := $(JDK_OUTPUTDIR)/classes_ab/legacy, \ BIN := $(JDK_OUTPUTDIR)/classes_ab/legacy, \
HEADERS := $(JDK_OUTPUTDIR)/gensrc_headers)) HEADERS := $(JDK_OUTPUTDIR)/gensrc_headers_ab/legacy))
$(BUILD_ACCESSBRIDGE_LEGACY): $(BUILD_JDK) $(BUILD_ACCESSBRIDGE_LEGACY): $(BUILD_JDK)
@ -393,7 +393,7 @@ ifndef OPENJDK
JAVAC_FLAGS := -cp $(JDK_OUTPUTDIR)/classes, \ JAVAC_FLAGS := -cp $(JDK_OUTPUTDIR)/classes, \
SRC := $(JDK_OUTPUTDIR)/gensrc_ab/64bit, \ SRC := $(JDK_OUTPUTDIR)/gensrc_ab/64bit, \
BIN := $(JDK_OUTPUTDIR)/classes_ab/64bit, \ BIN := $(JDK_OUTPUTDIR)/classes_ab/64bit, \
HEADERS := $(JDK_OUTPUTDIR)/gensrc_headers)) HEADERS := $(JDK_OUTPUTDIR)/gensrc_headers_ab/64))
$(BUILD_ACCESSBRIDGE_64): $(BUILD_JDK) $(BUILD_ACCESSBRIDGE_64): $(BUILD_JDK)

View File

@ -428,7 +428,7 @@ ifeq ($(USE_EXTERNAL_LIBZ), true)
UNPACKEXE_CFLAGS := -DSYSTEM_ZLIB UNPACKEXE_CFLAGS := -DSYSTEM_ZLIB
UNPACKEXE_ZIPOBJS := -lz UNPACKEXE_ZIPOBJS := -lz
else else
UNPACKEXE_CFLAGS := -I$(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.5 UNPACKEXE_CFLAGS := -I$(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.8
UNPACKEXE_ZIPOBJS := $(JDK_OUTPUTDIR)/objs/libzip/zcrc32$(OBJ_SUFFIX) \ UNPACKEXE_ZIPOBJS := $(JDK_OUTPUTDIR)/objs/libzip/zcrc32$(OBJ_SUFFIX) \
$(JDK_OUTPUTDIR)/objs/libzip/deflate$(OBJ_SUFFIX) \ $(JDK_OUTPUTDIR)/objs/libzip/deflate$(OBJ_SUFFIX) \
$(JDK_OUTPUTDIR)/objs/libzip/trees$(OBJ_SUFFIX) \ $(JDK_OUTPUTDIR)/objs/libzip/trees$(OBJ_SUFFIX) \
@ -442,11 +442,6 @@ else
endif endif
ifeq ($(OPENJDK_TARGET_CPU_ARCH), sparc)
UNPACKEXE_CFLAGS += -xregs=no%appl
UNPACKEXE_LDFLAGS_solaris += -xmemalign=4s
endif
UNPACKEXE_LANG := C UNPACKEXE_LANG := C
ifeq ($(OPENJDK_TARGET_OS), solaris) ifeq ($(OPENJDK_TARGET_OS), solaris)
UNPACKEXE_LANG := C++ UNPACKEXE_LANG := C++

View File

@ -552,40 +552,53 @@ $(eval $(call SetupArchive,BUILD_CT_SYM, $(IMAGES_OUTPUTDIR)/symbols/_the.symbol
########################################################################################## ##########################################################################################
SRC_ZIP_INCLUDES = \ ifdef OPENJDK
com/sun/corba \ SRC_ZIP_INCLUDES = \
com/sun/image/codec/jpeg \ com \
com/sun/imageio \ java \
com/sun/java_cup \ javax \
com/sun/javadoc \ jdk \
com/sun/java/swing \ org \
com/sun/jmx \ sun \
com/sun/naming \ #
com/sun/org/apache \ SRC_ZIP_EXCLUDES =
com/sun/security/auth \ else
com/sun/security/jgss \ SRC_ZIP_INCLUDES = \
com/sun/source \ com/sun/corba \
java \ com/sun/image/codec/jpeg \
javax/accessibility \ com/sun/imageio \
javax/annotation \ com/sun/java_cup \
javax/imageio \ com/sun/javadoc \
javax/lang \ com/sun/java/swing \
javax/management \ com/sun/jmx \
javax/naming \ com/sun/naming \
javax/print \ com/sun/org/apache \
javax/rmi \ com/sun/security/auth \
javax/script \ com/sun/security/jgss \
javax/security \ com/sun/source \
javax/sound \ java \
javax/sql \ javax/accessibility \
javax/swing \ javax/annotation \
javax/tools \ javax/imageio \
javax/xml \ javax/lang \
org/ietf \ javax/management \
org/omg \ javax/naming \
org/w3c/dom \ javax/print \
org/xml/sax \ javax/rmi \
# javax/script \
javax/security \
javax/sound \
javax/sql \
javax/swing \
javax/tools \
javax/xml \
org/ietf \
org/omg \
org/w3c/dom \
org/xml/sax \
#
SRC_ZIP_EXCLUDES = javax/swing/beaninfo
endif
SRC_ZIP_SRCS = $(JDK_TOPDIR)/src/share/classes $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/classes SRC_ZIP_SRCS = $(JDK_TOPDIR)/src/share/classes $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/classes
SRC_ZIP_SRCS += $(JDK_OUTPUTDIR)/gensrc SRC_ZIP_SRCS += $(JDK_OUTPUTDIR)/gensrc
@ -616,7 +629,7 @@ $(eval $(call MakeDir, $(IMAGES_OUTPUTDIR)/src))
$(eval $(call SetupZipArchive,BUILD_SRC_ZIP, \ $(eval $(call SetupZipArchive,BUILD_SRC_ZIP, \
SRC := $(SRC_ZIP_SRCS) $(IMAGES_OUTPUTDIR)/src, \ SRC := $(SRC_ZIP_SRCS) $(IMAGES_OUTPUTDIR)/src, \
INCLUDES := $(SRC_ZIP_INCLUDES) launcher, \ INCLUDES := $(SRC_ZIP_INCLUDES) launcher, \
EXCLUDES := javax/swing/beaninfo, \ EXCLUDES := $(SRC_ZIP_EXCLUDES), \
SUFFIXES := .java .c .h, \ SUFFIXES := .java .c .h, \
ZIP := $(IMAGES_OUTPUTDIR)/src.zip, \ ZIP := $(IMAGES_OUTPUTDIR)/src.zip, \
EXTRA_DEPS := $(LAUNCHER_ZIP_SRC))) EXTRA_DEPS := $(LAUNCHER_ZIP_SRC)))

View File

@ -27,7 +27,7 @@ DISABLE_WARNINGS := -Xlint:all,-deprecation,-unchecked,-rawtypes,-cast,-serial,-
# To build with all warnings enabled, do the following: # To build with all warnings enabled, do the following:
# make JAVAC_WARNINGS="-Xlint:all -Xmaxwarns 10000" # make JAVAC_WARNINGS="-Xlint:all -Xmaxwarns 10000"
JAVAC_WARNINGS := -Xlint:-unchecked,-deprecation,-overrides,auxiliaryclass,cast,classfile,dep-ann,divzero,empty,overloads,serial,static,try,varargs -Werror JAVAC_WARNINGS := -Xlint:-unchecked,-deprecation,-overrides,auxiliaryclass,cast,classfile,dep-ann,divzero,empty,fallthrough,overloads,serial,static,try,varargs -Werror
# Any java code executed during a JDK build to build other parts of the JDK must be # Any java code executed during a JDK build to build other parts of the JDK must be
# executed by the bootstrap JDK (probably with -Xbootclasspath/p: ) and for this # executed by the bootstrap JDK (probably with -Xbootclasspath/p: ) and for this

View File

@ -1251,7 +1251,7 @@ ifndef BUILD_HEADLESS_ONLY
LIBSPLASHSCREEN_LDFLAGS_SUFFIX := LIBSPLASHSCREEN_LDFLAGS_SUFFIX :=
ifneq ($(USE_EXTERNAL_LIBZ), true) ifneq ($(USE_EXTERNAL_LIBZ), true)
LIBSPLASHSCREEN_DIRS += $(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.5 LIBSPLASHSCREEN_DIRS += $(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.8
LIBSPLASHSCREEN_CFLAGS += $(ZLIB_CPPFLAGS) LIBSPLASHSCREEN_CFLAGS += $(ZLIB_CPPFLAGS)
endif endif

View File

@ -231,9 +231,9 @@ $(BUILD_LIBJAVA): $(BUILD_LIBFDLIBM)
BUILD_LIBZIP_EXCLUDES := BUILD_LIBZIP_EXCLUDES :=
ifeq ($(USE_EXTERNAL_LIBZ), true) ifeq ($(USE_EXTERNAL_LIBZ), true)
LIBZ := -lz LIBZ := -lz
LIBZIP_EXCLUDES += zlib-1.2.5 LIBZIP_EXCLUDES += zlib-1.2.8
else else
ZLIB_CPPFLAGS := -I$(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.5 ZLIB_CPPFLAGS := -I$(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.8
endif endif
BUILD_LIBZIP_REORDER := BUILD_LIBZIP_REORDER :=
@ -410,7 +410,7 @@ ifeq ($(OPENJDK_TARGET_OS), macosx)
endif endif
ifneq ($(USE_EXTERNAL_LIBZ), true) ifneq ($(USE_EXTERNAL_LIBZ), true)
BUILD_LIBJLI_SRC_DIRS += $(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.5 BUILD_LIBJLI_SRC_DIRS += $(JDK_TOPDIR)/src/share/native/java/util/zip/zlib-1.2.8
LIBJLI_CFLAGS += $(ZLIB_CPPFLAGS) LIBJLI_CFLAGS += $(ZLIB_CPPFLAGS)
BUILD_LIBJLI_FILES += \ BUILD_LIBJLI_FILES += \
inflate.c \ inflate.c \

View File

@ -143,7 +143,8 @@ ifndef OPENJDK
define SetupAccessBridge define SetupAccessBridge
# Parameter 1 Suffix # Parameter 1 Suffix
# Parameter 2 Machine # Parameter 2 Machine
# Parameter 3 ACCESSBRIDGE_ARCH_ suffix # Parameter 3 ACCESSBRIDGE_ARCH_ suffix and name of directory where gensrc headers
# are found.
$(call SetupNativeCompilation,BUILD_JAWTACCESSBRIDGE$1, \ $(call SetupNativeCompilation,BUILD_JAWTACCESSBRIDGE$1, \
LIBRARY = JAWTAccessBridge$1, \ LIBRARY = JAWTAccessBridge$1, \
@ -153,7 +154,8 @@ ifndef OPENJDK
LANG := C++, \ LANG := C++, \
OPTIMIZATION := LOW, \ OPTIMIZATION := LOW, \
CFLAGS := $(CFLAGS_JDKLIB) \ CFLAGS := $(CFLAGS_JDKLIB) \
-DACCESSBRIDGE_ARCH_$3, \ -DACCESSBRIDGE_ARCH_$3 \
-I$(JDK_OUTPUTDIR)/gensrc_headers_ab/$3, \
LDFLAGS := $(LDFLAGS_JDKLIB) kernel32.lib user32.lib gdi32.lib \ LDFLAGS := $(LDFLAGS_JDKLIB) kernel32.lib user32.lib gdi32.lib \
winspool.lib jawt.lib comdlg32.lib advapi32.lib shell32.lib \ winspool.lib jawt.lib comdlg32.lib advapi32.lib shell32.lib \
ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib \ ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib \
@ -179,7 +181,8 @@ ifndef OPENJDK
LANG := C++, \ LANG := C++, \
OPTIMIZATION := LOW, \ OPTIMIZATION := LOW, \
CFLAGS := $(CFLAGS_JDKLIB) \ CFLAGS := $(CFLAGS_JDKLIB) \
-DACCESSBRIDGE_ARCH_$3, \ -DACCESSBRIDGE_ARCH_$3 \
-I$(JDK_OUTPUTDIR)/gensrc_headers_ab/$3, \
LDFLAGS := $(LDFLAGS_JDKLIB) kernel32.lib user32.lib gdi32.lib \ LDFLAGS := $(LDFLAGS_JDKLIB) kernel32.lib user32.lib gdi32.lib \
winspool.lib comdlg32.lib advapi32.lib shell32.lib \ winspool.lib comdlg32.lib advapi32.lib shell32.lib \
ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib \ ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib \
@ -204,7 +207,8 @@ ifndef OPENJDK
LANG := C++, \ LANG := C++, \
OPTIMIZATION := LOW, \ OPTIMIZATION := LOW, \
CFLAGS := $(filter-out -MD, $(CFLAGS_JDKLIB)) -MT \ CFLAGS := $(filter-out -MD, $(CFLAGS_JDKLIB)) -MT \
-DACCESSBRIDGE_ARCH_$3, \ -DACCESSBRIDGE_ARCH_$3 \
-I$(JDK_OUTPUTDIR)/gensrc_headers_ab/$3, \
LDFLAGS := $(LDFLAGS_JDKLIB) kernel32.lib user32.lib gdi32.lib \ LDFLAGS := $(LDFLAGS_JDKLIB) kernel32.lib user32.lib gdi32.lib \
winspool.lib comdlg32.lib advapi32.lib shell32.lib \ winspool.lib comdlg32.lib advapi32.lib shell32.lib \
ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib \ ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib \
@ -225,7 +229,7 @@ ifndef OPENJDK
ifeq ($(OPENJDK_TARGET_CPU_BITS), 32) ifeq ($(OPENJDK_TARGET_CPU_BITS), 32)
$(eval $(call SetupAccessBridge,-32,I386,32)) $(eval $(call SetupAccessBridge,-32,I386,32))
$(eval $(call SetupAccessBridge,,I386,LEGACY)) $(eval $(call SetupAccessBridge,,I386,legacy))
else else
$(eval $(call SetupAccessBridge,-64,X64,64)) $(eval $(call SetupAccessBridge,-64,X64,64))
endif endif

View File

@ -88,7 +88,7 @@ PROFILE_2_RTJAR_INCLUDE_PACKAGES := \
java/sql \ java/sql \
javax/rmi/ssl \ javax/rmi/ssl \
javax/sql \ javax/sql \
javax/transaction \ javax/transaction/xa \
javax/xml \ javax/xml \
org/w3c \ org/w3c \
org/xml/sax \ org/xml/sax \
@ -223,7 +223,8 @@ FULL_JRE_RTJAR_INCLUDE_TYPES := \
javax/management/remote/rmi/_RMIConnection_Stub.class \ javax/management/remote/rmi/_RMIConnection_Stub.class \
javax/management/remote/rmi/_RMIServerImpl_Tie.class \ javax/management/remote/rmi/_RMIServerImpl_Tie.class \
javax/management/remote/rmi/_RMIServer_Stub.class \ javax/management/remote/rmi/_RMIServer_Stub.class \
javax/rmi/*.class javax/rmi/*.class \
javax/transaction/*.class
FULL_JRE_RTJAR_EXCLUDE_TYPES := FULL_JRE_RTJAR_EXCLUDE_TYPES :=

View File

@ -512,7 +512,7 @@ class ConstantPool {
} }
static String qualifiedStringValue(String s1, String s234) { static String qualifiedStringValue(String s1, String s234) {
// Qualification by dot must decompose uniquely. Second string might already be qualified. // Qualification by dot must decompose uniquely. Second string might already be qualified.
assert(s1.indexOf(".") < 0); assert(s1.indexOf('.') < 0);
return s1+"."+s234; return s1+"."+s234;
} }

View File

@ -102,7 +102,7 @@ public final class CorbanameUrl {
} }
location = url.substring(addrStart, addrEnd); location = url.substring(addrStart, addrEnd);
int keyStart = location.indexOf("/"); int keyStart = location.indexOf('/');
if (keyStart >= 0) { if (keyStart >= 0) {
// Has key string // Has key string
if (keyStart == (location.length() -1)) { if (keyStart == (location.length() -1)) {

View File

@ -336,7 +336,7 @@ public class RegistryContext implements Context, Referenceable {
String url = "rmi://"; String url = "rmi://";
// Enclose IPv6 literal address in '[' and ']' // Enclose IPv6 literal address in '[' and ']'
url = (host.indexOf(":") > -1) ? url + "[" + host + "]" : url = (host.indexOf(':') > -1) ? url + "[" + host + "]" :
url + host; url + host;
if (port > 0) { if (port > 0) {
url += ":" + Integer.toString(port); url += ":" + Integer.toString(port);

View File

@ -149,7 +149,7 @@ abstract public class GenericURLContext implements Context {
* foo:rest/of/name foo: * foo:rest/of/name foo:
*/ */
protected String getURLPrefix(String url) throws NamingException { protected String getURLPrefix(String url) throws NamingException {
int start = url.indexOf(":"); int start = url.indexOf(':');
if (start < 0) { if (start < 0) {
throw new OperationNotSupportedException("Invalid URL: " + url); throw new OperationNotSupportedException("Invalid URL: " + url);
@ -160,7 +160,7 @@ abstract public class GenericURLContext implements Context {
start += 2; // skip double slash start += 2; // skip double slash
// find last slash // find last slash
int posn = url.indexOf("/", start); int posn = url.indexOf('/', start);
if (posn >= 0) { if (posn >= 0) {
start = posn; start = posn;
} else { } else {

View File

@ -303,7 +303,7 @@ public final class ExecOptionPermission extends Permission
offset = pname.length() - 1; offset = pname.length() - 1;
while ((last = pname.lastIndexOf(".", offset)) != -1) { while ((last = pname.lastIndexOf('.', offset)) != -1) {
pname = pname.substring(0, last+1) + "*"; pname = pname.substring(0, last+1) + "*";
x = permissions.get(pname); x = permissions.get(pname);
@ -318,7 +318,7 @@ public final class ExecOptionPermission extends Permission
pname = p.getName(); pname = p.getName();
offset = pname.length() - 1; offset = pname.length() - 1;
while ((last = pname.lastIndexOf("=", offset)) != -1) { while ((last = pname.lastIndexOf('=', offset)) != -1) {
pname = pname.substring(0, last+1) + "*"; pname = pname.substring(0, last+1) + "*";
x = permissions.get(pname); x = permissions.get(pname);

View File

@ -6831,7 +6831,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
// table name else isolate table name. // table name else isolate table name.
indexFrom = command.toLowerCase().indexOf("from"); indexFrom = command.toLowerCase().indexOf("from");
indexComma = command.indexOf(",", indexFrom); indexComma = command.indexOf(',', indexFrom);
if(indexComma == -1) { if(indexComma == -1) {
// implies only one table // implies only one table

View File

@ -910,7 +910,7 @@ public class JoinRowSetImpl extends WebRowSetImpl implements JoinRowSet {
// now remove the last "," // now remove the last ","
strWhereClause = strWhereClause.substring strWhereClause = strWhereClause.substring
(0, strWhereClause.lastIndexOf(",")); (0, strWhereClause.lastIndexOf(','));
// Add from clause // Add from clause
strWhereClause = strWhereClause.concat(" from "); strWhereClause = strWhereClause.concat(" from ");
@ -920,7 +920,7 @@ public class JoinRowSetImpl extends WebRowSetImpl implements JoinRowSet {
//Remove the last "," //Remove the last ","
strWhereClause = strWhereClause.substring strWhereClause = strWhereClause.substring
(0, strWhereClause.lastIndexOf(",")); (0, strWhereClause.lastIndexOf(','));
// Add the where clause // Add the where clause
strWhereClause = strWhereClause.concat(" where "); strWhereClause = strWhereClause.concat(" where ");

View File

@ -240,7 +240,7 @@ public class WebRowSetXmlWriter implements XmlWriter, Serializable {
// Remove the string after "@xxxx" // Remove the string after "@xxxx"
// before writing it to the xml file. // before writing it to the xml file.
String strProviderInstance = (caller.getSyncProvider()).toString(); String strProviderInstance = (caller.getSyncProvider()).toString();
String strProvider = strProviderInstance.substring(0, (caller.getSyncProvider()).toString().indexOf("@")); String strProvider = strProviderInstance.substring(0, (caller.getSyncProvider()).toString().indexOf('@'));
propString("sync-provider-name", strProvider); propString("sync-provider-name", strProvider);
propString("sync-provider-vendor", "Oracle Corporation"); propString("sync-provider-vendor", "Oracle Corporation");

View File

@ -1147,7 +1147,7 @@ public class XmlReaderContentHandler extends DefaultHandler {
if (nullValue) { if (nullValue) {
rs.setSyncProvider(null); rs.setSyncProvider(null);
} else { } else {
String str = s.substring(0,s.indexOf("@")+1); String str = s.substring(0,s.indexOf('@')+1);
rs.setSyncProvider(str); rs.setSyncProvider(str);
} }
break; break;

View File

@ -39,7 +39,7 @@ import org.xml.sax.InputSource;
public class XmlResolver implements EntityResolver { public class XmlResolver implements EntityResolver {
public InputSource resolveEntity(String publicId, String systemId) { public InputSource resolveEntity(String publicId, String systemId) {
String schemaName = systemId.substring(systemId.lastIndexOf("/")); String schemaName = systemId.substring(systemId.lastIndexOf('/'));
if(systemId.startsWith("http://java.sun.com/xml/ns/jdbc")) { if(systemId.startsWith("http://java.sun.com/xml/ns/jdbc")) {
return new InputSource(this.getClass().getResourceAsStream(schemaName)); return new InputSource(this.getClass().getResourceAsStream(schemaName));

View File

@ -694,7 +694,7 @@ public class JndiLoginModule implements LoginModule {
throw new LoginException("Error: no CallbackHandler available " + throw new LoginException("Error: no CallbackHandler available " +
"to garner authentication information from the user"); "to garner authentication information from the user");
String protocol = userProvider.substring(0, userProvider.indexOf(":")); String protocol = userProvider.substring(0, userProvider.indexOf(':'));
Callback[] callbacks = new Callback[2]; Callback[] callbacks = new Callback[2];
callbacks[0] = new NameCallback(protocol + " " callbacks[0] = new NameCallback(protocol + " "

View File

@ -400,7 +400,7 @@ public class LdapLoginModule implements LoginModule {
// Add any JNDI properties to the environment // Add any JNDI properties to the environment
for (String key : options.keySet()) { for (String key : options.keySet()) {
if (key.indexOf(".") > -1) { if (key.indexOf('.') > -1) {
ldapEnvironment.put(key, options.get(key)); ldapEnvironment.put(key, options.get(key));
} }
} }

View File

@ -857,7 +857,7 @@ public class CommandInterpreter {
bpSpec = runtime.createClassLineBreakpoint(classId, lineNumber); bpSpec = runtime.createClassLineBreakpoint(classId, lineNumber);
} else { } else {
// Try stripping method from class.method token. // Try stripping method from class.method token.
int idot = token.lastIndexOf("."); int idot = token.lastIndexOf('.');
if ( (idot <= 0) || /* No dot or dot in first char */ if ( (idot <= 0) || /* No dot or dot in first char */
(idot >= token.length() - 1) ) { /* dot in last char */ (idot >= token.length() - 1) ) { /* dot in last char */
return null; return null;

View File

@ -1079,7 +1079,7 @@ class Commands {
} }
} else { } else {
// Try stripping method from class.method token. // Try stripping method from class.method token.
int idot = token.lastIndexOf("."); int idot = token.lastIndexOf('.');
if ( (idot <= 0) || /* No dot or dot in first char */ if ( (idot <= 0) || /* No dot or dot in first char */
(idot >= token.length() - 1) ) { /* dot in last char */ (idot >= token.length() - 1) ) { /* dot in last char */
printBreakpointCommandUsage(atForm, inForm); printBreakpointCommandUsage(atForm, inForm);

View File

@ -67,7 +67,7 @@ class AllClassesQuery extends QueryHandler {
continue; continue;
} }
String name = clazz.getName(); String name = clazz.getName();
int pos = name.lastIndexOf("."); int pos = name.lastIndexOf('.');
String pkg; String pkg;
if (name.startsWith("[")) { // Only in ancient heap dumps if (name.startsWith("[")) { // Only in ancient heap dumps
pkg = "<Arrays>"; pkg = "<Arrays>";

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -86,6 +86,7 @@ public class Applet extends Panel {
/** /**
* Read an applet from an object input stream. * Read an applet from an object input stream.
* @param s an object input stream.
* @exception HeadlessException if * @exception HeadlessException if
* <code>GraphicsEnvironment.isHeadless()</code> returns * <code>GraphicsEnvironment.isHeadless()</code> returns
* <code>true</code> * <code>true</code>

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -152,7 +152,7 @@ public interface AppletContext {
* For security reasons, mapping of streams and keys exists for each * For security reasons, mapping of streams and keys exists for each
* codebase. In other words, applet from one codebase cannot access * codebase. In other words, applet from one codebase cannot access
* the streams created by an applet from a different codebase * the streams created by an applet from a different codebase
* <p> *
* @param key key with which the specified value is to be associated. * @param key key with which the specified value is to be associated.
* @param stream stream to be associated with the specified key. If this * @param stream stream to be associated with the specified key. If this
* parameter is <code>null</code>, the specified key is removed * parameter is <code>null</code>, the specified key is removed
@ -172,7 +172,7 @@ public interface AppletContext {
* For security reasons, mapping of streams and keys exists for each * For security reasons, mapping of streams and keys exists for each
* codebase. In other words, applet from one codebase cannot access * codebase. In other words, applet from one codebase cannot access
* the streams created by an applet from a different codebase * the streams created by an applet from a different codebase
* <p> *
* @return the stream to which this applet context maps the key * @return the stream to which this applet context maps the key
* @param key key whose associated stream is to be returned. * @param key key whose associated stream is to be returned.
* @since 1.4 * @since 1.4
@ -185,7 +185,7 @@ public interface AppletContext {
* For security reasons, mapping of streams and keys exists for each * For security reasons, mapping of streams and keys exists for each
* codebase. In other words, applet from one codebase cannot access * codebase. In other words, applet from one codebase cannot access
* the streams created by an applet from a different codebase * the streams created by an applet from a different codebase
* <p> *
* @return an Iterator of all the names of the streams in this applet * @return an Iterator of all the names of the streams in this applet
* context. * context.
* @since 1.4 * @since 1.4

View File

@ -1926,9 +1926,9 @@ public abstract class Path2D implements Shape, Cloneable {
* maintains, but it may contain no more precision either. * maintains, but it may contain no more precision either.
* If the tradeoff of precision vs. storage size in the result is * If the tradeoff of precision vs. storage size in the result is
* important then the convenience constructors in the * important then the convenience constructors in the
* {@link Path2D.Float#Path2D.Float(Shape, AffineTransform) Path2D.Float} * {@link Path2D.Float#Float(Shape, AffineTransform) Path2D.Float}
* and * and
* {@link Path2D.Double#Path2D.Double(Shape, AffineTransform) Path2D.Double} * {@link Path2D.Double#Double(Shape, AffineTransform) Path2D.Double}
* subclasses should be used to make the choice explicit. * subclasses should be used to make the choice explicit.
* *
* @param at the {@code AffineTransform} used to transform a * @param at the {@code AffineTransform} used to transform a

View File

@ -1296,7 +1296,7 @@ public final class Class<T> implements java.io.Serializable,
String simpleName = getSimpleBinaryName(); String simpleName = getSimpleBinaryName();
if (simpleName == null) { // top level class if (simpleName == null) { // top level class
simpleName = getName(); simpleName = getName();
return simpleName.substring(simpleName.lastIndexOf(".")+1); // strip the package name return simpleName.substring(simpleName.lastIndexOf('.')+1); // strip the package name
} }
// According to JLS3 "Binary Compatibility" (13.1) the binary // According to JLS3 "Binary Compatibility" (13.1) the binary
// name of non-package classes (not top level) is the binary // name of non-package classes (not top level) is the binary

View File

@ -2133,7 +2133,7 @@ public abstract class ClassLoader {
return result.booleanValue(); return result.booleanValue();
// Check for most specific package entry // Check for most specific package entry
int dotIndex = className.lastIndexOf("."); int dotIndex = className.lastIndexOf('.');
if (dotIndex < 0) { // default package if (dotIndex < 0) { // default package
result = packageAssertionStatus.get(null); result = packageAssertionStatus.get(null);
if (result != null) if (result != null)
@ -2144,7 +2144,7 @@ public abstract class ClassLoader {
result = packageAssertionStatus.get(className); result = packageAssertionStatus.get(className);
if (result != null) if (result != null)
return result.booleanValue(); return result.booleanValue();
dotIndex = className.lastIndexOf(".", dotIndex-1); dotIndex = className.lastIndexOf('.', dotIndex-1);
} }
// Return the classloader default // Return the classloader default

View File

@ -85,7 +85,7 @@ class InvokerBytecodeGenerator {
private InvokerBytecodeGenerator(LambdaForm lambdaForm, int localsMapSize, private InvokerBytecodeGenerator(LambdaForm lambdaForm, int localsMapSize,
String className, String invokerName, MethodType invokerType) { String className, String invokerName, MethodType invokerType) {
if (invokerName.contains(".")) { if (invokerName.contains(".")) {
int p = invokerName.indexOf("."); int p = invokerName.indexOf('.');
className = invokerName.substring(0, p); className = invokerName.substring(0, p);
invokerName = invokerName.substring(p+1); invokerName = invokerName.substring(p+1);
} }

View File

@ -607,7 +607,7 @@ class LambdaForm {
assert(m.getName().equals("interpret" + sig.substring(sig.indexOf('_')))); assert(m.getName().equals("interpret" + sig.substring(sig.indexOf('_'))));
LambdaForm form = new LambdaForm(sig); LambdaForm form = new LambdaForm(sig);
form.vmentry = m; form.vmentry = m;
mt.form().setCachedLambdaForm(MethodTypeForm.LF_COUNTER, form); form = mt.form().setCachedLambdaForm(MethodTypeForm.LF_COUNTER, form);
// FIXME: get rid of PREPARED_FORMS; use MethodTypeForm cache only // FIXME: get rid of PREPARED_FORMS; use MethodTypeForm cache only
forms.put(sig, form); forms.put(sig, form);
} }

View File

@ -313,7 +313,8 @@ public class LambdaMetafactory {
* reference expression</em> features of the Java Programming Language. * reference expression</em> features of the Java Programming Language.
* *
* <p>This is the general, more flexible metafactory; a streamlined version * <p>This is the general, more flexible metafactory; a streamlined version
* is provided by {@link #altMetafactory(MethodHandles.Lookup, String, MethodType, Object...)}. * is provided by {@link #metafactory(java.lang.invoke.MethodHandles.Lookup,
* String, MethodType, MethodType, MethodHandle, MethodType)}.
* A general description of the behavior of this method is provided * A general description of the behavior of this method is provided
* {@link LambdaMetafactory above}. * {@link LambdaMetafactory above}.
* *

View File

@ -692,8 +692,7 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP;
lform = new LambdaForm("guardWithCatch", lambdaType.parameterCount(), names); lform = new LambdaForm("guardWithCatch", lambdaType.parameterCount(), names);
basicType.form().setCachedLambdaForm(MethodTypeForm.LF_GWC, lform); return basicType.form().setCachedLambdaForm(MethodTypeForm.LF_GWC, lform);
return lform;
} }
static static

View File

@ -91,8 +91,10 @@ final class MethodTypeForm {
return lambdaForms[which]; return lambdaForms[which];
} }
public LambdaForm setCachedLambdaForm(int which, LambdaForm form) { synchronized public LambdaForm setCachedLambdaForm(int which, LambdaForm form) {
// Should we perform some sort of CAS, to avoid racy duplication? // Simulate a CAS, to avoid racy duplication of results.
LambdaForm prev = lambdaForms[which];
if (prev != null) return prev;
return lambdaForms[which] = form; return lambdaForms[which] = form;
} }

View File

@ -633,7 +633,7 @@ public abstract class Executable extends AccessibleObject
getConstantPool(getDeclaringClass()), getConstantPool(getDeclaringClass()),
this, this,
getDeclaringClass(), getDeclaringClass(),
getParameterTypes(), getGenericParameterTypes(),
TypeAnnotation.TypeAnnotationTarget.METHOD_FORMAL_PARAMETER); TypeAnnotation.TypeAnnotationTarget.METHOD_FORMAL_PARAMETER);
} }

View File

@ -294,7 +294,7 @@ public class CookieManager extends CookieHandler
// the path is the directory of the page/doc // the path is the directory of the page/doc
String path = uri.getPath(); String path = uri.getPath();
if (!path.endsWith("/")) { if (!path.endsWith("/")) {
int i = path.lastIndexOf("/"); int i = path.lastIndexOf('/');
if (i > 0) { if (i > 0) {
path = path.substring(0, i + 1); path = path.substring(0, i + 1);
} else { } else {
@ -364,7 +364,7 @@ public class CookieManager extends CookieHandler
static private boolean isInPortList(String lst, int port) { static private boolean isInPortList(String lst, int port) {
int i = lst.indexOf(","); int i = lst.indexOf(',');
int val = -1; int val = -1;
while (i > 0) { while (i > 0) {
try { try {
@ -375,7 +375,7 @@ public class CookieManager extends CookieHandler
} catch (NumberFormatException numberFormatException) { } catch (NumberFormatException numberFormatException) {
} }
lst = lst.substring(i+1); lst = lst.substring(i+1);
i = lst.indexOf(","); i = lst.indexOf(',');
} }
if (!lst.isEmpty()) { if (!lst.isEmpty()) {
try { try {

View File

@ -1138,7 +1138,7 @@ class InetAddress implements java.io.Serializable {
// This is supposed to be an IPv6 literal // This is supposed to be an IPv6 literal
// Check if a numeric or string zone id is present // Check if a numeric or string zone id is present
int pos; int pos;
if ((pos=host.indexOf ("%")) != -1) { if ((pos=host.indexOf ('%')) != -1) {
numericZone = checkNumericZone (host); numericZone = checkNumericZone (host);
if (numericZone == -1) { /* remainder of string must be an ifname */ if (numericZone == -1) { /* remainder of string must be an ifname */
ifname = host.substring (pos+1); ifname = host.substring (pos+1);

View File

@ -1017,7 +1017,7 @@ class Socket implements java.io.Closeable {
if (isClosed()) if (isClosed())
throw new SocketException("Socket is closed"); throw new SocketException("Socket is closed");
if (!on) { if (!on) {
getImpl().setOption(SocketOptions.SO_LINGER, new Boolean(on)); getImpl().setOption(SocketOptions.SO_LINGER, on);
} else { } else {
if (linger < 0) { if (linger < 0) {
throw new IllegalArgumentException("invalid value for SO_LINGER"); throw new IllegalArgumentException("invalid value for SO_LINGER");

View File

@ -777,7 +777,7 @@ public final class SocketPermission extends Permission
// Literal IPv6 address // Literal IPv6 address
host = getName().substring(1, getName().indexOf(']')); host = getName().substring(1, getName().indexOf(']'));
} else { } else {
int i = getName().indexOf(":"); int i = getName().indexOf(':');
if (i == -1) if (i == -1)
host = getName(); host = getName();
else { else {

View File

@ -368,7 +368,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
String host = epoint.getHostString(); String host = epoint.getHostString();
// IPv6 litteral? // IPv6 litteral?
if (epoint.getAddress() instanceof Inet6Address && if (epoint.getAddress() instanceof Inet6Address &&
(!host.startsWith("[")) && (host.indexOf(":") >= 0)) { (!host.startsWith("[")) && (host.indexOf(':') >= 0)) {
host = "[" + host + "]"; host = "[" + host + "]";
} }
try { try {
@ -688,7 +688,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
String host = saddr.getHostString(); String host = saddr.getHostString();
// IPv6 litteral? // IPv6 litteral?
if (saddr.getAddress() instanceof Inet6Address && if (saddr.getAddress() instanceof Inet6Address &&
(!host.startsWith("[")) && (host.indexOf(":") >= 0)) { (!host.startsWith("[")) && (host.indexOf(':') >= 0)) {
host = "[" + host + "]"; host = "[" + host + "]";
} }
try { try {

View File

@ -1851,9 +1851,9 @@ public final class URI
sb.append("//"); sb.append("//");
if (authority.startsWith("[")) { if (authority.startsWith("[")) {
// authority should (but may not) contain an embedded IPv6 address // authority should (but may not) contain an embedded IPv6 address
int end = authority.indexOf("]"); int end = authority.indexOf(']');
String doquote = authority, dontquote = ""; String doquote = authority, dontquote = "";
if (end != -1 && authority.indexOf(":") != -1) { if (end != -1 && authority.indexOf(':') != -1) {
// the authority contains an IPv6 address // the authority contains an IPv6 address
if (end == authority.length()) { if (end == authority.length()) {
dontquote = authority; dontquote = authority;
@ -1889,8 +1889,8 @@ public final class URI
* because we must not quote a literal IPv6 address * because we must not quote a literal IPv6 address
*/ */
if (opaquePart.startsWith("//[")) { if (opaquePart.startsWith("//[")) {
int end = opaquePart.indexOf("]"); int end = opaquePart.indexOf(']');
if (end != -1 && opaquePart.indexOf(":")!=-1) { if (end != -1 && opaquePart.indexOf(':')!=-1) {
String doquote, dontquote; String doquote, dontquote;
if (end == opaquePart.length()) { if (end == opaquePart.length()) {
dontquote = opaquePart; dontquote = opaquePart;

View File

@ -592,14 +592,24 @@ public final class AccessController {
System.getSecurityManager() != null && System.getSecurityManager() != null &&
!callerPD.impliesCreateAccessControlContext()) !callerPD.impliesCreateAccessControlContext())
{ {
ProtectionDomain nullPD = new ProtectionDomain(null, null); return getInnocuousAcc();
return new AccessControlContext(new ProtectionDomain[] { nullPD });
} else { } else {
return new AccessControlContext(callerPD, combiner, parent, return new AccessControlContext(callerPD, combiner, parent,
context, perms); context, perms);
} }
} }
private static class AccHolder {
// An AccessControlContext with no granted permissions.
// Only initialized on demand when getInnocuousAcc() is called.
static final AccessControlContext innocuousAcc =
new AccessControlContext(new ProtectionDomain[] {
new ProtectionDomain(null, null) });
}
private static AccessControlContext getInnocuousAcc() {
return AccHolder.innocuousAcc;
}
private static ProtectionDomain getCallerPD(final Class <?> caller) { private static ProtectionDomain getCallerPD(final Class <?> caller) {
ProtectionDomain callerPd = doPrivileged ProtectionDomain callerPd = doPrivileged
(new PrivilegedAction<ProtectionDomain>() { (new PrivilegedAction<ProtectionDomain>() {

View File

@ -430,7 +430,7 @@ final class BasicPermissionCollection
offset = path.length()-1; offset = path.length()-1;
while ((last = path.lastIndexOf(".", offset)) != -1) { while ((last = path.lastIndexOf('.', offset)) != -1) {
path = path.substring(0, last+1) + "*"; path = path.substring(0, last+1) + "*";
//System.out.println("check "+path); //System.out.println("check "+path);

View File

@ -931,7 +931,7 @@ public abstract class Provider extends Properties {
} }
private String[] getTypeAndAlgorithm(String key) { private String[] getTypeAndAlgorithm(String key) {
int i = key.indexOf("."); int i = key.indexOf('.');
if (i < 1) { if (i < 1) {
if (debug != null) { if (debug != null) {
debug.println("Ignoring invalid entry in provider " debug.println("Ignoring invalid entry in provider "

View File

@ -1114,7 +1114,7 @@ public final class Security {
// implementation of an algorithm. We are only interested // implementation of an algorithm. We are only interested
// in entries which lead to the implementation // in entries which lead to the implementation
// classes. // classes.
if (currentKey.indexOf(" ") < 0) { if (currentKey.indexOf(' ') < 0) {
result.add(currentKey.substring( result.add(currentKey.substring(
serviceName.length() + 1)); serviceName.length() + 1));
} }

Some files were not shown because too many files have changed in this diff Show More