Common.h revision 734155efc18543eab20b763f9a315ab1a44240ac
1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16734155efc18543eab20b763f9a315ab1a44240acAndy McFadden 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common defines for all Dalvik code. 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifndef _DALVIK_COMMON 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define _DALVIK_COMMON 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifndef LOG_TAG 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define LOG_TAG "dalvikvm" 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <stdio.h> 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <assert.h> 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if !defined(NDEBUG) && defined(WITH_DALVIK_ASSERT) 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# undef assert 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define assert(x) \ 33734155efc18543eab20b763f9a315ab1a44240acAndy McFadden ((x) ? ((void)0) : (LOGE("ASSERT FAILED (%s:%d): %s\n", \ 34734155efc18543eab20b763f9a315ab1a44240acAndy McFadden __FILE__, __LINE__, #x), *(int*)39=39, 0) ) 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If "very verbose" logging is enabled, make it equivalent to LOGV. 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Otherwise, make it disappear. 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Define this above the #include "Dalvik.h" to enable for only a 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * single file. 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* #define VERY_VERBOSE_LOG */ 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(VERY_VERBOSE_LOG) 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define LOGVV LOGV 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define IF_LOGVV() IF_LOGV() 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define LOGVV(...) ((void)0) 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define IF_LOGVV() if (false) 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * These match the definitions in the VM specification. 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef HAVE_STDINT_H 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# include <stdint.h> /* C99 */ 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef uint8_t u1; 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef uint16_t u2; 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef uint32_t u4; 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef uint64_t u8; 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef int8_t s1; 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef int16_t s2; 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef int32_t s4; 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef int64_t s8; 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef unsigned char u1; 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef unsigned short u2; 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef unsigned int u4; 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef unsigned long long u8; 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef signed char s1; 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef signed short s2; 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef signed int s4; 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef signed long long s8; 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Storage for primitive types and object references. 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Some parts of the code (notably object field access) assume that values 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * are "left aligned", i.e. given "JValue jv", "jv.i" and "*((s4*)&jv)" 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * yield the same result. This seems to be guaranteed by gcc on big- and 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * little-endian systems. 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef union JValue { 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u1 z; 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project s1 b; 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project u2 c; 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project s2 s; 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project s4 i; 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project s8 j; 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project float f; 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project double d; 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project void* l; 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} JValue; 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Some systems might have this in <stdbool.h>. 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifndef __bool_true_false_are_defined 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef enum { false=0, true=!false } bool; 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define __bool_true_false_are_defined 1 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0]))) 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(HAVE_ENDIAN_H) 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# include <endian.h> 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else /*not HAVE_ENDIAN_H*/ 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define __BIG_ENDIAN 4321 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define __LITTLE_ENDIAN 1234 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# if defined(HAVE_LITTLE_ENDIAN) 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define __BYTE_ORDER __LITTLE_ENDIAN 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# else 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define __BYTE_ORDER __BIG_ENDIAN 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# endif 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif /*not HAVE_ENDIAN_H*/ 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Pretend we have the Android logging macros. These are replaced by the 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Android logging implementation. 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define ANDROID_LOG_DEBUG 3 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOGV(...) LOG_PRI(2, 0, __VA_ARGS__) 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOGD(...) LOG_PRI(3, 0, __VA_ARGS__) 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOGI(...) LOG_PRI(4, 0, __VA_ARGS__) 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOGW(...) LOG_PRI(5, 0, __VA_ARGS__) 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOGE(...) LOG_PRI(6, 0, __VA_ARGS__) 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define MIN_LOG_LEVEL 2 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define LOG_PRI(priority, tag, ...) do { \ 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (priority >= MIN_LOG_LEVEL) { \ 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmFprintf(stdout, "%s:%-4d ", __FILE__, __LINE__); \ 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmFprintf(stdout, __VA_ARGS__); \ 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } \ 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } while(0) 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# include "utils/Log.h" 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif /*_DALVIK_COMMON*/ 147