Object.h revision f6c387128427e121477c1b32ad35cdcaa5101ba3
1/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16/*
17 * Declaration of the fundamental Object type and refinements thereof, plus
18 * some functions for manipulating them.
19 */
20#ifndef _DALVIK_OO_OBJECT
21#define _DALVIK_OO_OBJECT
22
23#include <stddef.h>
24
25/* fwd decl */
26struct DataObject;
27struct ClassObject;
28struct StringObject;
29struct ArrayObject;
30struct Method;
31struct ExceptionEntry;
32struct LineNumEntry;
33struct StaticField;
34struct InstField;
35struct Field;
36struct RegisterMap;
37typedef struct DataObject DataObject;
38typedef struct ClassObject ClassObject;
39typedef struct StringObject StringObject;
40typedef struct ArrayObject ArrayObject;
41typedef struct Method Method;
42typedef struct ExceptionEntry ExceptionEntry;
43typedef struct LineNumEntry LineNumEntry;
44typedef struct StaticField StaticField;
45typedef struct InstField InstField;
46typedef struct Field Field;
47typedef struct RegisterMap RegisterMap;
48
49/*
50 * Native function pointer type.
51 *
52 * "args[0]" holds the "this" pointer for virtual methods.
53 *
54 * The "Bridge" form is a super-set of the "Native" form; in many places
55 * they are used interchangeably.  Currently, all functions have all
56 * arguments passed in, but some functions only care about the first two.
57 * Passing extra arguments to a C function is (mostly) harmless.
58 */
59typedef void (*DalvikBridgeFunc)(const u4* args, JValue* pResult,
60    const Method* method, struct Thread* self);
61typedef void (*DalvikNativeFunc)(const u4* args, JValue* pResult);
62
63
64/* vm-internal access flags and related definitions */
65typedef enum AccessFlags {
66    ACC_MIRANDA         = 0x8000,       // method (internal to VM)
67    JAVA_FLAGS_MASK     = 0xffff,       // bits set from Java sources (low 16)
68} AccessFlags;
69
70/* Use the top 16 bits of the access flags field for
71 * other class flags.  Code should use the *CLASS_FLAG*()
72 * macros to set/get these flags.
73 */
74typedef enum ClassFlags {
75    CLASS_ISFINALIZABLE     = (1<<31),  // class/ancestor overrides finalize()
76    CLASS_ISARRAY           = (1<<30),  // class is a "[*"
77    CLASS_ISOBJECTARRAY     = (1<<29),  // class is a "[L*" or "[[*"
78    CLASS_ISREFERENCE       = (1<<28),  // class is a soft/weak/phantom ref
79                                        // only ISREFERENCE is set --> soft
80    CLASS_ISWEAKREFERENCE   = (1<<27),  // class is a weak reference
81    CLASS_ISPHANTOMREFERENCE = (1<<26), // class is a phantom reference
82
83    CLASS_MULTIPLE_DEFS     = (1<<25),  // DEX verifier: defs in multiple DEXs
84
85    /* unlike the others, these can be present in the optimized DEX file */
86    CLASS_ISOPTIMIZED       = (1<<17),  // class may contain opt instrs
87    CLASS_ISPREVERIFIED     = (1<<16),  // class has been pre-verified
88} ClassFlags;
89
90/* bits we can reasonably expect to see set in a DEX access flags field */
91#define EXPECTED_FILE_FLAGS \
92    (ACC_CLASS_MASK | CLASS_ISPREVERIFIED | CLASS_ISOPTIMIZED)
93
94/* current state of the class, increasing as we progress */
95typedef enum ClassStatus {
96    CLASS_ERROR         = -1,
97
98    CLASS_NOTREADY      = 0,
99    CLASS_LOADED        = 1,
100    CLASS_PREPARED      = 2,    /* part of linking */
101    CLASS_RESOLVED      = 3,    /* part of linking */
102    CLASS_VERIFYING     = 4,    /* in the process of being verified */
103    CLASS_VERIFIED      = 5,    /* logically part of linking; done pre-init */
104    CLASS_INITIALIZING  = 6,    /* class init in progress */
105    CLASS_INITIALIZED   = 7,    /* ready to go */
106} ClassStatus;
107
108
109/*
110 * Primitive type identifiers.  We use these values as indexes into an
111 * array of synthesized classes, so these start at zero and count up.
112 * The order is arbitrary (mimics table in doc for newarray opcode),
113 * but can't be changed without shuffling some reflection tables.
114 *
115 * PRIM_VOID can't be used as an array type, but we include it here for
116 * other uses (e.g. Void.TYPE).
117 */
118typedef enum PrimitiveType {
119    PRIM_NOT        = -1,       /* value is not a primitive type */
120    PRIM_BOOLEAN    = 0,
121    PRIM_CHAR       = 1,
122    PRIM_FLOAT      = 2,
123    PRIM_DOUBLE     = 3,
124    PRIM_BYTE       = 4,
125    PRIM_SHORT      = 5,
126    PRIM_INT        = 6,
127    PRIM_LONG       = 7,
128    PRIM_VOID       = 8,
129
130    PRIM_MAX
131} PrimitiveType;
132#define PRIM_TYPE_TO_LETTER "ZCFDBSIJV"     /* must match order in enum */
133
134/*
135 * This defines the amount of space we leave for field slots in the
136 * java.lang.Class definition.  If we alter the class to have more than
137 * this many fields, the VM will abort at startup.
138 */
139#define CLASS_FIELD_SLOTS   4
140
141
142/*
143 * Used for iftable in ClassObject.
144 */
145typedef struct InterfaceEntry {
146    /* pointer to interface class */
147    ClassObject*    clazz;
148
149    /*
150     * Index into array of vtable offsets.  This points into the ifviPool,
151     * which holds the vtables for all interfaces declared by this class.
152     */
153    int*            methodIndexArray;
154} InterfaceEntry;
155
156
157
158/*
159 * There are three types of objects:
160 *  Class objects - an instance of java.lang.Class
161 *  Array objects - an object created with a "new array" instruction
162 *  Data objects - an object that is neither of the above
163 *
164 * We also define String objects.  At present they're equivalent to
165 * DataObject, but that may change.  (Either way, they make some of the
166 * code more obvious.)
167 *
168 * All objects have an Object header followed by type-specific data.
169 */
170typedef struct Object {
171    /* ptr to class object */
172    ClassObject*    clazz;
173
174    /* thin lock or "fat" monitor */
175    Lock            lock;
176} Object;
177
178/*
179 * Properly initialize an Object.
180 * void DVM_OBJECT_INIT(Object *obj, ClassObject *clazz_)
181 */
182#define DVM_OBJECT_INIT(obj, clazz_) \
183    do { (obj)->clazz = (clazz_); DVM_LOCK_INIT(&(obj)->lock); } while (0)
184
185/*
186 * Get/set class flags.
187 */
188#define SET_CLASS_FLAG(clazz, flag) \
189    do { (clazz)->accessFlags |= (flag); } while (0)
190
191#define CLEAR_CLASS_FLAG(clazz, flag) \
192    do { (clazz)->accessFlags &= ~(flag); } while (0)
193
194#define IS_CLASS_FLAG_SET(clazz, flag) \
195    (((clazz)->accessFlags & (flag)) != 0)
196
197#define GET_CLASS_FLAG_GROUP(clazz, flags) \
198    ((u4)((clazz)->accessFlags & (flags)))
199
200/*
201 * Data objects have an Object header followed by their instance data.
202 */
203struct DataObject {
204    Object          obj;                /* MUST be first item */
205
206    /* variable #of u4 slots; u8 uses 2 slots */
207    u4              instanceData[1];
208};
209
210/*
211 * Strings are used frequently enough that we may want to give them their
212 * own unique type.
213 *
214 * Using a dedicated type object to access the instance data provides a
215 * performance advantage but makes the java/lang/String.java implementation
216 * fragile.
217 *
218 * Currently this is just equal to DataObject, and we pull the fields out
219 * like we do for any other object.
220 */
221struct StringObject {
222    Object          obj;                /* MUST be first item */
223
224    /* variable #of u4 slots; u8 uses 2 slots */
225    u4              instanceData[1];
226};
227
228
229/*
230 * Array objects have these additional fields.
231 *
232 * We don't currently store the size of each element.  Usually it's implied
233 * by the instruction.  If necessary, the width can be derived from
234 * the first char of obj->clazz->name.
235 */
236struct ArrayObject {
237    Object          obj;                /* MUST be first item */
238
239    /* number of elements; immutable after init */
240    u4              length;
241
242    /*
243     * Array contents; actual size is (length * sizeof(type)).  This is
244     * declared as u8 so that the compiler inserts any necessary padding
245     * (e.g. for EABI); the actual allocation may be smaller than 8 bytes.
246     */
247    u8              contents[1];
248};
249
250/*
251 * Class objects have many additional fields.  This is used for both
252 * classes and interfaces, including synthesized classes (arrays and
253 * primitive types).
254 *
255 * Class objects are unusual in that they have some fields allocated with
256 * the system malloc (or LinearAlloc), rather than on the GC heap.  This is
257 * handy during initialization, but does require special handling when
258 * discarding java.lang.Class objects.
259 *
260 * The separation of methods (direct vs. virtual) and fields (class vs.
261 * instance) used in Dalvik works out pretty well.  The only time it's
262 * annoying is when enumerating or searching for things with reflection.
263 */
264struct ClassObject {
265    Object          obj;                /* MUST be first item */
266
267    /* leave space for instance data; we could access fields directly if we
268       freeze the definition of java/lang/Class */
269    u4              instanceData[CLASS_FIELD_SLOTS];
270
271    /* UTF-8 descriptor for the class; from constant pool, or on heap
272       if generated ("[C") */
273    const char*     descriptor;
274    char*           descriptorAlloc;
275
276    /* access flags; low 16 bits are defined by VM spec */
277    u4              accessFlags;
278
279    /* VM-unique class serial number, nonzero, set very early */
280    u4              serialNumber;
281
282    /* DexFile from which we came; needed to resolve constant pool entries */
283    /* (will be NULL for VM-generated, e.g. arrays and primitive classes) */
284    DvmDex*         pDvmDex;
285
286    /* state of class initialization */
287    ClassStatus     status;
288
289    /* if class verify fails, we must return same error on subsequent tries */
290    ClassObject*    verifyErrorClass;
291
292    /* threadId, used to check for recursive <clinit> invocation */
293    u4              initThreadId;
294
295    /*
296     * Total object size; used when allocating storage on gc heap.  (For
297     * interfaces and abstract classes this will be zero.)
298     */
299    size_t          objectSize;
300
301    /* arrays only: class object for base element, for instanceof/checkcast
302       (for String[][][], this will be String) */
303    ClassObject*    elementClass;
304
305    /* class object representing an array of this class; set on first use */
306    ClassObject*    arrayClass;
307
308    /* arrays only: number of dimensions, e.g. int[][] is 2 */
309    int             arrayDim;
310
311    /* primitive type index, or PRIM_NOT (-1); set for generated prim classes */
312    PrimitiveType   primitiveType;
313
314    /* superclass, or NULL if this is java.lang.Object */
315    ClassObject*    super;
316
317    /* defining class loader, or NULL for the "bootstrap" system loader */
318    Object*         classLoader;
319
320    /* initiating class loader list */
321    Object**        initiatingLoaders;
322    int             initiatingLoaderCount;
323
324    /* array of interfaces this class implements directly */
325    int             interfaceCount;
326    ClassObject**   interfaces;
327
328    /* static, private, and <init> methods */
329    int             directMethodCount;
330    Method*         directMethods;
331
332    /* virtual methods defined in this class; invoked through vtable */
333    int             virtualMethodCount;
334    Method*         virtualMethods;
335
336    /*
337     * Virtual method table (vtable), for use by "invoke-virtual".  The
338     * vtable from the superclass is copied in, and virtual methods from
339     * our class either replace those from the super or are appended.
340     */
341    int             vtableCount;
342    Method**        vtable;
343
344    /*
345     * Interface table (iftable), one entry per interface supported by
346     * this class.  That means one entry for each interface we support
347     * directly, indirectly via superclass, or indirectly via
348     * superinterface.  This will be null if neither we nor our superclass
349     * implement any interfaces.
350     *
351     * Why we need this: given "class Foo implements Face", declare
352     * "Face faceObj = new Foo()".  Invoke faceObj.blah(), where "blah" is
353     * part of the Face interface.  We can't easily use a single vtable.
354     *
355     * For every interface a concrete class implements, we create a list of
356     * virtualMethod indices for the methods in the interface.
357     */
358    int             iftableCount;
359    InterfaceEntry* iftable;
360
361    /*
362     * The interface vtable indices for iftable get stored here.  By placing
363     * them all in a single pool for each class that implements interfaces,
364     * we decrease the number of allocations.
365     */
366    int             ifviPoolCount;
367    int*            ifviPool;
368
369    /* static fields */
370    int             sfieldCount;
371    StaticField*    sfields;
372
373    /* instance fields
374     *
375     * These describe the layout of the contents of a DataObject-compatible
376     * Object.  Note that only the fields directly defined by this class
377     * are listed in ifields;  fields defined by a superclass are listed
378     * in the superclass's ClassObject.ifields.
379     *
380     * All instance fields that refer to objects are guaranteed to be
381     * at the beginning of the field list.  ifieldRefCount specifies
382     * the number of reference fields.
383     */
384    int             ifieldCount;
385    int             ifieldRefCount; // number of fields that are object refs
386    InstField*      ifields;
387
388    /* source file name, if known */
389    const char*     sourceFile;
390};
391
392/*
393 * A method.  We create one of these for every method in every class
394 * we load, so try to keep the size to a minimum.
395 *
396 * Much of this comes from and could be accessed in the data held in shared
397 * memory.  We hold it all together here for speed.  Everything but the
398 * pointers could be held in a shared table generated by the optimizer;
399 * if we're willing to convert them to offsets and take the performance
400 * hit (e.g. "meth->insns" becomes "baseAddr + meth->insnsOffset") we
401 * could move everything but "nativeFunc".
402 */
403struct Method {
404    /* the class we are a part of */
405    ClassObject*    clazz;
406
407    /* access flags; low 16 bits are defined by spec (could be u2?) */
408    u4              accessFlags;
409
410    /*
411     * For concrete virtual methods, this is the offset of the method
412     * in "vtable".
413     *
414     * For abstract methods in an interface class, this is the offset
415     * of the method in "iftable[n]->methodIndexArray".
416     */
417    u2             methodIndex;
418
419    /*
420     * Method bounds; not needed for an abstract method.
421     *
422     * For a native method, we compute the size of the argument list, and
423     * set "insSize" and "registerSize" equal to it.
424     */
425    u2              registersSize;  /* ins + locals */
426    u2              outsSize;
427    u2              insSize;
428
429    /* method name, e.g. "<init>" or "eatLunch" */
430    const char*     name;
431
432    /*
433     * Method prototype descriptor string (return and argument types).
434     *
435     * TODO: This currently must specify the DexFile as well as the proto_ids
436     * index, because generated Proxy classes don't have a DexFile.  We can
437     * remove the DexFile* and reduce the size of this struct if we generate
438     * a DEX for proxies.
439     */
440    DexProto        prototype;
441
442    /* short-form method descriptor string */
443    const char*     shorty;
444
445    /*
446     * The remaining items are not used for abstract or native methods.
447     * (JNI is currently hijacking "insns" as a function pointer, set
448     * after the first call.  For internal-native this stays null.)
449     */
450
451    /* the actual code */
452    const u2*       insns;          /* instructions, in memory-mapped .dex */
453
454    /* cached JNI argument and return-type hints */
455    int             jniArgInfo;
456
457    /*
458     * Native method ptr; could be actual function or a JNI bridge.  We
459     * don't currently discriminate between DalvikBridgeFunc and
460     * DalvikNativeFunc; the former takes an argument superset (i.e. two
461     * extra args) which will be ignored.  If necessary we can use
462     * insns==NULL to detect JNI bridge vs. internal native.
463     */
464    DalvikBridgeFunc nativeFunc;
465
466    /*
467     * Register map data, if available.  This will point into the DEX file
468     * if the data was computed during pre-verification, or into the
469     * linear alloc area if not.
470     */
471    const RegisterMap* registerMap;
472
473#ifdef WITH_PROFILER
474    bool            inProfile;
475#endif
476#ifdef WITH_DEBUGGER
477    short           debugBreakpointCount;
478#endif
479};
480
481/*
482 * Generic field header.  We pass this around when we want a generic Field
483 * pointer (e.g. for reflection stuff).  Testing the accessFlags for
484 * ACC_STATIC allows a proper up-cast.
485 */
486struct Field {
487    ClassObject*    clazz;          /* class in which the field is declared */
488    const char*     name;
489    const char*     signature;      /* e.g. "I", "[C", "Landroid/os/Debug;" */
490    u4              accessFlags;
491#ifdef PROFILE_FIELD_ACCESS
492    u4              gets;
493    u4              puts;
494#endif
495};
496
497/*
498 * Static field.
499 */
500struct StaticField {
501    Field           field;          /* MUST be first item */
502    JValue          value;          /* initially set from DEX for primitives */
503};
504
505/*
506 * Instance field.
507 */
508struct InstField {
509    Field           field;          /* MUST be first item */
510
511    /*
512     * This field indicates the byte offset from the beginning of the
513     * (Object *) to the actual instance data; e.g., byteOffset==0 is
514     * the same as the object pointer (bug!), and byteOffset==4 is 4
515     * bytes farther.
516     */
517    int             byteOffset;
518};
519
520
521/*
522 * Find a method within a class.  The superclass is not searched.
523 */
524Method* dvmFindDirectMethodByDescriptor(const ClassObject* clazz,
525    const char* methodName, const char* signature);
526Method* dvmFindVirtualMethodByDescriptor(const ClassObject* clazz,
527    const char* methodName, const char* signature);
528Method* dvmFindVirtualMethodByName(const ClassObject* clazz,
529    const char* methodName);
530Method* dvmFindDirectMethod(const ClassObject* clazz, const char* methodName,
531    const DexProto* proto);
532Method* dvmFindVirtualMethod(const ClassObject* clazz, const char* methodName,
533    const DexProto* proto);
534
535
536/*
537 * Find a method within a class hierarchy.
538 */
539Method* dvmFindDirectMethodHierByDescriptor(const ClassObject* clazz,
540    const char* methodName, const char* descriptor);
541Method* dvmFindVirtualMethodHierByDescriptor(const ClassObject* clazz,
542    const char* methodName, const char* signature);
543Method* dvmFindDirectMethodHier(const ClassObject* clazz,
544    const char* methodName, const DexProto* proto);
545Method* dvmFindVirtualMethodHier(const ClassObject* clazz,
546    const char* methodName, const DexProto* proto);
547
548/*
549 * Find the implementation of "meth" in "clazz".
550 *
551 * Returns NULL and throws an exception if not found.
552 */
553const Method* dvmGetVirtualizedMethod(const ClassObject* clazz,
554    const Method* meth);
555
556/*
557 * Get the source file associated with a method.
558 */
559const char* dvmGetMethodSourceFile(const Method* meth);
560
561/*
562 * Find a field within a class.  The superclass is not searched.
563 */
564InstField* dvmFindInstanceField(const ClassObject* clazz,
565    const char* fieldName, const char* signature);
566StaticField* dvmFindStaticField(const ClassObject* clazz,
567    const char* fieldName, const char* signature);
568
569/*
570 * Find a field in a class/interface hierarchy.
571 */
572InstField* dvmFindInstanceFieldHier(const ClassObject* clazz,
573    const char* fieldName, const char* signature);
574StaticField* dvmFindStaticFieldHier(const ClassObject* clazz,
575    const char* fieldName, const char* signature);
576
577/*
578 * Find a field and return the byte offset from the object pointer.  Only
579 * searches the specified class, not the superclass.
580 *
581 * Returns -1 on failure.
582 */
583INLINE int dvmFindFieldOffset(const ClassObject* clazz,
584    const char* fieldName, const char* signature)
585{
586    InstField* pField = dvmFindInstanceField(clazz, fieldName, signature);
587    if (pField == NULL)
588        return -1;
589    else
590        return pField->byteOffset;
591}
592
593/*
594 * Field access functions.  Pass in the word offset from Field->byteOffset.
595 *
596 * We guarantee that long/double field data is 64-bit aligned, so it's safe
597 * to access them with ldrd/strd on ARM.
598 *
599 * The VM treats all fields as 32 or 64 bits, so the field set functions
600 * write 32 bits even if the underlying type is smaller.
601 */
602#define BYTE_OFFSET(_ptr, _offset)  ((void*) (((u1*)(_ptr)) + (_offset)))
603
604INLINE JValue* dvmFieldPtr(const Object* obj, int offset) {
605    return ((JValue*)BYTE_OFFSET(obj, offset));
606}
607
608INLINE bool dvmGetFieldBoolean(const Object* obj, int offset) {
609    return ((JValue*)BYTE_OFFSET(obj, offset))->z;
610}
611INLINE s1 dvmGetFieldByte(const Object* obj, int offset) {
612    return ((JValue*)BYTE_OFFSET(obj, offset))->b;
613}
614INLINE s2 dvmGetFieldShort(const Object* obj, int offset) {
615    return ((JValue*)BYTE_OFFSET(obj, offset))->s;
616}
617INLINE u2 dvmGetFieldChar(const Object* obj, int offset) {
618    return ((JValue*)BYTE_OFFSET(obj, offset))->c;
619}
620INLINE s4 dvmGetFieldInt(const Object* obj, int offset) {
621    return ((JValue*)BYTE_OFFSET(obj, offset))->i;
622}
623INLINE s8 dvmGetFieldLong(const Object* obj, int offset) {
624    return ((JValue*)BYTE_OFFSET(obj, offset))->j;
625}
626INLINE float dvmGetFieldFloat(const Object* obj, int offset) {
627    return ((JValue*)BYTE_OFFSET(obj, offset))->f;
628}
629INLINE double dvmGetFieldDouble(const Object* obj, int offset) {
630    return ((JValue*)BYTE_OFFSET(obj, offset))->d;
631}
632INLINE Object* dvmGetFieldObject(const Object* obj, int offset) {
633    return ((JValue*)BYTE_OFFSET(obj, offset))->l;
634}
635
636INLINE void dvmSetFieldBoolean(Object* obj, int offset, bool val) {
637    ((JValue*)BYTE_OFFSET(obj, offset))->i = val;
638}
639INLINE void dvmSetFieldByte(Object* obj, int offset, s1 val) {
640    ((JValue*)BYTE_OFFSET(obj, offset))->i = val;
641}
642INLINE void dvmSetFieldShort(Object* obj, int offset, s2 val) {
643    ((JValue*)BYTE_OFFSET(obj, offset))->i = val;
644}
645INLINE void dvmSetFieldChar(Object* obj, int offset, u2 val) {
646    ((JValue*)BYTE_OFFSET(obj, offset))->i = val;
647}
648INLINE void dvmSetFieldInt(Object* obj, int offset, s4 val) {
649    ((JValue*)BYTE_OFFSET(obj, offset))->i = val;
650}
651INLINE void dvmSetFieldLong(Object* obj, int offset, s8 val) {
652    ((JValue*)BYTE_OFFSET(obj, offset))->j = val;
653}
654INLINE void dvmSetFieldFloat(Object* obj, int offset, float val) {
655    ((JValue*)BYTE_OFFSET(obj, offset))->f = val;
656}
657INLINE void dvmSetFieldDouble(Object* obj, int offset, double val) {
658    ((JValue*)BYTE_OFFSET(obj, offset))->d = val;
659}
660INLINE void dvmSetFieldObject(Object* obj, int offset, Object* val) {
661    ((JValue*)BYTE_OFFSET(obj, offset))->l = val;
662}
663
664/*
665 * Static field access functions.
666 */
667INLINE JValue* dvmStaticFieldPtr(const StaticField* sfield) {
668    return (JValue*)&sfield->value;
669}
670
671INLINE bool dvmGetStaticFieldBoolean(const StaticField* sfield) {
672    return sfield->value.z;
673}
674INLINE s1 dvmGetStaticFieldByte(const StaticField* sfield) {
675    return sfield->value.b;
676}
677INLINE s2 dvmGetStaticFieldShort(const StaticField* sfield) {
678    return sfield->value.s;
679}
680INLINE u2 dvmGetStaticFieldChar(const StaticField* sfield) {
681    return sfield->value.c;
682}
683INLINE s4 dvmGetStaticFieldInt(const StaticField* sfield) {
684    return sfield->value.i;
685}
686INLINE s8 dvmGetStaticFieldLong(const StaticField* sfield) {
687    return sfield->value.j;
688}
689INLINE float dvmGetStaticFieldFloat(const StaticField* sfield) {
690    return sfield->value.f;
691}
692INLINE double dvmGetStaticFieldDouble(const StaticField* sfield) {
693    return sfield->value.d;
694}
695INLINE Object* dvmGetStaticFieldObject(const StaticField* sfield) {
696    return sfield->value.l;
697}
698
699INLINE void dvmSetStaticFieldBoolean(StaticField* sfield, bool val) {
700    sfield->value.i = val;
701}
702INLINE void dvmSetStaticFieldByte(StaticField* sfield, s1 val) {
703    sfield->value.i = val;
704}
705INLINE void dvmSetStaticFieldShort(StaticField* sfield, s2 val) {
706    sfield->value.i = val;
707}
708INLINE void dvmSetStaticFieldChar(StaticField* sfield, u2 val) {
709    sfield->value.i = val;
710}
711INLINE void dvmSetStaticFieldInt(StaticField* sfield, s4 val) {
712    sfield->value.i = val;
713}
714INLINE void dvmSetStaticFieldLong(StaticField* sfield, s8 val) {
715    sfield->value.j = val;
716}
717INLINE void dvmSetStaticFieldFloat(StaticField* sfield, float val) {
718    sfield->value.f = val;
719}
720INLINE void dvmSetStaticFieldDouble(StaticField* sfield, double val) {
721    sfield->value.d = val;
722}
723INLINE void dvmSetStaticFieldObject(StaticField* sfield, Object* val) {
724    sfield->value.l = val;
725}
726
727/*
728 * Helpers.
729 */
730INLINE bool dvmIsPublicMethod(const Method* method) {
731    return (method->accessFlags & ACC_PUBLIC) != 0;
732}
733INLINE bool dvmIsPrivateMethod(const Method* method) {
734    return (method->accessFlags & ACC_PRIVATE) != 0;
735}
736INLINE bool dvmIsStaticMethod(const Method* method) {
737    return (method->accessFlags & ACC_STATIC) != 0;
738}
739INLINE bool dvmIsSynchronizedMethod(const Method* method) {
740    return (method->accessFlags & ACC_SYNCHRONIZED) != 0;
741}
742INLINE bool dvmIsDeclaredSynchronizedMethod(const Method* method) {
743    return (method->accessFlags & ACC_DECLARED_SYNCHRONIZED) != 0;
744}
745INLINE bool dvmIsFinalMethod(const Method* method) {
746    return (method->accessFlags & ACC_FINAL) != 0;
747}
748INLINE bool dvmIsNativeMethod(const Method* method) {
749    return (method->accessFlags & ACC_NATIVE) != 0;
750}
751INLINE bool dvmIsAbstractMethod(const Method* method) {
752    return (method->accessFlags & ACC_ABSTRACT) != 0;
753}
754INLINE bool dvmIsMirandaMethod(const Method* method) {
755    return (method->accessFlags & ACC_MIRANDA) != 0;
756}
757INLINE bool dvmIsConstructorMethod(const Method* method) {
758    return *method->name == '<';
759}
760/* Dalvik puts private, static, and constructors into non-virtual table */
761INLINE bool dvmIsDirectMethod(const Method* method) {
762    return dvmIsPrivateMethod(method) ||
763           dvmIsStaticMethod(method) ||
764           dvmIsConstructorMethod(method);
765}
766/* Get whether the given method has associated bytecode. This is the
767 * case for methods which are neither native nor abstract. */
768INLINE bool dvmIsBytecodeMethod(const Method* method) {
769    return (method->accessFlags & (ACC_NATIVE | ACC_ABSTRACT)) == 0;
770}
771
772INLINE bool dvmIsProtectedField(const Field* field) {
773    return (field->accessFlags & ACC_PROTECTED) != 0;
774}
775INLINE bool dvmIsStaticField(const Field* field) {
776    return (field->accessFlags & ACC_STATIC) != 0;
777}
778INLINE bool dvmIsFinalField(const Field* field) {
779    return (field->accessFlags & ACC_FINAL) != 0;
780}
781
782INLINE bool dvmIsInterfaceClass(const ClassObject* clazz) {
783    return (clazz->accessFlags & ACC_INTERFACE) != 0;
784}
785INLINE bool dvmIsPublicClass(const ClassObject* clazz) {
786    return (clazz->accessFlags & ACC_PUBLIC) != 0;
787}
788INLINE bool dvmIsFinalClass(const ClassObject* clazz) {
789    return (clazz->accessFlags & ACC_FINAL) != 0;
790}
791INLINE bool dvmIsAbstractClass(const ClassObject* clazz) {
792    return (clazz->accessFlags & ACC_ABSTRACT) != 0;
793}
794INLINE bool dvmIsAnnotationClass(const ClassObject* clazz) {
795    return (clazz->accessFlags & ACC_ANNOTATION) != 0;
796}
797INLINE bool dvmIsPrimitiveClass(const ClassObject* clazz) {
798    return clazz->primitiveType != PRIM_NOT;
799}
800
801/* linked, here meaning prepared and resolved */
802INLINE bool dvmIsClassLinked(const ClassObject* clazz) {
803    return clazz->status >= CLASS_RESOLVED;
804}
805/* has class been verified? */
806INLINE bool dvmIsClassVerified(const ClassObject* clazz) {
807    return clazz->status >= CLASS_VERIFIED;
808}
809
810/*
811 * Get the associated code struct for a method. This returns NULL
812 * for non-bytecode methods.
813 */
814INLINE const DexCode* dvmGetMethodCode(const Method* meth) {
815    if (dvmIsBytecodeMethod(meth)) {
816        /*
817         * The insns field for a bytecode method actually points at
818         * &(DexCode.insns), so we can subtract back to get at the
819         * DexCode in front.
820         */
821        return (const DexCode*)
822            (((const u1*) meth->insns) - offsetof(DexCode, insns));
823    } else {
824        return NULL;
825    }
826}
827
828/*
829 * Get the size of the insns associated with a method. This returns 0
830 * for non-bytecode methods.
831 */
832INLINE u4 dvmGetMethodInsnsSize(const Method* meth) {
833    const DexCode* pCode = dvmGetMethodCode(meth);
834    return (pCode == NULL) ? 0 : pCode->insnsSize;
835}
836
837/* debugging */
838void dvmDumpObject(const Object* obj);
839
840#endif /*_DALVIK_OO_OBJECT*/
841