Skip to content

Commit 82058da

Browse files
author
Owen Jones
committed
Store virtual function calls instead of virtual call-sites
Also, use an unordered list instead of a vector so we don't have to deduplicate
1 parent 3653550 commit 82058da

File tree

2 files changed

+7
-14
lines changed

2 files changed

+7
-14
lines changed

src/java_bytecode/ci_lazy_methods.cpp

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ bool ci_lazy_methodst::operator()(
121121
}
122122

123123
std::unordered_set<irep_idt> methods_already_populated;
124-
std::vector<const code_function_callt *> virtual_callsites;
124+
std::unordered_set<exprt, irep_hash> virtual_function_calls;
125125

126126
bool any_new_methods = true;
127127
while(any_new_methods)
@@ -148,8 +148,7 @@ bool ci_lazy_methodst::operator()(
148148
continue;
149149
}
150150
gather_virtual_callsites(
151-
symbol_table.lookup_ref(mname).value,
152-
virtual_callsites);
151+
symbol_table.lookup_ref(mname).value, virtual_function_calls);
153152
any_new_methods=true;
154153
}
155154
}
@@ -158,15 +157,9 @@ bool ci_lazy_methodst::operator()(
158157
// possible virtual function call targets:
159158

160159
debug() << "CI lazy methods: add virtual method targets ("
161-
<< virtual_callsites.size()
162-
<< " callsites)"
163-
<< eom;
160+
<< virtual_function_calls.size() << " callsites)" << eom;
164161

165-
std::unordered_set<exprt, irep_hash> unique_functions;
166-
for(const code_function_callt *virtual_callsite : virtual_callsites)
167-
unique_functions.insert(virtual_callsite->function());
168-
169-
for(const exprt &function : unique_functions)
162+
for(const exprt &function : virtual_function_calls)
170163
{
171164
// This will also create a stub if a virtual callsite has no targets.
172165
get_virtual_method_targets(
@@ -376,15 +369,15 @@ void ci_lazy_methodst::initialize_instantiated_classes_from_pointer(
376369
/// e that calls a virtual function.
377370
void ci_lazy_methodst::gather_virtual_callsites(
378371
const exprt &e,
379-
std::vector<const code_function_callt *> &result)
372+
std::unordered_set<exprt, irep_hash> &result)
380373
{
381374
if(e.id()!=ID_code)
382375
return;
383376
const codet &c=to_code(e);
384377
if(c.get_statement()==ID_function_call &&
385378
to_code_function_call(c).function().id()==ID_virtual_function)
386379
{
387-
result.push_back(&to_code_function_call(c));
380+
result.insert(to_code_function_call(c).function());
388381
}
389382
else
390383
{

src/java_bytecode/ci_lazy_methods.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ class ci_lazy_methodst:public messaget
131131

132132
void gather_virtual_callsites(
133133
const exprt &e,
134-
std::vector<const code_function_callt *> &result);
134+
std::unordered_set<exprt, irep_hash> &result);
135135

136136
void get_virtual_method_targets(
137137
const exprt &called_function,

0 commit comments

Comments
 (0)