< 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 >