Main Page | Namespace List | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

opcode.c File Reference


Detailed Description

Java Virtual Machine inner loop virtual instruction execution.

A specific group of exceptions that may be thrown by JVM execution (spec section 2.16.4 unless specified otherwise) are not typically checked by the Java program and stop thread execution unless caught by a Java catch block.

A suite of errors may also be thrown that Java programs normally to not attempt to catch and which terminate JVM execution:

Todo:
The code fragment macros used by the opcode switch in opcode_run() need to have the local variables documented as to which as required upon macro startup and which are set for use at macro completion.

Control

$URL: https://svn.apache.org/path/name/opcode.c $ $Id: opcode.c 0 09/28/2005 dlydick $

Copyright 2005 The Apache Software Foundation or its licensors, as applicable.

Licensed under the Apache License, Version 2.0 ("the License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and limitations under the License.

Version:
$LastChangedRevision: 0 $
Date:
$LastChangedDate: 09/28/2005 $
Author:
$LastChangedBy: dlydick $ Original code contributed by Daniel Lydick on 09/28/2005.

Reference

Definition in file opcode.c.

#include "arch.h"
#include "jvmcfg.h"
#include "cfmacros.h"
#include "classfile.h"
#include "exit.h"
#include "gc.h"
#include "jvm.h"
#include "jvmclass.h"
#include "linkage.h"
#include "method.h"
#include "native.h"
#include "opcode.h"
#include "utf.h"
#include "util.h"

Go to the source code of this file.

Validate a constant_pool entry

#define CHECK_CP_TAG(u2var, cptag1)
 Check that a constant_pool entry contains a specific of tag for this operation.
#define CHECK_CP_TAG2(u2var, cptag1, cptag2)
 Check that a constant_pool entry contains the right kind of tag for this operation, from a choice of two.
#define CHECK_CP_TAG3(u2var, cptag1, cptag2, cptag3)
 Check that a constant_pool entry contains the right kind of tag for this operation, from a choice of three.

Macro support for inner loop opcodes.

Common operations that are used in numerous opcodes are gathered here so as to improve accuracy of implementation and simplify the code.

#define GET_U2_OPERAND(u2var)
 Retrieve a two-byte operand that the PC points to.

Defines

#define CALCULATE_CLASS_INFO_FROM_CLASS_REFERENCE(clsnameidx)
 Calculate ClassFile pointer from a class reference.
#define CALCULATE_FIELD_INFO_FROM_FIELD_REFERENCE(Fieldref)
 Calculate field_info pointer from a field reference.
#define CALCULATE_METHOD_INFO_FROM_METHOD_REFERENCE(Methodref)
 Calculate method_info pointer from a method reference.
#define CALCULATE_METHOD_INFO_FROM_PC
 Calculate method_info pointer from program counter.
#define CHECK_FINAL_FIELD_CURRENT_CLASS
 Check if this field is a final field in the current class.
#define CHECK_INSTANCE_FIELD
 Check if this field is an object instance field.
#define CHECK_INSTANCE_METHOD
 Check if this method is an object instance method.
#define CHECK_NOT_ABSTRACT_CLASS
 Check if this object is from a concrete class, that is, not from an abstract class.
#define CHECK_NOT_ABSTRACT_METHOD
 Check if this method is a concrete method, that is, not abstract .
#define CHECK_NOT_ARRAY_OBJECT
 Check if this object is a scalar, that is, not an array.
#define CHECK_NOT_INTERFACE_CLASS
 Check if this object is from a normal class, that is, not from an interface class.
#define CHECK_STATIC_FIELD
 Check if this field is a static field.
#define CHECK_STATIC_METHOD
 Check if this method is a static method.
#define CHECK_TWO_ACCESSES
 Check if this field requires two jint accesses or just one.
#define CHECK_VALID_CODEATRIDX(codeatridx)
 Check for code attribute index in local method binding.
#define CHECK_VALID_FIELDLOOKUPIDX(fluidx)
 Check for field lookup index in local field binding.
#define FORCE_JFLOAT(var_sizeofjint)   (*((jfloat *) ((jvoid *) &var_sizeofjint)))
 Force conversion of any Java type variable of sizeof(jint) into a jfloat variable, but without conversion of contents.
#define FORCE_JINT(var_sizeofjint)   (*((jint *) ((jvoid *) &var_sizeofjint)))
 Force conversion of any Java type variable of sizeof(jint) into a jint variable, but without conversion of contents.
#define GETDATA(data_array)
 Retrieve value by data type from either class static field or object instance field.
#define GETFIELD
 Retrieve value by data type from object instance field.
#define GETSTATIC
 Retrieve value by data type from class static field.
#define LATE_CLASS_LOAD(clsnameidx)
 Attempt to load a class that is not currently loaded.
#define PUTDATA(data_array)
 Store out value by data type into either class static field or object instance field.
#define PUTFIELD
 Store out value by data type into object instance field.
#define PUTSTATIC
 Store out value by data type into class static field.
#define STUB   { dummy1(); }

Functions

static void opcode_c_dummy (void)
static int opcode_end_thread_setup (rvoid)
 JVM inner loop setup for end of thread detection-- implements setjmp(3) .
static rvoid opcode_end_thread_test (jvm_thread_index thridx)
 Detect end of thread when stack frame is empty at return time and perform non-local return-- implements longjmp(3) .
rvoid opcode_load_run_throwable (rchar *pThrowableEvent, jvm_thread_index thridx)
 Load a java.lang.Throwable event, typically an Error or Exception and run its <clinit> method followed by its <init> method with default parameters.
rboolean opcode_run (jvm_thread_index thridx, rboolean check_timeslice)
 Inner loop of JVM virtual instruction execution engine.

Variables

static char * opcode_c_copyright = "\0" "$URL: https://svn.apache.org/path/name/opcode.c $ $Id: opcode.c 0 09/28/2005 dlydick $" " " "Copyright 2005 The Apache Software Foundation or its licensors, as applicable."
rboolean opcode_calling_java_lang_linkageerror
 Double-fault error state variable for throwable event. Permit boolean "false" manifest constant for initializing static and global storage.
static jmp_buf opcode_end_thread_return


Define Documentation

#define GET_U2_OPERAND u2var   ) 
 

Value:

u2var = GETRS2((u2 *) &pcode[pc->offset]); \
    pc->offset += sizeof(u2)
Retrieve a two-byte operand that the PC points to.

Store thw two-byte operand into the requested u2 variable, then increment the program counter to the next byte code following it.

Parameters:
u2var Name of a u2 variable that will receive the two bytes of operand from with the instruction.
Returns:
rvoid

Definition at line 232 of file opcode.c.

Referenced by opcode_run().

#define CHECK_CP_TAG u2var,
cptag1   ) 
 

Value:

if (cptag1 != CP_TAG(pcfs, u2var))                          \
    {                                                           \
        /* Somebody is confused */                              \
        thread_throw_exception(thridx,                          \
                               THREAD_STATUS_THREW_ERROR,       \
                               JVMCLASS_JAVA_LANG_VERIFYERROR); \
/*NOTREACHED*/                                                  \
    }
Check that a constant_pool entry contains a specific of tag for this operation.

Parameters:
u2var Name of a u2 variable that contains a constant_pool entry to be examined.
cptag1 First constant_pool tag that is valid for this operation.
Returns:
rvoid
Exceptions:
JVMCLASS_JAVA_LANG_VERIFYERROR if the constant_pool entry does not have the right tag.

Definition at line 265 of file opcode.c.

Referenced by opcode_run().

#define CHECK_CP_TAG2 u2var,
cptag1,
cptag2   ) 
 

Value:

if ((cptag1 != CP_TAG(pcfs, u2var)) &&                      \
        (cptag2 != CP_TAG(pcfs, u2var)))                        \
    {                                                           \
        /* Somebody is confused */                              \
        thread_throw_exception(thridx,                          \
                               THREAD_STATUS_THREW_ERROR,       \
                               JVMCLASS_JAVA_LANG_VERIFYERROR); \
/*NOTREACHED*/                                                  \
    }
Check that a constant_pool entry contains the right kind of tag for this operation, from a choice of two.

Parameters:
u2var Name of a u2 variable that contains a constant_pool entry to be examined.
cptag1 First constant_pool tag that is valid for this operation.
cptag2 Second constant_pool tag that is valid for this operation.
Returns:
rvoid
Exceptions:
JVMCLASS_JAVA_LANG_VERIFYERROR if the constant_pool entry does not have the right tag.

Definition at line 299 of file opcode.c.

#define CHECK_CP_TAG3 u2var,
cptag1,
cptag2,
cptag3   ) 
 

Value:

if ((cptag1 != CP_TAG(pcfs, u2var)) &&                      \
        (cptag2 != CP_TAG(pcfs, u2var)) &&                      \
        (cptag3 != CP_TAG(pcfs, u2var)))                        \
    {                                                           \
        /* Somebody is confused */                              \
        thread_throw_exception(thridx,                          \
                               THREAD_STATUS_THREW_ERROR,       \
                               JVMCLASS_JAVA_LANG_VERIFYERROR); \
/*NOTREACHED*/                                                  \
    }
Check that a constant_pool entry contains the right kind of tag for this operation, from a choice of three.

Parameters:
u2var Name of a u2 variable that contains a constant_pool entry to be examined.
cptag1 First constant_pool tag that is valid for this operation.
cptag2 Second constant_pool tag that is valid for this operation.
cptag3 Third constant_pool tag that is valid for this operation.
Returns:
rvoid
Exceptions:
JVMCLASS_JAVA_LANG_VERIFYERROR if the constant_pool entry does not have the right tag.

Definition at line 337 of file opcode.c.

#define FORCE_JINT var_sizeofjint   )     (*((jint *) ((jvoid *) &var_sizeofjint)))
 

Force conversion of any Java type variable of sizeof(jint) into a jint variable, but without conversion of contents.

This macro is typically used to move a jobject reference or a jfloat into a jint word, but suppress type conversion between the source and destination variables. It derives the address of the 32-bit source value, casts it as a pointer to the destination data type, then extracts that type.

Warning:
This macro must have a 32-bit word as its source. For use with smaller types, perform a widening conversion first (such as jboolean) to jint. Then and only then will the target type work correctly.

Since this macro takes the address of its source parameter, it will only work for variables, not for expressions!

Parameters:
var_sizeofjint Any 32-bit variable. If it is a smaller type, such as (jboolean), perform a widening conversion into (jint) first.
Returns:
(jint) version of var_sizeofjint without conversion of contents (such as jfloat-to-jint might want to do).
Todo:
A careful review of this macro across different compilers is very much in order.

Definition at line 388 of file opcode.c.

Referenced by opcode_run().

#define FORCE_JFLOAT var_sizeofjint   )     (*((jfloat *) ((jvoid *) &var_sizeofjint)))
 

Force conversion of any Java type variable of sizeof(jint) into a jfloat variable, but without conversion of contents.

This macro is typically used to move a jint into a jint word, but suppress type conversion between the source and destination variables.

Warning:
For comments on the dangers of using this macro, please refer to FORCE_JINT().
Parameters:
var_sizeofjint Any 32-bit variable.
Returns:
(jfloat) version of var_sizeofjint without conversion of contents (such as jint-to-jfloat might want to do).
Todo:
A careful review of this macro across different compilers is very much in order.

Definition at line 417 of file opcode.c.

#define CALCULATE_METHOD_INFO_FROM_PC
 

Value:

clsidxmisc = GET_PC_FIELD_IMMEDIATE(thridx, clsidx); \
    mthidxmisc = GET_PC_FIELD_IMMEDIATE(thridx, mthidx); \
    pcfsmisc   = CLASS_OBJECT_LINKAGE(clsidxmisc)->pcfs; \
    pmth       = METHOD(clsidxmisc, mthidxmisc)
Calculate method_info pointer from program counter.

During the calculation, various scratch variables are loaded and used to simplify the code. The final result is a (method_info *) stored the local variable pmth

Parameters: rvoid

Returns:
rvoid.

Definition at line 434 of file opcode.c.

Referenced by opcode_run().

#define CALCULATE_CLASS_INFO_FROM_CLASS_REFERENCE clsnameidx   ) 
 

Value:

pcpd       = pcfs->constant_pool[clsnameidx];                      \
    pcpd_Class = PTR_THIS_CP_Class(pcpd);                              \
    clsidxmisc = pcpd_Class->LOCAL_Class_binding.clsidxJVM;            \
    if (jvm_class_index_null == clsidxmisc)                            \
    {                                                                  \
        /* Need local variable to avoid possible expansion confusion */\
        jvm_constant_pool_index cpidxOLD = clsnameidx;                 \
                                                                       \
        /* If class is not loaded, go retrieve it by UTF8 class name */\
        LATE_CLASS_LOAD(cpidxOLD);                                     \
    }                                                                  \
    pcfsmisc = CLASS_OBJECT_LINKAGE(clsidxmisc)->pcfs;
Calculate ClassFile pointer from a class reference.

During the calculation, various scratch variables are loaded and used to simplify the code. Two final results include a (CONSTANT_Class_info *) stored in the local variable pcpd_Class stored the local variable pcfsmisc and a (CONSTANT_Class_info *) stored in the local variable pcpd_Class

Parameters:
clsnameidx constant_pool index into class file of current class (as indicated in the program counter) that is a class reference entry.
Returns:
rvoid.

Definition at line 460 of file opcode.c.

Referenced by opcode_run().

#define LATE_CLASS_LOAD clsnameidx   ) 
 

Value:

\
    pcpd       = pcfs->constant_pool[clsnameidx]; /* Class name */   \
    pcpd_Class = PTR_THIS_CP_Class(pcpd);                            \
                                                  /* UTF8 string */  \
    pcpd       = pcfs->constant_pool[pcpd_Class->name_index];        \
    pcpd_Utf8  = PTR_THIS_CP_Utf8(pcpd);                             \
                                                                     \
    prchar_clsname = utf_utf2prchar(pcpd_Utf8);                      \
                                                                     \
    /* Try again to load class */                                    \
    clsidxmisc = class_load_resolve_clinit(prchar_clsname,           \
                                           CURRENT_THREAD,           \
                                           rfalse,                   \
                                           rfalse);                  \
                                                                     \
    HEAP_FREE_DATA(prchar_clsname);                                  \
                                                                     \
    /* If class is irretrievable, abort */                           \
    if (jvm_class_index_null == clsidxmisc)                          \
    {                                                                \
        thread_throw_exception(thridx,                               \
                               THREAD_STATUS_THREW_ERROR,            \
                           JVMCLASS_JAVA_LANG_NOCLASSDEFFOUNDERROR); \
/*NOTREACHED*/                                                       \
    }
Attempt to load a class that is not currently loaded.

Parameters:
clsnameidx CONSTANT_Utf8_info constant_pool index to class name
Returns:
rvoid
Exceptions:
JVMCLASS_JAVA_LANG_NOCLASSDEFFOUNDERROR if requested class cannot be located.

Definition at line 490 of file opcode.c.

Referenced by opcode_run().

#define CALCULATE_METHOD_INFO_FROM_METHOD_REFERENCE Methodref   ) 
 

Value:

pcpd           = pcfs->constant_pool[Methodref];                   \
    pcpd_Methodref = PTR_THIS_CP_Methodref(pcpd);                      \
    clsidxmisc     = pcpd_Methodref->LOCAL_Methodref_binding.clsidxJVM;\
    if (jvm_class_index_null == clsidxmisc)                            \
    {                                                                  \
        /* If class is not loaded, go retrieve it by UTF8 class name */\
       LATE_CLASS_LOAD(pcpd_Methodref->class_index);                   \
                                                                       \
        /* Check if method exists in loaded class */                   \
        clsidxmisc = pcpd_Methodref->LOCAL_Methodref_binding.clsidxJVM;\
        if (jvm_class_index_null == clsidxmisc)                        \
        {                                                              \
            thread_throw_exception(thridx,                             \
                                   THREAD_STATUS_THREW_ERROR,          \
                                JVMCLASS_JAVA_LANG_NOSUCHMETHODERROR); \
/*NOTREACHED*/                                                         \
        }                                                              \
    }                                                                  \
                                                                       \
    mthidxmisc = pcpd_Methodref->LOCAL_Methodref_binding.mthidxJVM;    \
    if (jvm_method_index_bad == mthidxmisc)                            \
    {                                                                  \
        thread_throw_exception(thridx,                                 \
                               THREAD_STATUS_THREW_ERROR,              \
                                JVMCLASS_JAVA_LANG_NOSUCHMETHODERROR); \
/*NOTREACHED*/                                                         \
    }                                                                  \
                                                                       \
    pcfsmisc       = CLASS_OBJECT_LINKAGE(clsidxmisc)->pcfs;           \
    pmth           = pcfsmisc->methods[mthidxmisc]
Calculate method_info pointer from a method reference.

During the calculation, various scratch variables are loaded and used to simplify the code. Two final results include a (method_info *) stored the local variable pmth and a (CONSTANT_Methodref_info *) stored in the local variable pcpd_Methodref

Parameters:
Methodref constant_pool index into class file of current class (as indicated in the program counter) that is a method reference entry.
Returns:
rvoid.
Exceptions:
JVMCLASS_JAVA_LANG_NOSUCHMETHODERROR if requested method is not found in the class.

Definition at line 543 of file opcode.c.

Referenced by opcode_run().

#define CHECK_VALID_CODEATRIDX codeatridx   ) 
 

Value:

Check for code attribute index in local method binding.

Parameters:
codeatridx Code attribute index from a local method binding
Returns:
rvoid
Exceptions:
JVMCLASS_JAVA_LANG_NOSUCHMETHODERROR if requested class static field is not found in the class.

Definition at line 591 of file opcode.c.

Referenced by opcode_run().

#define CHECK_STATIC_METHOD
 

Value:

\
    /* Must be a static method */                                \
    if (!(ACC_STATIC & pmth->access_flags))                      \
    {                                                            \
        thread_throw_exception(thridx,                           \
                               THREAD_STATUS_THREW_ERROR,        \
                               JVMCLASS_JAVA_LANG_VERIFYERROR);  \
/*NOTREACHED*/                                                   \
    }
Check if this method is a static method.

Parameters: rvoid

Returns:
rvoid
Exceptions:
JVMCLASS_JAVA_LANG_VERIFYERROR if requested method is an object instance method.

Definition at line 616 of file opcode.c.

Referenced by opcode_run().

#define CHECK_INSTANCE_METHOD
 

Value:

\
    /* Must be an instance method */                             \
    if (ACC_STATIC & pmth->access_flags)                         \
    {                                                            \
        thread_throw_exception(thridx,                           \
                               THREAD_STATUS_THREW_ERROR,        \
                               JVMCLASS_JAVA_LANG_VERIFYERROR);  \
/*NOTREACHED*/                                                   \
    }
Check if this method is an object instance method.

Parameters: rvoid

Returns:
rvoid
Exceptions:
JVMCLASS_JAVA_LANG_VERIFYERROR if requested method is a static method.

Definition at line 643 of file opcode.c.

#define CHECK_NOT_ABSTRACT_METHOD
 

Value:

\
    /* Must not be an abstract method */                               \
    if (ACC_ABSTRACT & pmth->access_flags)                             \
    {                                                                  \
        thread_throw_exception(thridx,                                 \
                               THREAD_STATUS_THREW_ERROR,              \
                               JVMCLASS_JAVA_LANG_INSTANTIATIONERROR); \
/*NOTREACHED*/                                                         \
    }
Check if this method is a concrete method, that is, not abstract .

Parameters: rvoid

Returns:
rvoid
Exceptions:
JVMCLASS_JAVA_LANG_INSTANTIATIONERROR if requested method is an abstract method.

Definition at line 704 of file opcode.c.

Referenced by opcode_run().

#define CHECK_NOT_ABSTRACT_CLASS
 

Value:

\
    /* Must not be from an abstract class */                           \
    if (ACC_ABSTRACT &                                                 \
        OBJECT_CLASS_LINKAGE(objhashmisc)->pcfs->access_flags)         \
    {                                                                  \
        thread_throw_exception(thridx,                                 \
                               THREAD_STATUS_THREW_ERROR,              \
                               JVMCLASS_JAVA_LANG_INSTANTIATIONERROR); \
/*NOTREACHED*/                                                         \
    }
Check if this object is from a concrete class, that is, not from an abstract class.

Parameters: rvoid

Returns:
rvoid
Exceptions:
JVMCLASS_JAVA_LANG_INSTANTIATIONERROR if requested object is an abstract object.

Definition at line 732 of file opcode.c.

Referenced by opcode_run().

#define CHECK_NOT_ARRAY_OBJECT
 

Value:

\
    /* Must not be an array object */                                  \
    if (OBJECT_STATUS_ARRAY &                                          \
        CLASS(OBJECT_CLASS_LINKAGE(objhashmisc)->clsidx).status)       \
    {                                                                  \
        thread_throw_exception(thridx,                                 \
                               THREAD_STATUS_THREW_ERROR,              \
                               JVMCLASS_JAVA_LANG_INSTANTIATIONERROR); \
/*NOTREACHED*/                                                         \
    }
Check if this object is a scalar, that is, not an array.

Parameters: rvoid

Returns:
rvoid
Exceptions:
JVMCLASS_JAVA_LANG_INSTANTIATIONERROR if requested method is an array object.

Definition at line 760 of file opcode.c.

Referenced by opcode_run().

#define CHECK_NOT_INTERFACE_CLASS
 

Value:

\
    /* Must not be from an interface class */                          \
    if (ACC_INTERFACE &                                                \
        OBJECT_CLASS_LINKAGE(objhashmisc)->pcfs->access_flags)         \
    {                                                                  \
        thread_throw_exception(thridx,                                 \
                               THREAD_STATUS_THREW_ERROR,              \
                               JVMCLASS_JAVA_LANG_INSTANTIATIONERROR); \
/*NOTREACHED*/                                                         \
    }
Check if this object is from a normal class, that is, not from an interface class.

Parameters: rvoid

Returns:
rvoid
Exceptions:
JVMCLASS_JAVA_LANG_INSTANTIATIONERROR if requested object is from an interface class.

Definition at line 789 of file opcode.c.

Referenced by opcode_run().

#define CALCULATE_FIELD_INFO_FROM_FIELD_REFERENCE Fieldref   ) 
 

Calculate field_info pointer from a field reference.

During the calculation, various scratch variables are loaded and used to simplify the code. Two final results include a (field_info *) stored the local variable pfld and a (CONSTANT_Fieldref_info *) stored in the local variable pcpd_Fieldref

Parameters:
Fieldref constant_pool index into class file of current class (as indicated in the program counter) that is a method reference entry.
Returns:
rvoid.
Exceptions:
JVMCLASS_JAVA_LANG_NOSUCHFIELDERROR if requested field is not found in the class.

Definition at line 824 of file opcode.c.

Referenced by opcode_run().

#define CHECK_VALID_FIELDLOOKUPIDX fluidx   ) 
 

Value:

Check for field lookup index in local field binding.

Parameters:
fluidx Field lookup index from a local field binding
Returns:
rvoid
Exceptions:
JVMCLASS_JAVA_LANG_NOSUCHFIELDERROR if requested class static field is not found in the class.

Definition at line 875 of file opcode.c.

Referenced by opcode_run().

#define CHECK_STATIC_FIELD
 

Value:

\
    /* Must be a static field */                                 \
    if (!(ACC_STATIC & pfld->access_flags))                      \
    {                                                            \
        thread_throw_exception(thridx,                           \
                               THREAD_STATUS_THREW_ERROR,        \
               JVMCLASS_JAVA_LANG_INCOMPATIBLECLASSCHANGEERROR); \
/*NOTREACHED*/                                                   \
    }
Check if this field is a static field.

Parameters: rvoid

Returns:
rvoid
Exceptions:
JVMCLASS_JAVA_LANG_INCOMPATIBLECLASSCHANGEERROR if requested field is an object instance field.

Definition at line 900 of file opcode.c.

Referenced by opcode_run().

#define CHECK_INSTANCE_FIELD
 

Value:

\
    /* Must be an instance field */                              \
    if (ACC_STATIC & pfld->access_flags)                         \
    {                                                            \
        thread_throw_exception(thridx,                           \
                               THREAD_STATUS_THREW_ERROR,        \
               JVMCLASS_JAVA_LANG_INCOMPATIBLECLASSCHANGEERROR); \
/*NOTREACHED*/                                                   \
    }
Check if this field is an object instance field.

Parameters: rvoid

Returns:
rvoid
Exceptions:
JVMCLASS_JAVA_LANG_INCOMPATIBLECLASSCHANGEERROR if requested method is a static field.

Definition at line 927 of file opcode.c.

#define CHECK_FINAL_FIELD_CURRENT_CLASS
 

Value:

\
    {                                                            \
        jvm_class_index clsidxTMP;                               \
                                                                 \
        GET_PC_FIELD(thridx, clsidxTMP, clsidx);                 \
                                                                 \
        /* A final field must _not_ be found in a superclass */  \
        if ((ACC_FINAL & pfld->access_flags) &&                  \
            (clsidxTMP != pcpd_Fieldref                          \
                            ->LOCAL_Fieldref_binding.clsidxJVM)) \
        {                                                        \
            thread_throw_exception(thridx,                       \
                                   THREAD_STATUS_THREW_ERROR,    \
                       JVMCLASS_JAVA_LANG_ILLEGALACCESSERROR);   \
/*NOTREACHED*/                                                   \
        }                                                        \
    }
Check if this field is a final field in the current class.

Determine if a final field is in the current class. If so, fine, but otherwise it is in a superclass. This is an error.

Parameters: rvoid

Returns:
rvoid
Exceptions:
JVMCLASS_JAVA_LANG_ILLEGALACCESSERROR if requested field is final, but in a superclass.

Definition at line 957 of file opcode.c.

Referenced by opcode_run().

#define CHECK_TWO_ACCESSES
 

Value:

\
    (((pcpd_Fieldref->LOCAL_Fieldref_binding.jvaluetypeJVM ==      \
       BASETYPE_CHAR_J)                                         || \
      (pcpd_Fieldref->LOCAL_Fieldref_binding.jvaluetypeJVM ==      \
       BASETYPE_CHAR_D))                                           \
    ? rtrue                                                        \
    : rfalse)
Check if this field requires two jint accesses or just one.

JVM stack operations and local variable accesses need to know if the datum to be moved takes one jint slot or two. Items of types jlong and jdouble take two such accesses, all others take just one.

Parameters: rvoid

Returns:
rtrue if this field takes two accesses, otherwise rfalse for smaller types.

Definition at line 995 of file opcode.c.

#define PUTDATA data_array   ) 
 

Store out value by data type into either class static field or object instance field.

Parameters:
data_array Expression pointing to the class' or object's XXX_data[] array, namely a (jvalue *). Typically a fixed set of two expressions.
Returns:
rvoid
See also:
PUTFIELD

PUTSTATIC

Todo:
The various type casting games of integer/sub-integer and integer/float/double and integer/objhash need to be carefully scrutinized for correctness at run time.
Todo:
Is BASTYPE_CHAR_ARRAY a legal case for PUTSTATIC and PUTFIELD ?

Definition at line 1031 of file opcode.c.

#define PUTSTATIC
 

Value:

PUTDATA(CLASS(pcpd_Fieldref->LOCAL_Fieldref_binding.clsidxJVM) \
              .class_static_field_data[fluidxmisc])
Store out value by data type into class static field.

Definition at line 1113 of file opcode.c.

Referenced by opcode_run().

#define PUTFIELD
 

Value:

PUTDATA(OBJECT(pcpd_Fieldref->LOCAL_Fieldref_binding.clsidxJVM) \
               .object_instance_field_data[fluidxmisc])
Store out value by data type into object instance field.

Definition at line 1122 of file opcode.c.

#define GETDATA data_array   ) 
 

Retrieve value by data type from either class static field or object instance field.

Parameters:
data_array Expression pointing to the class' or object's XXX_data[] array, namely a (jvalue *). Typically a fixed set of two expressions.
Returns:
rvoid
See also:
GETFIELD

GETSTATIC

Todo:
The various type casting games of integer/sub-integer and integer/float/double and integer/objhash need to be carefully scrutinized for correctness at run time.
Todo:
Is BASTYPE_CHAR_ARRAY a legal case for GETSTATIC and GETFIELD ?

Definition at line 1153 of file opcode.c.

#define GETSTATIC
 

Value:

GETDATA(CLASS(pcpd_Fieldref->LOCAL_Fieldref_binding.clsidxJVM) \
              .class_static_field_data[fluidxmisc])
Retrieve value by data type from class static field.

Definition at line 1230 of file opcode.c.

Referenced by opcode_run().

#define GETFIELD
 

Value:

GETDATA(OBJECT(pcpd_Fieldref->LOCAL_Fieldref_binding.clsidxJVM) \
              .object_instance_field_data[fluidxmisc])
Retrieve value by data type from object instance field.

Definition at line 1239 of file opcode.c.

#define STUB   { dummy1(); }
 

Referenced by opcode_run().


Function Documentation

static void opcode_c_dummy void   )  [static]
 

Definition at line 189 of file opcode.c.

static int opcode_end_thread_setup rvoid   )  [static]
 

JVM inner loop setup for end of thread detection-- implements setjmp(3) .

Use this function to arm handler for non-local exit from the inner while() loop when a thread has finished running.

Parameters: rvoid

Returns:
From normal setup, integer EXIT_MAIN_OKAY. Otherwise, return exit_enum code enumeration from opcode_end_thread_test().

Definition at line 1273 of file opcode.c.

Referenced by opcode_run().

static rvoid opcode_end_thread_test jvm_thread_index  thridx  )  [static]
 

Detect end of thread when stack frame is empty at return time and perform non-local return-- implements longjmp(3) .

Use this function to test for end of thread execution and to perform a non-local return from the inner while() loop when a thread has finished running.

This function is invoked from within each of the Java return family of opcodes to detect if the stack frame is empty after a POP_FRAME(). If this test passes, then the stack frame is empty and the thread has nothing else to do. It is therefore moved into the COMPLETE state and a non-local return exits the while loop.

Parameters:
thridx Thread index of thread to evaluate.
Returns:
rvoid if end of thread test fails. If test passes, perform non-local state restoration from setup via setjmp(3) as stored in opcode_end_thread_return.
Check both current end of program FP and final FP in case something like a <clinit> or <init> was loaded on top of a running program.

Todo:
Should FP condition be fp_end_program <= THREAD().fp instead of < condition?

Definition at line 1312 of file opcode.c.

Referenced by opcode_run().

rvoid opcode_load_run_throwable rchar pThrowableEvent,
jvm_thread_index  thridx
 

Load a java.lang.Throwable event, typically an Error or Exception and run its <clinit> method followed by its <init> method with default parameters.

This function must not be called until java.lang.Object , java.lang.Class, java.lang.String , java.lang.Throwable java.lang.Error have been loaded and initialized.

There is no attempt to enforce which classes may be invoked by this handler. It is assumed that the caller will only pass in subclasses of JVMCLASS_JAVA_LANG_ERROR. Anything else will produce undefined results.

Warning:
This handler is not a simple as it seems! You absolutely must know what the non-local return mechanism setjmp(3)/longjmp(3) is before attempting to figure it out!!!
The strategy is a simple one: Trap thrown errors by this handler and trap a failure in that error class by throwing a JVMCLASS_JAVA_LANG_INTERNALERROR. If that fails, give up.

Details: When this function is first called due to a thrown error, it attempts to load and run that error class. If all is well, that class runs and everyone lives happily ever after. If that class throws an error, however, this handler, having been re-armed, is activated semi-recursively via exit_throw_exception(), (that is, not entering at the top of function, but at the return from exit_throw_exception() with a non-zero return value), entering this code at exit_exception_setup(), choosing the conditional branch != EXIT_MAIN_OKAY and attempts to recursively load and run JVMCLASS_JAVA_LANG_LINKAGEERROR. If this is successful, fine, call exit_jvm() and be done. However, if even this fails and throws an error, the handler, having been rearmed again by the attempt to invoke JVMCLASS_JAVA_LANG_LINKAGEERROR, it again semi-recursively is activated via exit_throw_exception() and again enters the code at exit_exception_setup(). This time, the global opcode_calling_java_lang_linkageerror is rtrue, so no more recursive invocations are performed. Instead, exit_jvm() with the most recent EXIT_xxx code from exit_throw_exception() and be done.

Parameters:
pThrowableEvent Null-terminated string name of throwable class.
thridx Thread table index of thread to load this java.lang.Throwable sub-class into.
Returns:
rvoid. Either the java.lang.Throwable class loads and runs, or it loads java.lang.LinkageError and runs it, then returns to caller, or it exits due to an error somewhere in this sequence of events.

For internal use only.

This call to exit_exception_setup() and the following if (EXIT_MAIN_OKAY) statement constitute the ugly part of this code as described above. See also other recursive calls and their control via opcode_calling_java_lang_linkageerror:

Todo:
Make this load and run the error class <clinit> and default <init> method instead of/in addition to fprintf(). Other exit_throw_exception() handlers will have invoked this method, so it must be rearmed again at this point, lest an error that invokes it causes an infinite loop.

Load error class and run its <clinit> method.

If an error is thrown by class_load_resolve_clinit(), re-enter this error function recursively at exit_exception_setup().

Both mark (here) and unmark (below) class so it gets garbage collected.

Instantiate error class object and run its default <init> method with default parameters.

If an error is thrown in objec_instance_new(), re-enter this error function recursively at exit_exception_setup().

< This slot is available for use. DO NOT CHANGE since this is also the normal setjmp(3) return code from thread_exception_setup()

< Not stated in spec, but implied

Both mark and unmark object so it gets garbage collected

Unmarked from above-- since JVM is going down, this may be irrelevant, but be consistent.

Definition at line 1430 of file opcode.c.

References class_load_resolve_clinit(), CLASS_OBJECT_LINKAGE, exit_exception_setup(), exit_get_name(), exit_jvm(), exit_LinkageError_subclass, EXIT_MAIN_OKAY, fprintfLocalStderr(), GC_CLASS_MKREF_FROM_CLASS, GC_CLASS_RMREF_FROM_CLASS, GC_OBJECT_MKREF_FROM_OBJECT, GC_OBJECT_RMREF_FROM_OBJECT, jvm_class_index_null, jvm_object_hash_null, jvm_thread_index_null, JVMCLASS_JAVA_LANG_LINKAGEERROR, jvmutil_print_stack(), LOCAL_CONSTANT_NO_ARRAY_DIMS, object_instance_new(), opcode_calling_java_lang_linkageerror, opcode_load_run_throwable(), rfalse, rnull, rtrue, sysErrMsg(), and THREAD_STATUS_EMPTY.

Referenced by opcode_load_run_throwable(), and opcode_run().

rboolean opcode_run jvm_thread_index  thridx,
rboolean  check_timeslice
 

Inner loop of JVM virtual instruction execution engine.

Only run the inner loop until:

  • thread state changes
  • time slice expired
  • thread completes (when FP is not 0, that is, not JVMCFG_NULL_SP)

Any remaining time on this time slice will go against the next thread, which may only have a small amount of time, even none at all. This is a natural effect of any time-slicing algorithm.

Logic similar to the uncaught exception handler of this function may be found in object_run_method() as far as initiating execution of a JVM method.

Todo:
See if there is a better time-slicing algorithm that is just as easy to use and keeps good real clock time.
Todo:
: having run_init_ (parm 7) for invocations of opject_instance_new() to be rfalse the right thing to do for array initialization, namely opcodes NEWARRAY and ANEWARRAY ? Initializing an array is really not a constructor type of operation, but the individual components (elements) of the array probably would be, and with default parameters.
Parameters:
thridx Thread index of thread to run
check_timeslice rtrue if JVM time slice preempts execution after maximum time exceeded.
Returns:
rtrue if this method and/or time slice ran correctly (whether or not the thread finished running), or rfalse if an uncaught exception was thrown or if an Error, Exception, or Throwable was thrown, or if a thread state could not be properly changed.
< This slot is available for use. DO NOT CHANGE since this is also the normal setjmp(3) return code from thread_exception_setup()

< thread threw a java.lang.Exception (but NOT a java.lang.Error). The object type is found in pThrowableEvent and is not rnull.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< thread threw a java.lang.Throwable of unknowable type. The object type is found in pThrowableEvent and is not rnull.

< A java.lang.Throwable of some type was thrown, but not handled by the Java code itself. Instead, it will be handled by the default java.lang.ThreadGroup.uncaughtException method. The value of pThrowableEvent will be rnull.

< thread threw a java.lang.Exception (but NOT a java.lang.Error). The object type is found in pThrowableEvent and is not rnull.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< thread threw a java.lang.Throwable of unknowable type. The object type is found in pThrowableEvent and is not rnull.

< A java.lang.Throwable of some type was thrown, but not handled by the Java code itself. Instead, it will be handled by the default java.lang.ThreadGroup.uncaughtException method. The value of pThrowableEvent will be rnull.

< thread threw a java.lang.Exception (but NOT a java.lang.Error). The object type is found in pThrowableEvent and is not rnull.

Todo:
What needs to go here?
< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

Todo:
What needs to go here?
< thread threw a java.lang.Throwable of unknowable type. The object type is found in pThrowableEvent and is not rnull.

Todo:
What needs to go here?
< A java.lang.Throwable of some type was thrown, but not handled by the Java code itself. Instead, it will be handled by the default java.lang.ThreadGroup.uncaughtException method. The value of pThrowableEvent will be rnull.

Todo:
Get ThreadGroup logic working that figures out which java.lang.ThreadGroup this thread is a part of and invoke java.lang.ThreadGroup.uncaughtException() for that specific object instead of this general method. Probably the class library will gripe about not knowing which object to associate with the method call since java.lang.ThreadGroup.uncaughtException() is not a static method.
< null-terminated string form of METHOD_CHAR_OPEN_PARM

< null-terminated string form of BASETYPE_CHAR_ARRAY

< null-terminated string form of BASETYPE_CHAR_L

< null-terminated string form of BASETYPE_CHAR_L_TERM

< null-terminated string form of BASETYPE_CHAR_ARRAY

< null-terminated string form of BASETYPE_CHAR_L

< null-terminated string form of BASETYPE_CHAR_L_TERM

< null-terminated string form of METHOD_CHAR_OPEN_PARM

< null-terminated string form of METHOD_CHAR_VOID

alias

< Start PC location

< null-terminated string form of METHOD_CHAR_OPEN_PARM

< null-terminated string form of BASETYPE_CHAR_ARRAY

< null-terminated string form of BASETYPE_CHAR_L

< null-terminated string form of BASETYPE_CHAR_L_TERM

< null-terminated string form of BASETYPE_CHAR_ARRAY

< null-terminated string form of BASETYPE_CHAR_L

< null-terminated string form of BASETYPE_CHAR_L_TERM

< null-terminated string form of METHOD_CHAR_OPEN_PARM

< null-terminated string form of METHOD_CHAR_VOID

< Place a thread into requested thread state, see link threadstate_request_new() threadstate_request_XXX()endlink for specifics.

< Request that an arbitrary thread move into a certain thread state, see link threadstate_request_new() threadstate_request_XXX()endlink for specifics.

Todo:
What needs to go here, if anything?
< thread threw a java.lang.Exception (but NOT a java.lang.Error). The object type is found in pThrowableEvent and is not rnull.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< thread threw a java.lang.Throwable of unknowable type. The object type is found in pThrowableEvent and is not rnull.

< thread threw a java.lang.Exception (but NOT a java.lang.Error). The object type is found in pThrowableEvent and is not rnull.

< Place a thread into requested thread state, see link threadstate_request_new() threadstate_request_XXX()endlink for specifics.

< Request that an arbitrary thread move into a certain thread state, see link threadstate_request_new() threadstate_request_XXX()endlink for specifics.

For internal use only.

For best runtime efficiency, place tests in order of most to least frequent occurrence.

< 00 (0x00) nop

< 01 (0x01) aconst_null

Todo:
Test this opcode
< 02 (0x02) iconst_m1

< 03 (0x03) iconst_0

< 04 (0x04) iconst_1

< 05 (0x05) iconst_2

< 06 (0x06) iconst_3

< 07 (0x07) iconst_4

< 08 (0x08) iconst_5

< 03 (0x03) iconst_0

< 09 (0x09) lconst_0

< 10 (0x0a) lconst_1

Todo:
Test this opcode
< 09 (0x09) lconst_0

< 11 (0x0b) fconst_0

< 12 (0x0c) fconst_1

< 13 (0x0d) fconst_2

Todo:
Test this opcode
< 11 (0x0b) fconst_0

< 14 (0x0e) dconst_0

< 15 (0x0f) dconst_1

Todo:
Test this opcode
< 14 (0x0e) dconst_0

< 16 (0x10) bipush

Todo:
Write this opcode
< 17 (0x11) sipush

Todo:
Write this opcode
< 18 (0x12) Ldc

Todo:
Write this opcode
< 19 (0x13) ldc_w

Todo:
Write this opcode
< 20 (0x14) ldc2_w

Todo:
Write this opcode
< 21 (0x15) iload

Todo:
Write this opcode
< 22 (0x16) lload

Todo:
Write this opcode
< 23 (0x17) fload

Todo:
Write this opcode
< 24 (0x18) dload

Todo:
Write this opcode
< 25 (0x19) aload

Todo:
Write this opcode
< 26 (0x1a) iload_0

< 27 (0x1b) iload_1

< 28 (0x1c) iload_2

< 29 (0x1d) iload_3

Todo:
Write this opcode
< 30 (0x1e) lload_0

< 31 (0x1f) lload_1

< 32 (0x20) lload_2

< 33 (0x21) lload_3

Todo:
Write this opcode
< 34 (0x22) fload_0

< 35 (0x23) fload_1

< 36 (0x24) fload_2

< 37 (0x25) fload_3

Todo:
Write this opcode
< 38 (0x26) dload_0

< 39 (0x27) dload_1

< 40 (0x28) dload_2

< 41 (0x29) dload_3

Todo:
Write this opcode
< 42 (0x2a) aload_0

< 43 (0x2b) aload_1

< 44 (0x2c) aload_2

< 45 (0x2d) aload_3

Todo:
Write this opcode
< 46 (0x2e) iaload

Todo:
Write this opcode
< 47 (0x2f) laload

Todo:
Write this opcode
< 48 (0x30) faload

Todo:
Write this opcode
< 49 (0x31) daload

Todo:
Write this opcode
< 50 (0x32) aaload

Todo:
Write this opcode
< 51 (0x33) baload

Todo:
Write this opcode
< 52 (0x34) caload

Todo:
Write this opcode
< 53 (0x35) saload

Todo:
Write this opcode
< 54 (0x36) istore

Todo:
Write this opcode
< 55 (0x37) lstore

Todo:
Write this opcode
< 56 (0x38) fstore

Todo:
Write this opcode
< 57 (0x39) dstore

Todo:
Write this opcode
< 58 (0x3a) astore

Todo:
Write this opcode
< 59 (0x3b) istore_0

< 60 (0x3c) istore_1

< 61 (0x3d) istore_2

< 62 (0x3e) istore_3

Todo:
Write this opcode
< 63 (0x3f) lstore_0

< 64 (0x40) lstore_1

< 65 (0x41) lstore_2

< 66 (0x42) lstore_3

Todo:
Write this opcode
< 67 (0x43) fstore_0

< 68 (0x44) fstore_1

< 69 (0x45) fstore_2

< 70 (0x46) fstore_3

Todo:
Write this opcode
< 71 (0x47) dstore_0

< 72 (0x48) dstore_1

< 73 (0x49) dstore_2

< 74 (0x4a) dstore_3

Todo:
Write this opcode
< 75 (0x4b) astore_0

< 76 (0x4c) astore_1

< 77 (0x4d) astore_2

< 78 (0x4e) astore_3

Todo:
Write this opcode
< 79 (0x4f) iastore

Todo:
Write this opcode
< 80 (0x50) lastore

Todo:
Write this opcode
< 81 (0x51) fastore

Todo:
Write this opcode
< 82 (0x52) dastore

Todo:
Write this opcode
< 83 (0x53) aastore

Todo:
Write this opcode
< 84 (0x54) bastore

Todo:
Write this opcode
< 85 (0x55) castore

Todo:
Write this opcode
< 86 (0x56) sastore

Todo:
Write this opcode
< 87 (0x57) Pop

Todo:
Write this opcode
< 88 (0x58) pop2

Todo:
Write this opcode
< 089 (0x59) dup

Todo:
Write this opcode
< 090 (0x5a) dup_x1

Todo:
Write this opcode
< 091 (0x5b) dup_x2

Todo:
Write this opcode
< 092 (0x5C) dup2

Todo:
Write this opcode
< 093 (0x5d) dup2_x1

Todo:
Write this opcode
< 094 (0x5e) dup2_x2

Todo:
Write this opcode
< 095 (0x5f) swap

Todo:
Write this opcode
< 096 (0x60) iadd

Todo:
Write this opcode
< 097 (0x61) ladd

Todo:
Write this opcode
< 098 (0x62) fadd

Todo:
Write this opcode
< 099 (0x63) dadd

Todo:
Write this opcode
< 100 (0x64) isub

Todo:
Write this opcode
< 101 (0x65) lsub

Todo:
Write this opcode
< 102 (0x66) fsub

Todo:
Write this opcode
< 103 (0x67) dsub

Todo:
Write this opcode
< 104 (0x68) imul

Todo:
Write this opcode
< 105 (0x69) lmul

Todo:
Write this opcode
< 106 (0x6a) fmul

Todo:
Write this opcode
< 107 (0x6b) dmul

Todo:
Write this opcode
< 108 (0x6c) idiv

Todo:
Write this opcode
< 109 (0x6d) ldiv

Todo:
Write this opcode
< 110 (0x6e) fdiv

Todo:
Write this opcode
< 111 (0x6f) ddiv

Todo:
Write this opcode
< 112 (0x70) irem

Todo:
Write this opcode
< 113 (0x71) lrem

Todo:
Write this opcode
< 114 (0x72) frem

Todo:
Write this opcode
< 115 (0x73) drem

Todo:
Write this opcode
< 116 (0x74) ineg

Todo:
Write this opcode
< 117 (0x75) lneg

Todo:
Write this opcode
< 118 (0x76) fneg

Todo:
Write this opcode
< 119 (0x77) dneg

Todo:
Write this opcode
< 120 (0x78) ishl

Todo:
Write this opcode
< 121 (0x79) lshl

Todo:
Write this opcode
< 122 (0x7a) ishr

Todo:
Write this opcode
< 123 (0x7b) lshr

Todo:
Write this opcode
< 124 (0x7c) iushr

Todo:
Write this opcode
< 125 (0x7d) lushr

Todo:
Write this opcode
< 126 (0x7e) iand

Todo:
Write this opcode
< 127 (0x7f) land

Todo:
Write this opcode
< 128 (0x80) ior

Todo:
Write this opcode
< 129 (0x81) lor

Todo:
Write this opcode
< 130 (0x82) ixor

Todo:
Write this opcode
< 131 (0x83) lxor

Todo:
Write this opcode
< 132 (0x84) iinc

Todo:
Write this opcode
< 133 (0x85) i2l

Todo:
Write this opcode
< 134 (0x86) i2f

Todo:
Write this opcode
< 135 (0x87) i2d

Todo:
Write this opcode
< 136 (0x88) l2i

Todo:
Write this opcode
< 137 (0x89) l2f

Todo:
Write this opcode
< 138 (0x8a) l2d

Todo:
Write this opcode
< 139 (0x8b) f2i

Todo:
Write this opcode
< 140 (0x8c) f2l

Todo:
Write this opcode
< 141 (0x8d) f2d

Todo:
Write this opcode
< 142 (0x8e) d2i

Todo:
Write this opcode
< 143 (0x8f) d2l

Todo:
Write this opcode
< 144 (0x90) d2f

Todo:
Write this opcode
< 145 (0x91) i2b

Todo:
Write this opcode
< 146 (0x92) i2c

Todo:
Write this opcode
< 147 (0x93) i2s

Todo:
Write this opcode
< 148 (0x94) lcmp

Todo:
Write this opcode
< 149 (0x95) fcmpl

Todo:
Write this opcode
< 150 (0x96) fcmpg

Todo:
Write this opcode
< 151 (0x97) dcmpl

Todo:
Write this opcode
< 152 (0x98) dcmpg

Todo:
Write this opcode
< 153 (0x99) ifeq

Todo:
Write this opcode
< 154 (0x9a) ifne

Todo:
Write this opcode
< 155 (0x9b) iflt

Todo:
Write this opcode
< 156 (0x9c) ifge

Todo:
Write this opcode
< 157 (0x9d) ifgt

Todo:
Write this opcode
< 158 (0x9e) ifle

Todo:
Write this opcode
< 159 (0x9f) if_icmpeq

Todo:
Write this opcode
< 160 (0xa0) if_icmpne

Todo:
Write this opcode
< 161 (0xa1) if_icmplt

Todo:
Write this opcode
< 162 (0xa2) if_icmpge

Todo:
Write this opcode
< 163 (0xa3) if_icmpgt

Todo:
Write this opcode
< 164 (0xa4) if_icmple

Todo:
Write this opcode
< 165 (0xa5) if_acmpeq

Todo:
Write this opcode
< 166 (0xa6) if_acmpne

Todo:
Write this opcode
< 167 (0xa7) goto

Todo:
Write this opcode
< 168 (0xa8) jsr

Todo:
Write this opcode
< 169 (0xa9) ret

Todo:
Write this opcode

Todo:
Is this test needed here, or only in xRETURN ?
< 170 (0xaa) tableswitch

< 171 (0xab) lookupswitch

Todo:
Write this opcode
< 172 (0xac) ireturn

Todo:
Write this opcode
Todo:
Write this opcode
< 173 (0xad) lreturn

Todo:
Write this opcode
< 174 (0xae) freturn

Todo:
Write this opcode
< 175 (0xaf) dreturn

Todo:
Write this opcode
< 176 (0xb0) areturn

Todo:
Write this opcode
< 177 (0xb1) return

< Declared synchronized ; invokation is wrapped in a monitor lock.

< Access structures of the thread now running in the JVM.

Todo:
Implement test for same number of locks/unlocks per JVM spec section 8.13.
alias

< 178 (0xb2) getstatic

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< Access structures of the thread now running in the JVM.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< Declared static .

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< Declared final;no subclasses allowed

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< Signed byte

< Unicode character

< Double-precision floating-point value

< Single-precision floating-point value

< Integer

< Long integer

< an instance of class '/class/name'

< Signed short

< Boolean, true or false

< Reference to one array dimension

< Invalid basetype due to malformed tag or other error (not in spec)

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< 179 (0xb3) putstatic

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< Access structures of the thread now running in the JVM.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< Declared static .

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< Declared final;no subclasses allowed

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< Signed byte

< Unicode character

< Double-precision floating-point value

< Single-precision floating-point value

< Integer

< Long integer

< an instance of class '/class/name'

< Signed short

< Boolean, true or false

< Reference to one array dimension

< Invalid basetype due to malformed tag or other error (not in spec)

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< 180 (0xb4) getfield

Todo:
Write this opcode
< 181 (0xb5) putfield

Todo:
Write this opcode
< 182 (0xb6) invokevirtual

Todo:
Write this opcode
< 183 (0xb7) invokespecial

Todo:
Write this opcode
< 184 (0xb8) invokestatic

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< Access structures of the thread now running in the JVM.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< Declared static .

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< Declared abstract ; may not be instantiated.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< Declared synchronized ; invokation is wrapped in a monitor lock.

< Access structures of the thread now running in the JVM.

< Declared native ; implemented in a language other than Java.

< Access structures of the thread now running in the JVM.

< 185 (0xb9)invokeinterface

Todo:
Write this opcode
< 186 (0xba) xxxunusedxxx1

< 187 (0xbb) new

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< Declared abstract ; may not be instantiated.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< Object is an array instead of an object instance

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< Is an interface, not a class.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< Access structures of the thread now running in the JVM.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< This slot is available for use

< Object is a java/Lang/Thread < 188 (0xbc) newarray

Todo:
Write this opcode
< 189 (0xbd) anewarray

Todo:
Make sure that all of "class, array, or interface type" is supported by this test:
< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< Access structures of the thread now running in the JVM.

< thread threw a java.lang.Error (but NOT a java.lang.Exception). The object type is found in pThrowableEvent and is not rnull.

< thread threw a java.lang.Exception (but NOT a java.lang.Error). The object type is found in pThrowableEvent and is not rnull.

< Object is an array instead of an object instance

< Object is a java/Lang/Thread < Object is an array instead of an object instance

Todo:
: Is 'rfalse' correct?
< 190 (0xbe) arraylength

Todo:
Write this opcode
< 191 (0xbf) athrow

Todo:
Write this opcode
< 192 (0xc0) checkcast

Todo:
Write this opcode
< 193 (0xc1) instanceof

Todo:
Write this opcode
< 194 (0xc2) monitorenter

Todo:
Write this opcode
< 195 (0xc3) monitorexit

Todo:
Write this opcode
< 196 (0xc4) wide

Todo:
Test this opcode
< 197 (0xc5) multianewarray

Todo:
Write this opcode
< 198 (0xc6) ifnull

Todo:
Write this opcode
< 199 (0xc7) ifnonnull

Todo:
Write this opcode
< 200 (0xc8) goto_w

Todo:
Write this opcode
< 201 (0xc9) jsr_w

Todo:
Write this opcode
< 202 (0xca) breakpoint

Todo:
Write this opcode
< 203 (0xcb) unused

< 204 (0xcc) unused

< 205 (0xcd) unused

< 206 (0xce) unused

< 207 (0xcf) unused

< 208 (0xd0) unused

< 209 (0xd1) unused

< 210 (0xd2) unused

< 211 (0xd3) unused

< 212 (0xd4) unused

< 213 (0xd5) unused

< 214 (0xd6) unused

< 215 (0xd7) unused

< 216 (0xd8) unused

< 217 (0xd9) unused

< 218 (0xda) unused

< 219 (0xdb) unused

< 220 (0xdc) unused

< 221 (0xdd) unused

< 222 (0xde) unused

< 223 (0xdf) unused

< 224 (0xe0) unused

< 225 (0xe1) unused

< 226 (0xe2) unused

< 227 (0xe3) unused

< 228 (0xe4) unused

< 229 (0xe5) unused

< 230 (0xe6) unused

< 231 (0xe7) unused

< 232 (0xe8) unused

< 233 (0xe9) unused

< 234 (0xea) unused

< 234 (0xeb) unused

< 235 (0xec) unused

< 237 (0xed) unused

< 238 (0xee) unused

< 239 (0xef) unused

< 240 (0xf0) unused

< 241 (0xf1) unused

< 242 (0xf2) unused

< 243 (0xf3) unused

< 244 (0xf4) unused

< 245 (0xf5) unused

< 246 (0xf6) unused

< 247 (0xf7) unused

< 248 (0xf8) unused

< 249 (0xf9) unused

< 250 (0xfa) unused

< 251 (0xfb) unused

< 252 (0xfc) unused

< 253 (0xfd) unused

< 254 (0xfe) impdep1

Todo:
Write this opcode
< 255 (0xff) impdep2

Todo:
Write this opcode
< Place a thread into requested thread state, see link threadstate_request_new() threadstate_request_XXX()endlink for specifics.

< Request that an arbitrary thread move into a certain thread state, see link threadstate_request_new() threadstate_request_XXX()endlink for specifics.

If a thread completed running, and a proper request to the COMPLETE state was issued, then it finished normally.

Todo:
Should this if() statement be inside of the block requesting COMPLETE state? Should a simple return(rtrue) be there? Should this if() statement be expanded to consider other conditions? Etc. Just needs review for other possibilities.
< This slot is available for use. DO NOT CHANGE since this is also the normal setjmp(3) return code from thread_exception_setup()

< Place a thread into requested thread state, see link threadstate_request_new() threadstate_request_XXX()endlink for specifics.

< Request that an arbitrary thread move into a certain thread state, see link threadstate_request_new() threadstate_request_XXX()endlink for specifics.

Definition at line 1610 of file opcode.c.

References ACC_NATIVE, ACC_SYNCHRONIZED, method_info::access_flags, method_info::attributes, bytegames_split_jdouble(), bytegames_split_jlong(), CALCULATE_CLASS_INFO_FROM_CLASS_REFERENCE, CALCULATE_FIELD_INFO_FROM_FIELD_REFERENCE, CALCULATE_METHOD_INFO_FROM_METHOD_REFERENCE, CALCULATE_METHOD_INFO_FROM_PC, CHECK_CP_TAG, CHECK_FINAL_FIELD_CURRENT_CLASS, CHECK_FINAL_STACK_FRAME_ULTIMATE, CHECK_NOT_ABSTRACT_CLASS, CHECK_NOT_ABSTRACT_METHOD, CHECK_NOT_ARRAY_OBJECT, CHECK_NOT_INTERFACE_CLASS, CHECK_STATIC_FIELD, CHECK_STATIC_METHOD, CHECK_VALID_CODEATRIDX, CHECK_VALID_FIELDLOOKUPIDX, CLASS, class_find_by_prchar(), class_load_resolve_clinit(), CLASS_OBJECT_LINKAGE, CLASS_STATUS_ARRAY, CONSTANT_Class_info::LOCAL_Class_binding::clsidxJVM, CODE_CONSTRAINT_START_PC, method_info::LOCAL_method_binding::codeatridxJVM, CONSTANT_Class, CONSTANT_Fieldref, CONSTANT_Methodref, ClassFile::constant_pool, CURRENT_THREAD, DEREFERENCE_PC_CODE_BASE, method_info::descriptor_index, CONSTANT_NameAndType_info::descriptor_index, method_info::LOCAL_method_binding::excpatridxJVM, exit_jvm(), EXIT_JVM_ATTRIBUTE, EXIT_JVM_CLASS, EXIT_JVM_INTERNAL, EXIT_JVM_METHOD, EXIT_JVM_THREAD, EXIT_MAIN_OKAY, exit_throw_exception(), FORCE_JINT, GET_U2_OPERAND, GETSTATIC, HEAP_FREE_DATA, jvm_attribute_index_bad, jvm_attribute_index_native, jvm_class_index_null, jvm_method_index_bad, jvm_object_hash_null, JVMCFG_UNCAUGHT_EXCEPTION_METHOD, JVMCFG_UNCAUGHT_EXCEPTION_PARMS, JVMCLASS_JAVA_LANG_NEGATIVEARRAYSIZEEXCEPTION, JVMCLASS_JAVA_LANG_NOCLASSDEFFOUNDERROR, JVMCLASS_JAVA_LANG_NOSUCHMETHODERROR, JVMCLASS_JAVA_LANG_THREAD, JVMCLASS_JAVA_LANG_THREADGROUP, jvmutil_print_stack(), LATE_CLASS_LOAD, CONSTANT_Class_info::LOCAL_Class_binding, method_info::LOCAL_method_binding, Code_attribute::max_locals, method_find_by_prchar(), ClassFile::methods, CONSTANT_Methodref_info::name_and_type_index, method_info::name_index, CONSTANT_NameAndType_info::name_index, CONSTANT_Class_info::name_index, native_run_method(), object_instance_new(), OBJECT_STATUS_ARRAY, OBJECT_STATUS_EMPTY, OBJECT_STATUS_THREAD, objectutil_synchronize(), objectutil_unsynchronize(), jvm_pc::offset, OPCODE_00_NOP, OPCODE_01_ACONST_NULL, OPCODE_02_ICONST_M1, OPCODE_03_ICONST_0, OPCODE_04_ICONST_1, OPCODE_05_ICONST_2, OPCODE_06_ICONST_3, OPCODE_07_ICONST_4, OPCODE_08_ICONST_5, OPCODE_09_LCONST_0, OPCODE_0A_LCONST_1, OPCODE_0B_FCONST_0, OPCODE_0C_FCONST_1, OPCODE_0D_FCONST_2, OPCODE_0E_DCONST_0, OPCODE_0F_DCONST_1, OPCODE_10_BIPUSH, OPCODE_11_SIPUSH, OPCODE_12_LDC, OPCODE_13_LDC_W, OPCODE_14_LDC2_W, OPCODE_15_ILOAD, OPCODE_16_LLOAD, OPCODE_17_FLOAD, OPCODE_18_DLOAD, OPCODE_19_ALOAD, OPCODE_1A_ILOAD_0, OPCODE_1B_ILOAD_1, OPCODE_1C_ILOAD_2, OPCODE_1D_ILOAD_3, OPCODE_1E_LLOAD_0, OPCODE_1F_LLOAD_1, OPCODE_20_LLOAD_2, OPCODE_21_LLOAD_3, OPCODE_22_FLOAD_0, OPCODE_23_FLOAD_1, OPCODE_24_FLOAD_2, OPCODE_25_FLOAD_3, OPCODE_26_DLOAD_0, OPCODE_27_DLOAD_1, OPCODE_28_DLOAD_2, OPCODE_29_DLOAD_3, OPCODE_2A_ALOAD_0, OPCODE_2B_ALOAD_1, OPCODE_2C_ALOAD_2, OPCODE_2D_ALOAD_3, OPCODE_2E_IALOAD, OPCODE_2F_LALOAD, OPCODE_30_FALOAD, OPCODE_31_DALOAD, OPCODE_32_AALOAD, OPCODE_33_BALOAD, OPCODE_34_CALOAD, OPCODE_35_SALOAD, OPCODE_36_ISTORE, OPCODE_37_LSTORE, OPCODE_38_FSTORE, OPCODE_39_DSTORE, OPCODE_3A_ASTORE, OPCODE_3B_ISTORE_0, OPCODE_3C_ISTORE_1, OPCODE_3D_ISTORE_2, OPCODE_3E_ISTORE_3, OPCODE_3F_LSTORE_0, OPCODE_40_LSTORE_1, OPCODE_41_LSTORE_2, OPCODE_42_LSTORE_3, OPCODE_43_FSTORE_0, OPCODE_44_FSTORE_1, OPCODE_45_FSTORE_2, OPCODE_46_FSTORE_3, OPCODE_47_DSTORE_0, OPCODE_48_DSTORE_1, OPCODE_49_DSTORE_2, OPCODE_4A_DSTORE_3, OPCODE_4B_ASTORE_0, OPCODE_4C_ASTORE_1, OPCODE_4D_ASTORE_2, OPCODE_4E_ASTORE_3, OPCODE_4F_IASTORE, OPCODE_50_LASTORE, OPCODE_51_FASTORE, OPCODE_52_DASTORE, OPCODE_53_AASTORE, OPCODE_54_BASTORE, OPCODE_55_CASTORE, OPCODE_56_SASTORE, OPCODE_57_POP, OPCODE_58_POP2, OPCODE_59_DUP, OPCODE_5A_DUP_X1, OPCODE_5B_DUP_X2, OPCODE_5C_DUP2, OPCODE_5D_DUP2_X1, OPCODE_5E_DUP2_X2, OPCODE_5F_SWAP, OPCODE_60_IADD, OPCODE_61_LADD, OPCODE_62_FADD, OPCODE_63_DADD, OPCODE_64_ISUB, OPCODE_65_LSUB, OPCODE_66_FSUB, OPCODE_67_DSUB, OPCODE_68_IMUL, OPCODE_69_LMUL, OPCODE_6A_FMUL, OPCODE_6B_DMUL, OPCODE_6C_IDIV, OPCODE_6D_LDIV, OPCODE_6E_FDIV, OPCODE_6F_DDIV, OPCODE_70_IREM, OPCODE_71_LREM, OPCODE_72_FREM, OPCODE_73_DREM, OPCODE_74_INEG, OPCODE_75_LNEG, OPCODE_76_FNEG, OPCODE_77_DNEG, OPCODE_78_ISHL, OPCODE_79_LSHL, OPCODE_7A_ISHR, OPCODE_7B_LSHR, OPCODE_7C_IUSHR, OPCODE_7D_LUSHR, OPCODE_7E_IAND, OPCODE_7F_LAND, OPCODE_80_IOR, OPCODE_81_LOR, OPCODE_82_IXOR, OPCODE_83_LXOR, OPCODE_84_IINC, OPCODE_85_I2L, OPCODE_86_I2F, OPCODE_87_I2D, OPCODE_88_L2I, OPCODE_89_L2F, OPCODE_8A_L2D, OPCODE_8B_F2I, OPCODE_8C_F2L, OPCODE_8D_F2D, OPCODE_8E_D2I, OPCODE_8F_D2L, OPCODE_90_D2F, OPCODE_91_I2B, OPCODE_92_I2C, OPCODE_93_I2S, OPCODE_94_LCMP, OPCODE_95_FCMPL, OPCODE_96_FCMPG, OPCODE_97_DCMPL, OPCODE_98_DCMPG, OPCODE_99_IFEQ, OPCODE_9A_IFNE, OPCODE_9B_IFLT, OPCODE_9C_IFGE, OPCODE_9D_IFGT, OPCODE_9E_IFLE, OPCODE_9F_IF_ICMPEQ, OPCODE_A0_IF_ICMPNE, OPCODE_A1_IF_ICMPLT, OPCODE_A2_IF_ICMPGE, OPCODE_A3_IF_ICMPGT, OPCODE_A4_IF_ICMPLE, OPCODE_A5_IF_ACMPEQ, OPCODE_A6_IF_ACMPNE, OPCODE_A7_GOTO, OPCODE_A8_JSR, OPCODE_A9_RET, OPCODE_AA_TABLESWITCH, OPCODE_AB_LOOKUPSWITCH, OPCODE_AC_IRETURN, OPCODE_AD_LRETURN, OPCODE_AE_FRETURN, OPCODE_AF_DRETURN, OPCODE_B0_ARETURN, OPCODE_B1_RETURN, OPCODE_B2_GETSTATIC, OPCODE_B3_PUTSTATIC, OPCODE_B4_GETFIELD, OPCODE_B5_PUTFIELD, OPCODE_B6_INVOKEVIRTUAL, OPCODE_B7_INVOKESPECIAL, OPCODE_B8_INVOKESTATIC, OPCODE_B9_INVOKEINTERFACE, OPCODE_BA_XXXUNUSEDXXX1, OPCODE_BB_NEW, OPCODE_BC_NEWARRAY, OPCODE_BD_ANEWARRAY, OPCODE_BE_ARRAYLENGTH, OPCODE_BF_ATHROW, OPCODE_C0_CHECKCAST, OPCODE_C1_INSTANCEOF, OPCODE_C2_MONITORENTER, OPCODE_C3_MONITOREXIT, OPCODE_C4_WIDE, OPCODE_C5_MULTIANEWARRAY, OPCODE_C6_IFNULL, OPCODE_C7_IFNONNULL, OPCODE_C8_GOTO_W, OPCODE_C9_JSR_W, OPCODE_CA_BREAKPOINT, OPCODE_CB_UNUSED, OPCODE_CC_UNUSED, OPCODE_CD_UNUSED, OPCODE_CE_UNUSED, OPCODE_CF_UNUSED, OPCODE_D0_UNUSED, OPCODE_D1_UNUSED, OPCODE_D2_UNUSED, OPCODE_D3_UNUSED, OPCODE_D4_UNUSED, OPCODE_D5_UNUSED, OPCODE_D6_UNUSED, OPCODE_D7_UNUSED, OPCODE_D8_UNUSED, OPCODE_D9_UNUSED, OPCODE_DA_UNUSED, OPCODE_DB_UNUSED, OPCODE_DC_UNUSED, OPCODE_DD_UNUSED, OPCODE_DE_UNUSED, OPCODE_DF_UNUSED, OPCODE_E0_UNUSED, OPCODE_E1_UNUSED, OPCODE_E2_UNUSED, OPCODE_E3_UNUSED, OPCODE_E4_UNUSED, OPCODE_E5_UNUSED, OPCODE_E6_UNUSED, OPCODE_E7_UNUSED, OPCODE_E8_UNUSED, OPCODE_E9_UNUSED, OPCODE_EA_UNUSED, OPCODE_EB_UNUSED, OPCODE_EC_UNUSED, OPCODE_ED_UNUSED, OPCODE_EE_UNUSED, OPCODE_EF_UNUSED, opcode_end_thread_setup(), opcode_end_thread_test(), OPCODE_F0_UNUSED, OPCODE_F1_UNUSED, OPCODE_F2_UNUSED, OPCODE_F3_UNUSED, OPCODE_F4_UNUSED, OPCODE_F5_UNUSED, OPCODE_F6_UNUSED, OPCODE_F7_UNUSED, OPCODE_F8_UNUSED, OPCODE_F9_UNUSED, OPCODE_FA_UNUSED, OPCODE_FB_UNUSED, OPCODE_FC_UNUSED, OPCODE_FD_UNUSED, OPCODE_FE_IMPDEP1, OPCODE_FF_IMPDEP2, opcode_load_run_throwable(), opcode_run(), pjvm, POP, POP_FRAME, PTR_THIS_CP_Class, PTR_THIS_CP_NameAndType, PTR_THIS_CP_Utf8, PUSH, PUSH_FRAME, PUT_PC_IMMEDIATE, PUTSTATIC, rfalse, rnull, rtrue, STUB, sysErrMsg(), ClassFile::this_class, THIS_PC, THIS_PCFS, THREAD, thread_exception_setup(), THREAD_REQUEST_NEXT_STATE, THREAD_STATE_COMPLETE, thread_state_get_name(), THREAD_STATE_RUNNING, THREAD_STATUS_EMPTY, THREAD_STATUS_THREW_ERROR, THREAD_STATUS_THREW_EXCEPTION, THREAD_STATUS_THREW_THROWABLE, THREAD_STATUS_THREW_UNCAUGHT, thread_throw_exception(), threadstate_request_complete(), rjvm::timeslice_expired, utf_prchar_classname_strcmp(), and utf_utf2prchar().

Referenced by object_run_method(), and opcode_run().


Variable Documentation

char* opcode_c_copyright = "\0" "$URL: https://svn.apache.org/path/name/opcode.c $ $Id: opcode.c 0 09/28/2005 dlydick $" " " "Copyright 2005 The Apache Software Foundation or its licensors, as applicable." [static]
 

Definition at line 189 of file opcode.c.

jmp_buf opcode_end_thread_return [static]
 

Handler linkage for end of thread detection.

Definition at line 1249 of file opcode.c.

rboolean opcode_calling_java_lang_linkageerror
 

Initial value:

     ((rboolean) 0)
Double-fault error state variable for throwable event. Permit boolean "false" manifest constant for initializing static and global storage.

This boolean reports the the error-within-an-error state condition within opcode_load_run_throwable() opcode_load_run_throwable()

Definition at line 1348 of file opcode.c.

Referenced by opcode_load_run_throwable().


Generated on Fri Sep 30 18:50:18 2005 by  doxygen 1.4.4