home *** CD-ROM | disk | FTP | other *** search
- /*
- * @(#)reflect.h 1.23 97/01/03
- *
- * Copyright (c) 1995, 1996 Sun Microsystems, Inc. All Rights Reserved.
- *
- * This software is the confidential and proprietary information of Sun
- * Microsystems, Inc. ("Confidential Information"). You shall not
- * disclose such Confidential Information and shall use it only in
- * accordance with the terms of the license agreement you entered into
- * with Sun.
- *
- * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
- * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
- * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
- * THIS SOFTWARE OR ITS DERIVATIVES.
- *
- * CopyrightVersion 1.1_beta
- *
- */
-
- #ifndef _REFLECT_H
- #define _REFLECT_H
-
- #include "oobj.h"
- #include "native.h"
-
- /*
- * Keep consistent with constants in java.lang.reflect.Member
- */
- enum { MEMBER_PUBLIC, MEMBER_DECLARED };
-
- extern HObject * reflect_field(ClassClass *, char *, long);
- extern HArrayOfObject * reflect_fields(ClassClass *, long);
-
- extern HObject * reflect_method(ClassClass *, char *, HArrayOfObject *,
- long);
- extern HArrayOfObject * reflect_methods(ClassClass *, long);
-
- extern HObject * reflect_constructor(ClassClass *, HArrayOfObject *,
- long);
- extern HArrayOfObject * reflect_constructors(ClassClass *, long);
-
- extern ClassClass * reflect_find_class(char *, ClassClass *, char **);
- extern bool_t reflect_check_access(ExecEnv *, ClassClass *, int,
- ClassClass *);
- extern HObject * reflect_new_array(ClassClass *, int);
- extern HArrayOfObject * reflect_new_class_array(int);
- extern bool_t reflect_is_assignable(ClassClass *, ClassClass *,
- ExecEnv *);
-
- /*
- * Implementation
- */
-
- #ifdef _REFLECT_IMPL
-
- /*
- * "Generic" accessors for Field, Method, Constructor
- */
- #define member_class(h) (unhand(h)->clazz)
- #define member_slot(h) (unhand(h)->slot)
- #define member_name(h) (unhand(h)->name)
- #define member_type(h) (unhand(h)->type)
- #define member_returnType(h) (unhand(h)->returnType)
- #define member_parameterTypes(h)(unhand(h)->parameterTypes)
- #define member_exceptionTypes(h)(unhand(h)->exceptionTypes)
-
-
- #define REFLECT_GET(p, pCode, v, packed) \
- if (TRUE) \
- { \
- switch (pCode) { \
- case T_BOOLEAN: \
- case T_BYTE: \
- if (packed) { v.i = *(char *) (p); break; } \
- case T_CHAR: \
- if (packed) { v.i = *(unicode *) (p); break; } \
- case T_SHORT: \
- if (packed) { v.i = *(short *) (p); break; } \
- case T_INT: \
- v.i = *(long *) (p); break; \
- case T_FLOAT: \
- v.f = *(float *) (p); break; \
- case T_LONG: \
- v.l = GET_INT64(v, p); break; \
- case T_DOUBLE: \
- v.d = GET_DOUBLE(v, p); break; \
- default: \
- v.h = *(HObject **) (p); \
- } \
- } else
-
- #define REFLECT_SET(p, pCode, v, packed) \
- if (TRUE) \
- { \
- switch (pCode) { \
- case T_BOOLEAN: \
- case T_BYTE: \
- if (packed) { *(char *) (p) = v.i; break; } \
- case T_CHAR: \
- if (packed) { *(unicode *) (p) = v.i; break; } \
- case T_SHORT: \
- if (packed) { *(short *) (p) = v.i; break; } \
- case T_INT: \
- *(long *) (p) = v.i ; break; \
- case T_FLOAT: \
- *(float *) (p) = v.f; break; \
- case T_LONG: \
- SET_INT64(v, p, v.l); break; \
- case T_DOUBLE: \
- SET_DOUBLE(v, p, v.d); break; \
- default: \
- *(HObject **) (p) = v.h; \
- } \
- } else
-
- #define REFLECT_WIDEN(v, vCode, wCode, fail) \
- if (TRUE) \
- { \
- switch(wCode) { \
- case T_BOOLEAN: \
- case T_BYTE: \
- case T_CHAR: \
- goto fail; \
- case T_SHORT: \
- switch (vCode) { \
- case T_BYTE: \
- break; \
- default: \
- goto fail; \
- } \
- break; \
- case T_INT: \
- switch (vCode) { \
- case T_BYTE: \
- case T_CHAR: \
- case T_SHORT: \
- break; \
- default: \
- goto fail; \
- } \
- break; \
- case T_LONG: \
- switch (vCode) { \
- case T_BYTE: \
- case T_CHAR: \
- case T_SHORT: \
- case T_INT: \
- v.l = int2ll(v.i); break; \
- default: \
- goto fail; \
- } \
- break; \
- case T_FLOAT: \
- switch (vCode) { \
- case T_BYTE: \
- case T_CHAR: \
- case T_SHORT: \
- case T_INT: \
- v.f = (float) v.i; break; \
- case T_LONG: \
- v.f = (float) ll2float(v.l); break; \
- default: \
- goto fail; \
- } \
- break; \
- case T_DOUBLE: \
- switch (vCode) { \
- case T_BYTE: \
- case T_CHAR: \
- case T_SHORT: \
- case T_INT: \
- v.d = (double) v.i; break; \
- case T_FLOAT: \
- v.d = (double) v.f; break; \
- case T_LONG: \
- v.d = (double) ll2double(v.l); break; \
- default: \
- goto fail; \
- } \
- break; \
- default: \
- goto fail; \
- } \
- } else
-
- /*
- *
- */
-
- #define REFLECT_ERROR(nm, det) \
- SignalError(0, JAVAPKG #nm, det)
-
- #define OutOfMemoryError() \
- REFLECT_ERROR(OutOfMemoryError, 0)
-
- #define NullPointerException() \
- REFLECT_ERROR(NullPointerException, 0)
-
- #define InternalError(det) \
- REFLECT_ERROR(InternalError, det)
-
- /*
- *
- */
-
- #define ENSURE_RESOLVED(cb) \
- if (!CCIs(cb, Resolved)) { \
- char *detail = NULL; \
- char *exception = ResolveClass(cb, &detail); \
- if (exception != NULL) { \
- SignalError(0, exception, detail); \
- return NULL; \
- } \
- }
-
- /*
- *
- */
-
- #define fbClass(fb) (fb->clazz)
- #define fbName(fb) (fb->name)
- #define fbSig(fb) (fb->signature)
- #define fbAccess(fb) (fb->access)
- #define fbID(fb) (fb->ID)
- #define fbIsArray(fb) (fbSig(fb)[0] == SIGNATURE_ARRAY)
- #define fbIsClass(fb) (fbSig(fb)[0] == SIGNATURE_CLASS)
- #define fbIsPublic(fb) ((fbAccess(fb) & ACC_PUBLIC) != 0)
- #define fbIsStatic(fb) ((fbAccess(fb) & ACC_STATIC) != 0)
- #define fbIsFinal(fb) ((fbAccess(fb) & ACC_FINAL) != 0)
- #define fbOffset(fb) (fb->u.offset)
-
- #define mbFb(mb) (&mb->fb)
- #define mbClass(mb) (mb->fb.clazz)
- #define mbName(mb) (mb->fb.name)
- #define mbSig(mb) (mb->fb.signature)
- #define mbAccess(mb) (mb->fb.access)
- #define mbOffset(mb) (mb->fb.u.offset)
- #define mbID(mb) (mb->fb.ID)
- #define mbArgsSize(mb) (mb->args_size)
- #define mbIsSpecial(mb) (mbName(mb)[0] == '<')
- #define mbIsPublic(mb) ((mbAccess(mb) & ACC_PUBLIC) != 0)
- #define mbIsStatic(mb) ((mbAccess(mb) & ACC_STATIC) != 0)
-
- #endif /* _REFLECT_IMPL */
-
- #endif /* _REFLECT_H */
-