src/share/vm/interpreter/bytecodeStream.cpp

Fri, 29 Apr 2016 00:06:10 +0800

author
aoqi
date
Fri, 29 Apr 2016 00:06:10 +0800
changeset 1
2d8a650513c2
parent 0
f90c822e73f8
child 6876
710a3c8b516e
permissions
-rw-r--r--

Added MIPS 64-bit port.

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation.
aoqi@0 8 *
aoqi@0 9 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 12 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 13 * accompanied this code).
aoqi@0 14 *
aoqi@0 15 * You should have received a copy of the GNU General Public License version
aoqi@0 16 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 18 *
aoqi@0 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 20 * or visit www.oracle.com if you need additional information or have any
aoqi@0 21 * questions.
aoqi@0 22 *
aoqi@0 23 */
aoqi@0 24
aoqi@0 25 #include "precompiled.hpp"
aoqi@0 26 #include "interpreter/bytecodeStream.hpp"
aoqi@0 27 #include "interpreter/bytecodes.hpp"
aoqi@0 28
aoqi@0 29 Bytecodes::Code RawBytecodeStream::raw_next_special(Bytecodes::Code code) {
aoqi@0 30 assert(!is_last_bytecode(), "should have been checked");
aoqi@0 31 // set next bytecode position
aoqi@0 32 address bcp = RawBytecodeStream::bcp();
aoqi@0 33 address end = method()->code_base() + end_bci();
aoqi@0 34 int l = Bytecodes::raw_special_length_at(bcp, end);
aoqi@0 35 if (l <= 0 || (_bci + l) > _end_bci) {
aoqi@0 36 code = Bytecodes::_illegal;
aoqi@0 37 } else {
aoqi@0 38 _next_bci += l;
aoqi@0 39 assert(_bci < _next_bci, "length must be > 0");
aoqi@0 40 // set attributes
aoqi@0 41 _is_wide = false;
aoqi@0 42 // check for special (uncommon) cases
aoqi@0 43 if (code == Bytecodes::_wide) {
aoqi@0 44 if (bcp + 1 >= end) {
aoqi@0 45 code = Bytecodes::_illegal;
aoqi@0 46 } else {
aoqi@0 47 code = (Bytecodes::Code)bcp[1];
aoqi@0 48 _is_wide = true;
aoqi@0 49 }
aoqi@0 50 }
aoqi@0 51 }
aoqi@0 52 _raw_code = code;
aoqi@0 53 return code;
aoqi@0 54 }
aoqi@0 55
aoqi@0 56 #ifdef ASSERT
aoqi@0 57 void BaseBytecodeStream::assert_raw_index_size(int size) const {
aoqi@0 58 if (raw_code() == Bytecodes::_invokedynamic && is_raw()) {
aoqi@0 59 // in raw mode, pretend indy is "bJJ__"
aoqi@0 60 assert(size == 2, "raw invokedynamic instruction has 2-byte index only");
aoqi@0 61 } else {
aoqi@0 62 bytecode().assert_index_size(size, raw_code(), is_wide());
aoqi@0 63 }
aoqi@0 64 }
aoqi@0 65
aoqi@0 66 void BaseBytecodeStream::assert_raw_stream(bool want_raw) const {
aoqi@0 67 if (want_raw) {
aoqi@0 68 assert( is_raw(), "this function only works on raw streams");
aoqi@0 69 } else {
aoqi@0 70 assert(!is_raw(), "this function only works on non-raw streams");
aoqi@0 71 }
aoqi@0 72 }
aoqi@0 73 #endif //ASSERT

mercurial