зеркало из https://github.com/mozilla/pjs.git
312 строки
5.4 KiB
C++
312 строки
5.4 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
|
|
#ifndef JAVABYTECODES_H
|
|
#define JAVABYTECODES_H
|
|
|
|
#include "Fundamentals.h"
|
|
#include "LogModule.h"
|
|
|
|
typedef unsigned char bytecode;
|
|
|
|
enum BytecodeOpcode
|
|
{
|
|
bcNop,
|
|
bcAConst_Null,
|
|
bcIConst_m1,
|
|
bcIConst_0,
|
|
bcIConst_1,
|
|
bcIConst_2,
|
|
bcIConst_3,
|
|
bcIConst_4,
|
|
bcIConst_5,
|
|
bcLConst_0,
|
|
bcLConst_1,
|
|
bcFConst_0,
|
|
bcFConst_1,
|
|
bcFConst_2,
|
|
bcDConst_0,
|
|
bcDConst_1,
|
|
bcBIPush,
|
|
bcSIPush,
|
|
bcLdc,
|
|
bcLdc_W,
|
|
bcLdc2_W,
|
|
bcILoad,
|
|
bcLLoad,
|
|
bcFLoad,
|
|
bcDLoad,
|
|
bcALoad,
|
|
bcILoad_0,
|
|
bcILoad_1,
|
|
bcILoad_2,
|
|
bcILoad_3,
|
|
bcLLoad_0,
|
|
bcLLoad_1,
|
|
bcLLoad_2,
|
|
bcLLoad_3,
|
|
bcFLoad_0,
|
|
bcFLoad_1,
|
|
bcFLoad_2,
|
|
bcFLoad_3,
|
|
bcDLoad_0,
|
|
bcDLoad_1,
|
|
bcDLoad_2,
|
|
bcDLoad_3,
|
|
bcALoad_0,
|
|
bcALoad_1,
|
|
bcALoad_2,
|
|
bcALoad_3,
|
|
bcIALoad,
|
|
bcLALoad,
|
|
bcFALoad,
|
|
bcDALoad,
|
|
bcAALoad,
|
|
bcBALoad,
|
|
bcCALoad,
|
|
bcSALoad,
|
|
bcIStore,
|
|
bcLStore,
|
|
bcFStore,
|
|
bcDStore,
|
|
bcAStore,
|
|
bcIStore_0,
|
|
bcIStore_1,
|
|
bcIStore_2,
|
|
bcIStore_3,
|
|
bcLStore_0,
|
|
bcLStore_1,
|
|
bcLStore_2,
|
|
bcLStore_3,
|
|
bcFStore_0,
|
|
bcFStore_1,
|
|
bcFStore_2,
|
|
bcFStore_3,
|
|
bcDStore_0,
|
|
bcDStore_1,
|
|
bcDStore_2,
|
|
bcDStore_3,
|
|
bcAStore_0,
|
|
bcAStore_1,
|
|
bcAStore_2,
|
|
bcAStore_3,
|
|
bcIAStore,
|
|
bcLAStore,
|
|
bcFAStore,
|
|
bcDAStore,
|
|
bcAAStore,
|
|
bcBAStore,
|
|
bcCAStore,
|
|
bcSAStore,
|
|
bcPop,
|
|
bcPop2,
|
|
bcDup,
|
|
bcDup_x1,
|
|
bcDup_x2,
|
|
bcDup2,
|
|
bcDup2_x1,
|
|
bcDup2_x2,
|
|
bcSwap,
|
|
bcIAdd,
|
|
bcLAdd,
|
|
bcFAdd,
|
|
bcDAdd,
|
|
bcISub,
|
|
bcLSub,
|
|
bcFSub,
|
|
bcDSub,
|
|
bcIMul,
|
|
bcLMul,
|
|
bcFMul,
|
|
bcDMul,
|
|
bcIDiv,
|
|
bcLDiv,
|
|
bcFDiv,
|
|
bcDDiv,
|
|
bcIRem,
|
|
bcLRem,
|
|
bcFRem,
|
|
bcDRem,
|
|
bcINeg,
|
|
bcLNeg,
|
|
bcFNeg,
|
|
bcDNeg,
|
|
bcIShl,
|
|
bcLShl,
|
|
bcIShr,
|
|
bcLShr,
|
|
bcIUShr,
|
|
bcLUShr,
|
|
bcIAnd,
|
|
bcLAnd,
|
|
bcIOr,
|
|
bcLOr,
|
|
bcIXor,
|
|
bcLXor,
|
|
bcIInc,
|
|
bcI2L,
|
|
bcI2F,
|
|
bcI2D,
|
|
bcL2I,
|
|
bcL2F,
|
|
bcL2D,
|
|
bcF2I,
|
|
bcF2L,
|
|
bcF2D,
|
|
bcD2I,
|
|
bcD2L,
|
|
bcD2F,
|
|
bcInt2Byte,
|
|
bcInt2Char,
|
|
bcInt2Short,
|
|
bcLCmp,
|
|
bcFCmpL,
|
|
bcFCmpG,
|
|
bcDCmpL,
|
|
bcDCmpG,
|
|
bcIfEq,
|
|
bcIfNe,
|
|
bcIfLt,
|
|
bcIfGe,
|
|
bcIfGt,
|
|
bcIfLe,
|
|
bcIf_ICmpEq,
|
|
bcIf_ICmpNe,
|
|
bcIf_ICmpLt,
|
|
bcIf_ICmpGe,
|
|
bcIf_ICmpGt,
|
|
bcIf_ICmpLe,
|
|
bcIf_ACmpEq,
|
|
bcIf_ACmpNe,
|
|
bcGoto,
|
|
bcJsr,
|
|
bcRet,
|
|
bcTableSwitch,
|
|
bcLookupSwitch,
|
|
bcIReturn,
|
|
bcLReturn,
|
|
bcFReturn,
|
|
bcDReturn,
|
|
bcAReturn,
|
|
bcReturn,
|
|
bcGetStatic,
|
|
bcPutStatic,
|
|
bcGetField,
|
|
bcPutField,
|
|
bcInvokeVirtual,
|
|
bcInvokeSpecial,
|
|
bcInvokeStatic,
|
|
bcInvokeInterface,
|
|
bc_unused_,
|
|
bcNew,
|
|
bcNewArray,
|
|
bcANewArray,
|
|
bcArrayLength,
|
|
bcAThrow,
|
|
bcCheckCast,
|
|
bcInstanceOf,
|
|
bcMonitorEnter,
|
|
bcMonitorExit,
|
|
bcWide,
|
|
bcMultiANewArray,
|
|
bcIfNull,
|
|
bcIfNonnull,
|
|
bcGoto_W,
|
|
bcJsr_W,
|
|
bcBreakpoint
|
|
};
|
|
|
|
|
|
// Types for newarray bytecode
|
|
enum NewArrayType
|
|
{
|
|
natBoolean = 4,
|
|
natChar,
|
|
natFloat,
|
|
natDouble,
|
|
natByte,
|
|
natShort,
|
|
natInt,
|
|
natLong
|
|
};
|
|
const uint natMin = natBoolean;
|
|
const uint natLimit = natLong + 1;
|
|
|
|
|
|
struct BytecodeControlInfo
|
|
{
|
|
enum Kind // Categories of bytecodes
|
|
{
|
|
bckNormal, // Any bytecode that can't branch anywhere
|
|
bckThrow, // A bytecode that always causes an exception
|
|
bckExc, // A bytecode that can cause an exception
|
|
bckGoto, // bcGoto
|
|
bckGoto_W, // bcGoto_W
|
|
bckIf, // Any of the if bytecodes
|
|
bckTableSwitch, // bcTableSwitch
|
|
bckLookupSwitch, // bcLookupSwitch
|
|
bckReturn, // Any of the return bytecodes
|
|
bckJsr, // bcJsr
|
|
bckJsr_W, // bcJsr_W
|
|
bckRet, // bcRet
|
|
bckRet_W, // wide bcRet
|
|
bckIllegal // Any bytecode that's not defined by the Java spec
|
|
};
|
|
|
|
Kind kind ENUM_8; // Kind of bytecode
|
|
Uint8 size; // Size of bytecode in bytes
|
|
// (1 for bcTableSwitch, bcLookupSwitch, and illegal; 2 for wide illegal)
|
|
};
|
|
|
|
extern const BytecodeControlInfo normalBytecodeControlInfos[256];
|
|
extern const BytecodeControlInfo wideBytecodeControlInfos[256];
|
|
const BytecodeControlInfo &getBytecodeControlInfo(const bytecode *bc);
|
|
|
|
|
|
#ifdef DEBUG_LOG
|
|
class ConstantPool;
|
|
struct ExceptionItem;
|
|
|
|
const bytecode *disassembleBytecode(LogModuleObject &f, const bytecode *bc, const bytecode *origin, const ConstantPool *c, int margin);
|
|
void disassembleBytecodes(LogModuleObject &f, const bytecode *begin, const bytecode *end, const bytecode *origin, const ConstantPool *c,
|
|
int margin);
|
|
void disassembleExceptions(LogModuleObject &f, Uint32 nExceptionEntries, const ExceptionItem *exceptionEntries, const ConstantPool *c,
|
|
int margin);
|
|
#endif
|
|
|
|
|
|
// --- INLINES ----------------------------------------------------------------
|
|
|
|
|
|
//
|
|
// Return the BytecodeControlInfo corresponding to the bytecode instruction that
|
|
// starts at the given address. The kind and size fields of the BytecodeControlInfo
|
|
// will be correct except for the tableswitch and lookupswitch instructions, for
|
|
// which the size will be 1.
|
|
//
|
|
inline const BytecodeControlInfo &getBytecodeControlInfo(const bytecode *bc)
|
|
{
|
|
bytecode b = bc[0];
|
|
if (b != bcWide)
|
|
return normalBytecodeControlInfos[b];
|
|
else
|
|
return wideBytecodeControlInfos[bc[1]];
|
|
}
|
|
|
|
#endif
|