source: branches/libc-0.6/src/gcc/libjava/include/java-interp.h@ 3951

Last change on this file since 3951 was 1392, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r1391,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 5.5 KB
Line 
1// java-interp.h - Header file for the bytecode interpreter. -*- c++ -*-
2
3/* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation
4
5 This file is part of libgcj.
6
7This software is copyrighted work licensed under the terms of the
8Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
9details. */
10
11#ifndef __JAVA_INTERP_H__
12#define __JAVA_INTERP_H__
13
14#include <jvm.h>
15#include <java-cpool.h>
16#include <gnu/gcj/runtime/NameFinder.h>
17
18#ifdef INTERPRETER
19
20#pragma interface
21
22#include <java/lang/Class.h>
23#include <java/lang/ClassLoader.h>
24#include <java/lang/reflect/Modifier.h>
25#include <gnu/gcj/runtime/StackTrace.h>
26
27extern "C" {
28#include <ffi.h>
29}
30
31extern inline jboolean
32_Jv_IsInterpretedClass (jclass c)
33{
34 return (c->accflags & java::lang::reflect::Modifier::INTERPRETED) != 0;
35}
36
37struct _Jv_ResolvedMethod;
38
39void _Jv_DefineClass (jclass, jbyteArray, jint, jint);
40
41void _Jv_InitField (jobject, jclass, int);
42void * _Jv_AllocMethodInvocation (jsize size);
43int _Jv_count_arguments (_Jv_Utf8Const *signature,
44 jboolean staticp = true);
45void _Jv_VerifyMethod (_Jv_InterpMethod *method);
46
47/* FIXME: this should really be defined in some more generic place */
48#define ROUND(V, A) (((((unsigned) (V))-1) | ((A)-1))+1)
49
50/* the interpreter is written in C++, primarily because it makes it easy for
51 * the entire thing to be "friend" with class Class. */
52
53class _Jv_InterpClass;
54class _Jv_InterpMethod;
55
56// Before a method is "compiled" we store values as the bytecode PC,
57// an int. Afterwards we store them as pointers into the prepared
58// code itself.
59union _Jv_InterpPC
60{
61 int i;
62 void *p;
63};
64
65class _Jv_InterpException
66{
67 _Jv_InterpPC start_pc;
68 _Jv_InterpPC end_pc;
69 _Jv_InterpPC handler_pc;
70 _Jv_InterpPC handler_type;
71
72 friend class _Jv_ClassReader;
73 friend class _Jv_InterpMethod;
74 friend class _Jv_BytecodeVerifier;
75};
76
77// Base class for method representations. Subclasses are interpreted
78// and JNI methods.
79class _Jv_MethodBase
80{
81protected:
82 // The class which defined this method.
83 _Jv_InterpClass *defining_class;
84
85 // The method description.
86 _Jv_Method *self;
87
88 // Size of raw arguments.
89 _Jv_ushort args_raw_size;
90
91public:
92 _Jv_Method *get_method ()
93 {
94 return self;
95 }
96};
97
98class _Jv_InterpMethod : public _Jv_MethodBase
99{
100 _Jv_ushort max_stack;
101 _Jv_ushort max_locals;
102 int code_length;
103
104 _Jv_ushort exc_count;
105
106 void *prepared;
107
108 unsigned char* bytecode ()
109 {
110 return
111 ((unsigned char*)this)
112 + ROUND((sizeof (_Jv_InterpMethod)
113 + exc_count*sizeof (_Jv_InterpException)), 4);
114 }
115
116 _Jv_InterpException * exceptions ()
117 {
118 return (_Jv_InterpException*) (this+1);
119 }
120
121 static size_t size (int exc_count, int code_length)
122 {
123 return
124 ROUND ((sizeof (_Jv_InterpMethod)
125 + (exc_count * sizeof (_Jv_InterpException))), 4)
126 + code_length;
127 }
128
129 // return the method's invocation pointer (a stub).
130 void *ncode ();
131 void compile (const void * const *);
132
133 static void run_normal (ffi_cif*, void*, ffi_raw*, void*);
134 static void run_synch_object (ffi_cif*, void*, ffi_raw*, void*);
135 static void run_synch_class (ffi_cif*, void*, ffi_raw*, void*);
136
137 void run (void*, ffi_raw *);
138
139 public:
140 static void dump_object(jobject o);
141
142 friend class _Jv_ClassReader;
143 friend class _Jv_BytecodeVerifier;
144 friend class gnu::gcj::runtime::NameFinder;
145 friend class gnu::gcj::runtime::StackTrace;
146
147 friend void _Jv_PrepareClass(jclass);
148
149#ifdef JV_MARKOBJ_DECL
150 friend JV_MARKOBJ_DECL;
151#endif
152};
153
154class _Jv_InterpClass : public java::lang::Class
155{
156 _Jv_MethodBase **interpreted_methods;
157 _Jv_ushort *field_initializers;
158
159 friend class _Jv_ClassReader;
160 friend class _Jv_InterpMethod;
161 friend void _Jv_PrepareClass(jclass);
162 friend void _Jv_PrepareMissingMethods (jclass base2, jclass iface_class);
163 friend void _Jv_InitField (jobject, jclass, int);
164#ifdef JV_MARKOBJ_DECL
165 friend JV_MARKOBJ_DECL;
166#endif
167
168 friend _Jv_MethodBase ** _Jv_GetFirstMethod (_Jv_InterpClass *klass);
169};
170
171extern inline _Jv_MethodBase **
172_Jv_GetFirstMethod (_Jv_InterpClass *klass)
173{
174 return klass->interpreted_methods;
175}
176
177struct _Jv_ResolvedMethod {
178 jint stack_item_count;
179 jint vtable_index;
180 jclass klass;
181 _Jv_Method* method;
182
183 // a resolved method holds the cif in-line, so that _Jv_MarkObj just needs
184 // to mark the resolved method to hold on to the cif. Some memory could be
185 // saved by keeping a cache of cif's, since many will be the same.
186 ffi_cif cif;
187 ffi_type * arg_types[0];
188};