97 lines
4.1 KiB
Diff
97 lines
4.1 KiB
Diff
From c8190e59dbdcb9f52af521994523bae6b893716b Mon Sep 17 00:00:00 2001
|
|
Subject: 8312200: Fix Parse::catch_call_exceptions memory leak
|
|
|
|
---
|
|
hotspot/src/share/vm/opto/doCall.cpp | 35 ++++++++++++++--------------
|
|
1 file changed, 18 insertions(+), 17 deletions(-)
|
|
|
|
diff --git a/hotspot/src/share/vm/opto/doCall.cpp b/hotspot/src/share/vm/opto/doCall.cpp
|
|
index 1b2b77c71..f41e6d386 100644
|
|
--- a/hotspot/src/share/vm/opto/doCall.cpp
|
|
+++ b/hotspot/src/share/vm/opto/doCall.cpp
|
|
@@ -698,24 +698,25 @@ void Parse::catch_call_exceptions(ciExceptionHandlerStream& handlers) {
|
|
Node* i_o = this->i_o();
|
|
|
|
// Add a CatchNode.
|
|
- GrowableArray<int>* bcis = new (C->node_arena()) GrowableArray<int>(C->node_arena(), 8, 0, -1);
|
|
- GrowableArray<const Type*>* extypes = new (C->node_arena()) GrowableArray<const Type*>(C->node_arena(), 8, 0, NULL);
|
|
- GrowableArray<int>* saw_unloaded = new (C->node_arena()) GrowableArray<int>(C->node_arena(), 8, 0, 0);
|
|
+ Arena tmp_mem(mtCompiler);
|
|
+ GrowableArray<int> bcis(&tmp_mem, 8, 0, -1);
|
|
+ GrowableArray<const Type*> extypes(&tmp_mem, 8, 0, NULL);
|
|
+ GrowableArray<int> saw_unloaded(&tmp_mem, 8, 0, -1);
|
|
|
|
bool default_handler = false;
|
|
for (; !handlers.is_done(); handlers.next()) {
|
|
- ciExceptionHandler* h = handlers.handler();
|
|
- int h_bci = h->handler_bci();
|
|
- ciInstanceKlass* h_klass = h->is_catch_all() ? env()->Throwable_klass() : h->catch_klass();
|
|
+ ciExceptionHandler* h = handlers.handler();
|
|
+ int h_bci = h->handler_bci();
|
|
+ ciInstanceKlass* h_klass = h->is_catch_all() ? env()->Throwable_klass() : h->catch_klass();
|
|
// Do not introduce unloaded exception types into the graph:
|
|
if (!h_klass->is_loaded()) {
|
|
- if (saw_unloaded->contains(h_bci)) {
|
|
+ if (saw_unloaded.contains(h_bci)) {
|
|
/* We've already seen an unloaded exception with h_bci,
|
|
so don't duplicate. Duplication will cause the CatchNode to be
|
|
unnecessarily large. See 4713716. */
|
|
continue;
|
|
} else {
|
|
- saw_unloaded->append(h_bci);
|
|
+ saw_unloaded.append(h_bci);
|
|
}
|
|
}
|
|
const Type* h_extype = TypeOopPtr::make_from_klass(h_klass);
|
|
@@ -723,19 +724,19 @@ void Parse::catch_call_exceptions(ciExceptionHandlerStream& handlers) {
|
|
h_extype = h_extype->join(TypeInstPtr::NOTNULL);
|
|
assert(!h_extype->empty(), "sanity");
|
|
// Note: It's OK if the BCIs repeat themselves.
|
|
- bcis->append(h_bci);
|
|
- extypes->append(h_extype);
|
|
+ bcis.append(h_bci);
|
|
+ extypes.append(h_extype);
|
|
if (h_bci == -1) {
|
|
default_handler = true;
|
|
}
|
|
}
|
|
|
|
if (!default_handler) {
|
|
- bcis->append(-1);
|
|
- extypes->append(TypeOopPtr::make_from_klass(env()->Throwable_klass())->is_instptr());
|
|
+ bcis.append(-1);
|
|
+ extypes.append(TypeOopPtr::make_from_klass(env()->Throwable_klass())->is_instptr());
|
|
}
|
|
|
|
- int len = bcis->length();
|
|
+ int len = bcis.length();
|
|
CatchNode *cn = new (C) CatchNode(control(), i_o, len+1);
|
|
Node *catch_ = _gvn.transform(cn);
|
|
|
|
@@ -746,18 +747,18 @@ void Parse::catch_call_exceptions(ciExceptionHandlerStream& handlers) {
|
|
PreserveJVMState pjvms(this);
|
|
// Locals are just copied from before the call.
|
|
// Get control from the CatchNode.
|
|
- int handler_bci = bcis->at(i);
|
|
+ int handler_bci = bcis.at(i);
|
|
Node* ctrl = _gvn.transform( new (C) CatchProjNode(catch_, i+1,handler_bci));
|
|
// This handler cannot happen?
|
|
if (ctrl == top()) continue;
|
|
set_control(ctrl);
|
|
|
|
// Create exception oop
|
|
- const TypeInstPtr* extype = extypes->at(i)->is_instptr();
|
|
- Node *ex_oop = _gvn.transform(new (C) CreateExNode(extypes->at(i), ctrl, i_o));
|
|
+ const TypeInstPtr* extype = extypes.at(i)->is_instptr();
|
|
+ Node *ex_oop = _gvn.transform(new (C) CreateExNode(extypes.at(i), ctrl, i_o));
|
|
|
|
// Handle unloaded exception classes.
|
|
- if (saw_unloaded->contains(handler_bci)) {
|
|
+ if (saw_unloaded.contains(handler_bci)) {
|
|
// An unloaded exception type is coming here. Do an uncommon trap.
|
|
#ifndef PRODUCT
|
|
// We do not expect the same handler bci to take both cold unloaded
|
|
--
|
|
2.22.0
|
|
|