< prev index next >
src/share/vm/interpreter/templateTable.cpp
Print this page
@@ -37,23 +37,25 @@
//----------------------------------------------------------------------------------------------------
// Implementation of Template
-void Template::initialize(int flags, TosState tos_in, TosState tos_out, generator gen, int arg) {
+void Template::initialize(Bytecodes::Code code, int flags, TosState tos_in, TosState tos_out, generator gen, int arg) {
+ _code = code;
_flags = flags;
_tos_in = tos_in;
_tos_out = tos_out;
_gen = gen;
_arg = arg;
}
Bytecodes::Code Template::bytecode() const {
- int i = this - TemplateTable::_template_table;
- if (i < 0 || i >= Bytecodes::number_of_codes) i = this - TemplateTable::_template_table_wide;
- return Bytecodes::cast(i);
+ return _code;
+// int i = this - TemplateTable::_template_table;
+// if (i < 0 || i >= Bytecodes::number_of_codes) i = this - TemplateTable::_template_table_wide;
+// return Bytecodes::cast(i);
}
void Template::generate(InterpreterMacroAssembler* masm) {
// parameter passing
@@ -167,12 +169,12 @@
//----------------------------------------------------------------------------------------------------
// Implementation of TemplateTable: Initialization
bool TemplateTable::_is_initialized = false;
-Template TemplateTable::_template_table [Bytecodes::number_of_codes];
-Template TemplateTable::_template_table_wide[Bytecodes::number_of_codes];
+Template* TemplateTable::_template_table = NULL;
+Template* TemplateTable::_template_table_wide = NULL;
Template* TemplateTable::_desc;
InterpreterMacroAssembler* TemplateTable::_masm;
BarrierSet* TemplateTable::_bs;
@@ -196,11 +198,11 @@
// extra set of 5 dispatch tables for the wide instructions - for simplicity
// they all go with one table)
assert(in == vtos || !is_wide, "wide instructions have vtos entry point only");
Template* t = is_wide ? template_for_wide(code) : template_for(code);
// setup entry
- t->initialize(flags, in, out, gen, arg);
+ t->initialize(code, flags, in, out, gen, arg);
assert(t->bytecode() == code, "just checkin'");
}
void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(Operation op), Operation op) {
@@ -247,10 +249,13 @@
// Initialize table
TraceStartupTime timer("TemplateTable initialization");
_bs = Universe::heap()->barrier_set();
+ TemplateTable::_template_table = NEW_C_HEAP_ARRAY(Template, Bytecodes::number_of_codes, mtInternal);
+ TemplateTable::_template_table_wide = NEW_C_HEAP_ARRAY(Template, Bytecodes::number_of_codes, mtInternal);
+
// For better readability
const char _ = ' ';
const int ____ = 0;
const int ubcp = 1 << Template::uses_bcp_bit;
const int disp = 1 << Template::does_dispatch_bit;
@@ -468,11 +473,11 @@
def(Bytecodes::_vnew , ubcp|____|clvm|____, vtos, qtos, _vnew , _ );
def(Bytecodes::_vnewarray , ubcp|____|clvm|____, itos, atos, vnewarray , _ );
def(Bytecodes::_multivnewarray , ubcp|____|clvm|____, vtos, atos, multianewarray , _ );
def(Bytecodes::_vreturn , ____|disp|clvm|____, qtos, qtos, _return , qtos );
def(Bytecodes::_vgetfield , ubcp|____|clvm|____, vtos, vtos, vgetfield , f1_byte );
- def(Bytecodes::_typed , ubcp|disp|clvm|____, vtos, vtos, unimplemented_bc , _ );
+ def(Bytecodes::_typed , ubcp|disp|clvm|____, vtos, vtos, typed , _ );
def(Bytecodes::_invokedirect , ubcp|disp|clvm|____, vtos, vtos, invokedirect , f2_byte );
def(Bytecodes::_vbox , ubcp|____|clvm|____, qtos, atos, _vbox , _ );
def(Bytecodes::_vunbox , ubcp|____|clvm|____, atos, qtos, _vunbox , _ );
// wide Java spec bytecodes
@@ -562,10 +567,16 @@
void templateTable_init() {
TemplateTable::initialize();
}
+void TemplateTable::cleanup() {
+ FREE_C_HEAP_ARRAY(Template, TemplateTable::_template_table);
+ TemplateTable::_template_table = NULL;
+ FREE_C_HEAP_ARRAY(Template, TemplateTable::_template_table_wide);
+ TemplateTable::_template_table_wide = NULL;
+}
void TemplateTable::unimplemented_bc() {
_masm->unimplemented( Bytecodes::name(_desc->bytecode()));
}
#endif /* !CC_INTERP */
< prev index next >