Fixes one part of bug #8.
Changes: Christian Thalinger
Changes: Christian Thalinger
- $Id: stacktrace.c 3111 2005-07-27 10:33:58Z twisti $
+ $Id: stacktrace.c 3124 2005-07-28 19:56:34Z twisti $
} lineNumberTableEntryInlineBegin;
} lineNumberTableEntryInlineBegin;
-typedef void(*CacaoStackTraceCollector)(void **,stackTraceBuffer*);
+typedef bool(*CacaoStackTraceCollector)(void **, stackTraceBuffer*);
#define BLOCK_INITIALSIZE 40
#define BLOCK_SIZEINCREMENT 40
#define BLOCK_INITIALSIZE 40
#define BLOCK_SIZEINCREMENT 40
*******************************************************************************/
*******************************************************************************/
-void cacao_stacktrace_fillInStackTrace(void **target,
- CacaoStackTraceCollector coll)
+static bool cacao_stacktrace_fillInStackTrace(void **target,
+ CacaoStackTraceCollector coll)
{
stacktraceelement primaryBlock[BLOCK_INITIALSIZE*sizeof(stacktraceelement)];
stackTraceBuffer buffer;
{
stacktraceelement primaryBlock[BLOCK_INITIALSIZE*sizeof(stacktraceelement)];
stackTraceBuffer buffer;
u4 framesize;
functionptr ra;
functionptr xpc;
u4 framesize;
functionptr ra;
functionptr xpc;
/* prevent compiler warnings */
/* prevent compiler warnings */
if (!info) {
*target = NULL;
if (!info) {
*target = NULL;
+ result = coll(target, &buffer);
if (buffer.needsFree)
free(buffer.start);
if (buffer.needsFree)
free(buffer.start);
-static
-void stackTraceCollector(void **target, stackTraceBuffer *buffer) {
- stackTraceBuffer *dest=*target=heap_allocate(sizeof(stackTraceBuffer)+buffer->full*sizeof(stacktraceelement),true,0);
- memcpy(*target,buffer,sizeof(stackTraceBuffer));
- memcpy(dest+1,buffer->start,buffer->full*sizeof(stacktraceelement));
+/* stackTraceCollector *********************************************************
+
+ XXX
+
+*******************************************************************************/
+
+static bool stackTraceCollector(void **target, stackTraceBuffer *buffer)
+{
+ stackTraceBuffer *dest;
+
+ dest = *target = heap_allocate(sizeof(stackTraceBuffer) + buffer->full * sizeof(stacktraceelement), true, 0);
+
+ if (!dest)
+ return false;
- dest->needsFree=0;
- dest->size=dest->full;
- dest->start=(stacktraceelement*)(dest+1);
+ memcpy(*target, buffer, sizeof(stackTraceBuffer));
+ memcpy(dest + 1, buffer->start, buffer->full * sizeof(stacktraceelement));
- /*
- if (buffer->full>0) {
- printf("SOURCE BUFFER:%s\n",buffer->start[0].method->name->text);
- printf("DEST BUFFER:%s\n",dest->start[0].method->name->text);
- } else printf("Buffer is empty\n");
- */
+ dest->needsFree = 0;
+ dest->size = dest->full;
+ dest->start = (stacktraceelement *) (dest + 1);
+
+ return true;
-void cacao_stacktrace_NormalTrace(void **target)
+bool cacao_stacktrace_NormalTrace(void **target)
- cacao_stacktrace_fillInStackTrace(target, &stackTraceCollector);
+ return cacao_stacktrace_fillInStackTrace(target, &stackTraceCollector);
-static void classContextCollector(void **target, stackTraceBuffer *buffer)
+static bool classContextCollector(void **target, stackTraceBuffer *buffer)
- java_objectarray *tmpArray;
stacktraceelement *current;
stacktraceelement *start;
size_t size;
stacktraceelement *current;
stacktraceelement *start;
size_t size;
targetSize--;
if (targetSize > 0) {
targetSize--;
if (targetSize > 0) {
- if (start->method && (start->method->class == class_java_lang_SecurityManager)) {
+ if (start->method &&
+ (start->method->class == class_java_lang_SecurityManager)) {
targetSize--;
start++;
}
}
targetSize--;
start++;
}
}
- tmpArray = builtin_anewarray(targetSize, class_java_lang_Class);
+ oa = builtin_anewarray(targetSize, class_java_lang_Class);
- for(i = 0, current = start; i < targetSize; i++, current++) {
- /* XXX TWISTI: should we use this skipping for native stubs? */
+ if (!oa)
+ return false;
+ for(i = 0, current = start; i < targetSize; i++, current++) {
if (!current->method) {
i--;
continue;
if (!current->method) {
i--;
continue;
use_class_as_object(current->method->class);
use_class_as_object(current->method->class);
- tmpArray->data[i] = (java_objectheader *) current->method->class;
+ oa->data[i] = (java_objectheader *) current->method->class;
+ *target = oa;
+
+ return true;
}
java_objectarray *cacao_createClassContextArray(void)
{
}
java_objectarray *cacao_createClassContextArray(void)
{
- java_objectarray *array=0;
+ java_objectarray *array = NULL;
- cacao_stacktrace_fillInStackTrace((void **) &array, &classContextCollector);
+ if (!cacao_stacktrace_fillInStackTrace((void **) &array,
+ &classContextCollector))
+ return NULL;
*******************************************************************************/
*******************************************************************************/
-static void stacktrace_classLoaderCollector(void **target,
+static bool stacktrace_classLoaderCollector(void **target,
stackTraceBuffer *buffer)
{
stacktraceelement *current;
stackTraceBuffer *buffer)
{
stacktraceelement *current;
if (m->class == class_java_security_PrivilegedAction) {
*target = NULL;
if (m->class == class_java_security_PrivilegedAction) {
*target = NULL;
}
if (m->class->classloader) {
*target = (java_lang_ClassLoader *) m->class->classloader;
}
if (m->class->classloader) {
*target = (java_lang_ClassLoader *) m->class->classloader;
java_objectheader *cacao_currentClassLoader(void)
{
java_objectheader *cacao_currentClassLoader(void)
{
- java_objectheader *header=0;
+ java_objectheader *header = NULL;
- cacao_stacktrace_fillInStackTrace((void**)&header,
- &stacktrace_classLoaderCollector);
+ if (!cacao_stacktrace_fillInStackTrace((void**)&header,
+ &stacktrace_classLoaderCollector))
+ return NULL;
-static
-void callingMethodCollector(void **target, stackTraceBuffer *buffer) {
- if (buffer->full >2) (*target)=buffer->start[2].method;
- else (*target=0);
+static bool callingMethodCollector(void **target, stackTraceBuffer *buffer)
+{
+ if (buffer->full > 2)
+ *target = buffer->start[2].method;
+ else
+ *target = NULL;
+
+ return true;
-methodinfo *cacao_callingMethod() {
+
+methodinfo *cacao_callingMethod(void)
+{
- cacao_stacktrace_fillInStackTrace((void**)&method,&callingMethodCollector);
+
+ if (!cacao_stacktrace_fillInStackTrace((void **) &method,
+ &callingMethodCollector))
+ return NULL;
+
-static
-void getStackCollector(void **target, stackTraceBuffer *buffer)
+static bool getStackCollector(void **target, stackTraceBuffer *buffer)
- java_objectarray *classes;
- java_objectarray *methodnames;
- java_objectarray **result=(java_objectarray**)target;
- java_lang_String *str;
- classinfo *c;
+ java_objectarray *oa;
+ java_objectarray *classes;
+ java_objectarray *methodnames;
+ java_lang_String *str;
+ classinfo *c;
stacktraceelement *current;
stacktraceelement *current;
- /*log_text("getStackCollector");*/
+/* *result = (java_objectarray **) target; */
- *result = builtin_anewarray(2, arrayclass_java_lang_Object);
+ oa = builtin_anewarray(2, arrayclass_java_lang_Object);
- if (!(*result))
- return;
+ if (!oa)
+ return false;
classes = builtin_anewarray(size, class_java_lang_Class);
if (!classes)
classes = builtin_anewarray(size, class_java_lang_Class);
if (!classes)
methodnames = builtin_anewarray(size, class_java_lang_String);
if (!methodnames)
methodnames = builtin_anewarray(size, class_java_lang_String);
if (!methodnames)
- (*result)->data[0] = (java_objectheader *) classes;
- (*result)->data[1] = (java_objectheader *) methodnames;
+ oa->data[0] = (java_objectheader *) classes;
+ oa->data[1] = (java_objectheader *) methodnames;
- /*log_text("Before for loop");*/
for (i = 0, current = &(buffer->start[0]); i < size; i++, current++) {
for (i = 0, current = &(buffer->start[0]); i < size; i++, current++) {
- /*log_text("In loop");*/
c = current->method->class;
c = current->method->class;
classes->data[i] = (java_objectheader *) c;
str = javastring_new(current->method->name);
classes->data[i] = (java_objectheader *) c;
str = javastring_new(current->method->name);
methodnames->data[i] = (java_objectheader *) str;
methodnames->data[i] = (java_objectheader *) str;
- /*printf("getStackCollector: %s.%s\n",c->name->text,current->method->name->text);*/
- /*if (*exceptionptr) panic("Exception in getStackCollector");*/
-
- /*log_text("loop left");*/
- return;
{
java_objectarray *result = NULL;
{
java_objectarray *result = NULL;
- cacao_stacktrace_fillInStackTrace((void **) &result, &getStackCollector);
+ if (!cacao_stacktrace_fillInStackTrace((void **) &result,
+ &getStackCollector))
+ return NULL;
- $Id: stacktrace.h 3073 2005-07-20 10:40:41Z twisti $
+ $Id: stacktrace.h 3124 2005-07-28 19:56:34Z twisti $
functionptr ra,
functionptr xpc);
functionptr ra,
functionptr xpc);
-void cacao_stacktrace_NormalTrace(void **target);
+bool cacao_stacktrace_NormalTrace(void **target);
java_objectarray *cacao_createClassContextArray(void);
java_objectheader *cacao_currentClassLoader(void);
methodinfo* cacao_callingMethod(void);
java_objectarray *cacao_createClassContextArray(void);
java_objectheader *cacao_currentClassLoader(void);
methodinfo* cacao_callingMethod(void);