00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "incls/_precompiled.incl"
00025 #include "incls/_debug.cpp.incl"
00026
00027
00028
00029
00030 #define MATERIALIZE_BOOLEAN_FLAG(name,value,doc) \
00031 bool name = value;
00032
00033 APPLY_TO_BOOLEAN_FLAGS(MATERIALIZE_BOOLEAN_FLAG,MATERIALIZE_BOOLEAN_FLAG)
00034
00035
00036
00037
00038 #define MATERIALIZE_INTEGER_FLAG(name,value,doc) \
00039 int name = value;
00040
00041 APPLY_TO_INTEGER_FLAGS(MATERIALIZE_INTEGER_FLAG,MATERIALIZE_INTEGER_FLAG)
00042
00043
00044
00045
00046 struct boolFlag {
00047 char* name;
00048 bool* value_ptr;
00049 bool default_value;
00050 char* doc;
00051 };
00052
00053
00054 #ifdef PRODUCT
00055 #define MATERIALIZE_BOOLEAN_FLAG_STRUCT_FOR_DEVELOP(name,value,doc) \
00056 // do nothing - flag doesn't show up in table in product version
00057 #else
00058 #define MATERIALIZE_BOOLEAN_FLAG_STRUCT_FOR_DEVELOP(name,value,doc) \
00059 { XSTR(name), &name, value, doc },
00060 #endif
00061
00062 #define MATERIALIZE_BOOLEAN_FLAG_STRUCT_FOR_PRODUCT(name,value,doc) \
00063 { XSTR(name), &name, value, doc },
00064
00065 static boolFlag boolTable[] = {
00066 APPLY_TO_BOOLEAN_FLAGS(MATERIALIZE_BOOLEAN_FLAG_STRUCT_FOR_DEVELOP,MATERIALIZE_BOOLEAN_FLAG_STRUCT_FOR_PRODUCT)
00067 {0, NULL, false, NULL }
00068 };
00069
00070
00071 inline bool str_equal(char* s, char* q, int len) {
00072
00073 if (strlen(s) != (unsigned int) len) return false;
00074 return strncmp(s, q, len) == 0;
00075 }
00076
00077
00078 bool debugFlags::boolAt(char* name, int len, bool* value) {
00079 for (boolFlag* current = &boolTable[0]; current->name; current++) {
00080 if (str_equal(current->name, name, len)) {
00081 *value = *current->value_ptr;
00082 return true;
00083 }
00084 }
00085 return false;
00086 }
00087
00088
00089 bool debugFlags::boolAtPut(char* name, int len, bool* value) {
00090 if (str_equal("TracePrims", name, len)) {
00091 TraceOopPrims = *value;
00092 TraceDoublePrims = *value;
00093 TraceByteArrayPrims = *value;
00094 TraceDoubleByteArrayPrims = *value;
00095 TraceObjArrayPrims = *value;
00096 TraceSmiPrims = *value;
00097 TraceProxyPrims = *value;
00098 TraceBehaviorPrims = *value;
00099 TraceBlockPrims = *value;
00100 TraceDebugPrims = *value;
00101 TraceSystemPrims = *value;
00102 TraceProcessPrims = *value;
00103 TraceCallBackPrims = *value;
00104 TraceMethodPrims = *value;
00105 TraceMixinPrims = *value;
00106 *value = !*value;
00107 return true;
00108 }
00109 for (boolFlag* current = &boolTable[0]; current->name; current++) {
00110 if (str_equal(current->name, name, len)) {
00111 bool old_value = *current->value_ptr;
00112 *current->value_ptr = *value;
00113 *value = old_value;
00114 return true;
00115 }
00116 }
00117 return false;
00118 }
00119
00120
00121
00122
00123 struct intFlag {
00124 char* name;
00125 int* value_ptr;
00126 int default_value;
00127 char* doc;
00128 };
00129
00130
00131 #ifdef PRODUCT
00132 #define MATERIALIZE_INTEGER_FLAG_STRUCT_FOR_DEVELOP(name,value,doc) \
00133 // do nothing - flag doesn't show up in table in product version
00134 #else
00135 #define MATERIALIZE_INTEGER_FLAG_STRUCT_FOR_DEVELOP(name,value,doc) \
00136 { XSTR(name), &name, value, doc },
00137 #endif
00138
00139 #define MATERIALIZE_INTEGER_FLAG_STRUCT_FOR_PRODUCT(name,value,doc) \
00140 { XSTR(name), &name, value, doc },
00141
00142 static intFlag intTable[] = {
00143 APPLY_TO_INTEGER_FLAGS(MATERIALIZE_INTEGER_FLAG_STRUCT_FOR_DEVELOP,MATERIALIZE_INTEGER_FLAG_STRUCT_FOR_PRODUCT)
00144 {0, NULL, 0, NULL }
00145 };
00146
00147
00148 bool debugFlags::intAt(char* name, int len, int* value) {
00149 for (intFlag* current = &intTable[0]; current->name; current++) {
00150 if (str_equal(current->name, name, len)) {
00151 *value = *current->value_ptr;
00152 return true;
00153 }
00154 }
00155 return false;
00156 }
00157
00158
00159 bool debugFlags::intAtPut(char* name, int len, int* value) {
00160 for (intFlag* current = &intTable[0]; current->name; current++) {
00161 if (str_equal(current->name, name, len)) {
00162 int old_value = *current->value_ptr;
00163 *current->value_ptr = *value;
00164 *value = old_value;
00165 return true;
00166 }
00167 }
00168 return false;
00169 }
00170
00171
00172
00173
00174 void debugFlags::printFlags() {
00175 for (boolFlag* b = &boolTable[0]; b->name; b++)
00176 lprintf("%30s = %s\n", b->name, *b->value_ptr ? "true" : "false");
00177 for (intFlag* i = &intTable[0]; i->name; i++)
00178 lprintf("%30s = %d\n", i->name, *i->value_ptr);
00179 }
00180
00181
00182 void debugFlags::print_on(outputStream* st) {
00183
00184 for (boolFlag* b = &boolTable[0]; b->name; b++)
00185 st->print_cr("%s%s", *b->value_ptr ? "+" : "-");
00186
00187
00188 for (intFlag* i = &intTable[0]; i->name; i++)
00189 st->print_cr("%s=%d", i->name, *b->value_ptr);
00190 }
00191
00192
00193 void print_diff_on(outputStream* st) {
00194
00195 for (boolFlag* b = &boolTable[0]; b->name; b++) {
00196 if (*b->value_ptr != b->default_value)
00197 st->print_cr("%s%s", *b->value_ptr ? "+" : "-");
00198 }
00199
00200
00201 for (intFlag* i = &intTable[0]; i->name; i++) {
00202 if (*b->value_ptr != b->default_value)
00203 st->print_cr("%s=%d", i->name, *b->value_ptr);
00204 }
00205 }
00206
00207
00208 bool BeingDebugged = false;