view src/share/vm/interpreter/cppInterpreter.hpp @ 1091:6aa7255741f3

6906727: UseCompressedOops: some card-marking fixes related to object arrays Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17). Reviewed-by: kvn, coleenp, jmasa
author ysr
date Thu, 03 Dec 2009 15:01:57 -0800
parents 98cb887364d3
children c18cbe5936b8
line wrap: on
line source

/*
 * Copyright 1997-2007 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 *
 */

#ifdef CC_INTERP

// This file contains the platform-independent parts
// of the c++ interpreter

class CppInterpreter: public AbstractInterpreter {
  friend class VMStructs;
  friend class Interpreter; // contains()
  friend class InterpreterGenerator; // result handlers
  friend class CppInterpreterGenerator; // result handlers
 public:


 protected:

  // tosca result -> stack result
  static address    _tosca_to_stack[number_of_result_handlers];  // converts tosca to C++ interpreter stack result
  // stack result -> stack result
  static address    _stack_to_stack[number_of_result_handlers];  // pass result between C++ interpreter calls
  // stack result -> native abi result
  static address    _stack_to_native_abi[number_of_result_handlers];  // converts C++ interpreter results to native abi

  // this is to allow frame and only frame to use contains().
  friend class      frame;

 public:
  // Initialization/debugging
  static void       initialize();
  // this only returns whether a pc is within generated code for the interpreter.

  // This is a moderately dubious interface for the c++ interpreter. Only
  // frame code and debug.cpp should be using it.
  static bool       contains(address pc);

 public:


  // No displatch table to switch so no need for these to do anything special
  static void notice_safepoints() {}
  static void ignore_safepoints() {}

  static address    native_result_to_tosca()                    { return (address)_native_abi_to_tosca; } // aka result handler
  static address    tosca_result_to_stack()                     { return (address)_tosca_to_stack; }
  static address    stack_result_to_stack()                     { return (address)_stack_to_stack; }
  static address    stack_result_to_native()                    { return (address)_stack_to_native_abi; }

  static address    native_result_to_tosca(int index)           { return _native_abi_to_tosca[index]; } // aka result handler
  static address    tosca_result_to_stack(int index)            { return _tosca_to_stack[index]; }
  static address    stack_result_to_stack(int index)            { return _stack_to_stack[index]; }
  static address    stack_result_to_native(int index)           { return _stack_to_native_abi[index]; }

  static address    return_entry  (TosState state, int length);
  static address    deopt_entry   (TosState state, int length);

#include "incls/_cppInterpreter_pd.hpp.incl"

};

#endif // CC_INTERP