From: jowenn Date: Thu, 19 May 2005 08:48:55 +0000 (+0000) Subject: VMAccessController.getStack (currently leads in some cases to endless loops) X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=53e2cb7e69ee49b66aac8a43c09a2a7a8a439674;p=cacao.git VMAccessController.getStack (currently leads in some cases to endless loops) --- diff --git a/src/native/include/Makefile.am b/src/native/include/Makefile.am index 8c3a77fef..98cd75eb1 100644 --- a/src/native/include/Makefile.am +++ b/src/native/include/Makefile.am @@ -28,7 +28,7 @@ ## ## Changes: ## -## $Id: Makefile.am 2480 2005-05-13 15:32:22Z twisti $ +## $Id: Makefile.am 2482 2005-05-19 08:48:55Z jowenn $ ## Process this file with automake to produce Makefile.in @@ -75,7 +75,8 @@ ADDITIONAL_IMPLEMENTED_VM_CLASSES_HEADER_FILES = \ java_lang_VMRuntime.h \ java_lang_VMString.h \ java_lang_VMSystem.h \ - java_lang_reflect_Proxy.h + java_lang_reflect_Proxy.h \ + java_security_VMAccessController ADDITIONAL_STATIC_CLASSPATH_HEADER_FILES = \ java_net_DatagramPacket.h \ diff --git a/src/native/native.c b/src/native/native.c index 20d003b2d..583264b6d 100644 --- a/src/native/native.c +++ b/src/native/native.c @@ -30,7 +30,7 @@ Changes: Christian Thalinger - $Id: native.c 2465 2005-05-13 00:02:01Z twisti $ + $Id: native.c 2482 2005-05-19 08:48:55Z jowenn $ */ @@ -96,6 +96,7 @@ #include "native/include/java_lang_reflect_Field.h" #include "native/include/java_lang_reflect_Proxy.h" #include "native/include/java_lang_reflect_Method.h" +#include "native/include/java_security_VMAccessController.h" #if defined(STATIC_CLASSPATH) @@ -211,6 +212,8 @@ static functionptr dummynativetable[] = { (functionptr) Java_java_lang_reflect_Method_getParameterTypes, (functionptr) Java_java_lang_reflect_Method_getExceptionTypes, (functionptr) Java_java_lang_reflect_Method_invokeNative, + + (functionptr) Java_java_security_VMAccessController_getStack, }; #endif /* defined(STATIC_CLASSPATH) */ diff --git a/src/native/vm/Makefile.am b/src/native/vm/Makefile.am index ffa9d91f4..7c1cdbe3c 100644 --- a/src/native/vm/Makefile.am +++ b/src/native/vm/Makefile.am @@ -28,7 +28,7 @@ ## ## Changes: ## -## $Id: Makefile.am 1992 2005-03-05 16:53:16Z twisti $ +## $Id: Makefile.am 2482 2005-05-19 08:48:55Z jowenn $ ## Process this file with automake to produce Makefile.in @@ -50,7 +50,8 @@ libnativevm_la_SOURCES = \ VMSystem.c \ VMSystemProperties.c \ VMThread.c \ - VMThrowable.c + VMThrowable.c \ + VMAccessController.c ## Local variables: diff --git a/src/vm/class.c b/src/vm/class.c index 14da92346..9826f59a2 100644 --- a/src/vm/class.c +++ b/src/vm/class.c @@ -30,7 +30,7 @@ Andreas Krall Christian Thalinger - $Id: class.c 2427 2005-05-01 12:27:54Z jowenn $ + $Id: class.c 2482 2005-05-19 08:48:55Z jowenn $ */ @@ -123,7 +123,7 @@ classinfo *class_java_lang_Double = NULL; classinfo *class_java_util_Vector = NULL; classinfo *class_java_lang_reflect_Constructor = NULL; classinfo *class_java_lang_reflect_Method = NULL; - +classinfo *arrayclass_java_lang_Object=NULL; /* pseudo classes for the typechecker */ diff --git a/src/vm/class.h b/src/vm/class.h index c9d7f0b6b..d70c3637c 100644 --- a/src/vm/class.h +++ b/src/vm/class.h @@ -28,7 +28,7 @@ Changes: - $Id: class.h 2427 2005-05-01 12:27:54Z jowenn $ + $Id: class.h 2482 2005-05-19 08:48:55Z jowenn $ */ @@ -191,6 +191,7 @@ extern classinfo *class_java_lang_Double; extern classinfo *class_java_util_Vector; extern classinfo *class_java_lang_reflect_Constructor; extern classinfo *class_java_lang_reflect_Method; +extern classinfo *arrayclass_java_lang_Object; /* pseudo classes for the type checker ****************************************/ diff --git a/src/vm/jit/stacktrace.c b/src/vm/jit/stacktrace.c index 1e0504399..260ce8a10 100644 --- a/src/vm/jit/stacktrace.c +++ b/src/vm/jit/stacktrace.c @@ -26,7 +26,7 @@ Authors: Joseph Wenninger - $Id: stacktrace.c 2430 2005-05-03 19:25:52Z twisti $ + $Id: stacktrace.c 2482 2005-05-19 08:48:55Z jowenn $ */ @@ -45,8 +45,12 @@ #include "vm/tables.h" #include "vm/jit/codegen.inc.h" #include "vm/loader.h" +#include "vm/stringlocal.h" +#include "vm/exceptions.h" #undef JWDEBUG +#undef JWDEBUG2 +#undef JWDEBUG3 /*JoWenn: simplify collectors (trace doesn't contain internal methods)*/ @@ -85,7 +89,7 @@ static void addEntry(stackTraceBuffer* buffer,methodinfo*method ,LineNumber line tmp->method=method; tmp->linenumber=line; buffer->full = buffer->full + 1; -#ifdef JWDEBUG +#if (defined(JWDEBUG) || defined (JWDEBUG2)) log_text("addEntry (stacktrace):"); printf("method %p\n",method); if (method) printf("method->name %p\n",method->name); @@ -216,7 +220,7 @@ void cacao_stacktrace_fillInStackTrace(void **target,CacaoStackTraceCollector c stackTraceBuffer buffer; buffer.needsFree=0; buffer.start=primaryBlock; - buffer.size=BLOCK_INITIALSIZE*sizeof(stacktraceelement); + buffer.size=BLOCK_INITIALSIZE; /**sizeof(stacktraceelement)*/; buffer.full=0; #ifdef JWDEBUG log_text("entering cacao_stacktrace_fillInStacktrace"); @@ -380,9 +384,11 @@ void classContextCollector(void **target, stackTraceBuffer *buffer) { start=buffer->start; start++; targetSize--; - if (targetSize > 0) { if ((start->method) && (start->method->class== class_java_lang_SecurityManager)) { +#if (defined(JWDEBUG) || defined(JWDEBUG3)) + printf("removing one frame"); +#endif targetSize--; start++; } @@ -390,9 +396,12 @@ void classContextCollector(void **target, stackTraceBuffer *buffer) { tmpArray = builtin_anewarray(targetSize, class_java_lang_Class); +#if (defined(JWDEBUG) || defined(JWDEBUG3)) + printf("==========================================================================================================\n"); +#endif for(i = 0, current = start; i < targetSize; i++, current++) { if (current->method==0) { i--; /*printf("Skipping\n");*/ continue;} -#ifdef JWDEBUG +#if (defined(JWDEBUG) || defined(JWDEBUG3)) { printf("after current->method check\n"); if (current->method->class==0) printf("Error method defining class i null\n"); @@ -412,7 +421,7 @@ void classContextCollector(void **target, stackTraceBuffer *buffer) { printf("array item has been set\n"); #endif } -#ifdef JWDEBUG +#if (defined(JWDEBUG) || defined(JWDEBUG3)) printf("leaving classContextCollector"); #endif *target=tmpArray; @@ -455,7 +464,7 @@ void classLoaderCollector(void **target, stackTraceBuffer *buffer) { /* XXX handle exception */; for(i=0, current = start; i < size; i++, current++) { - m=start->method; + m=current->method; if (!m) continue; if (m->class == privilegedAction) { @@ -491,6 +500,64 @@ methodinfo *cacao_callingMethod() { return method; } + +static +void getStackCollector(void **target, stackTraceBuffer *buffer) { + java_objectarray *classes; + java_objectarray *methodnames; + java_objectarray **result=(java_objectarray**)target; + java_lang_String *str; + classinfo *c; + stacktraceelement *current; + int i,size; + + /*log_text("getStackCollector");*/ + + size=buffer->full; + + + *result=builtin_anewarray(2,arrayclass_java_lang_Object); + if (result==0) panic("getStackCollector (very out of memory)"); + classes=builtin_anewarray(size,class_java_lang_Class); + methodnames=builtin_anewarray(size,class_java_lang_String); + (*result)->data[0]=(java_objectheader*)classes; + (*result)->data[1]=(java_objectheader*)methodnames; + if ( (0==classes) || (0==methodnames)) { + classes=builtin_anewarray(0,class_java_lang_Class); + methodnames=builtin_anewarray(0,class_java_lang_String); + (*result)->data[0]=(java_objectheader*)classes; + (*result)->data[1]=(java_objectheader*)methodnames; + if ( (0==classes) || (0==methodnames)) panic ("getStackCollector (very out of memory 2)"); + return; + } + /*log_text("Before for loop");*/ + for (i=0,current=&(buffer->start[0]);imethod->class; + use_class_as_object(c); + classes->data[i]=(java_objectheader*)c; + str=javastring_new(current->method->name); + if (!str) return; + 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 *cacao_getStackForVMAccessController() { + java_objectarray *result=0; + cacao_stacktrace_fillInStackTrace((void**)&result,&getStackCollector); + return result; +} + + + + /* * These are local overrides for various environment variables in Emacs. * Please do not remove this and leave it at the end of the file, where diff --git a/src/vm/jit/stacktrace.h b/src/vm/jit/stacktrace.h index ba0d5ad16..8f39f384b 100644 --- a/src/vm/jit/stacktrace.h +++ b/src/vm/jit/stacktrace.h @@ -28,7 +28,7 @@ Changes: - $Id: stacktrace.h 2402 2005-04-27 13:17:07Z jowenn $ + $Id: stacktrace.h 2482 2005-05-19 08:48:55Z jowenn $ */ @@ -92,7 +92,7 @@ void cacao_stacktrace_NormalTrace(void **target); java_objectarray *cacao_createClassContextArray(); java_objectheader *cacao_currentClassLoader(); methodinfo* cacao_callingMethod(); - +java_objectarray *cacao_getStackForVMAccessController(); #endif /* _STACKTRACE_H */ diff --git a/src/vm/jit/x86_64/patcher.c b/src/vm/jit/x86_64/patcher.c index 9e1d82b0e..d2b225f51 100644 --- a/src/vm/jit/x86_64/patcher.c +++ b/src/vm/jit/x86_64/patcher.c @@ -28,7 +28,7 @@ Changes: - $Id: patcher.c 2448 2005-05-11 13:03:20Z twisti $ + $Id: patcher.c 2482 2005-05-19 08:48:55Z jowenn $ */ @@ -43,7 +43,7 @@ #include "vm/exceptions.h" -helper_initialize_class(void* beginOfJavaStack,classinfo *c,u1 *ra) { +bool helper_initialize_class(void* beginOfJavaStack,classinfo *c,u1 *ra) { if (!c->initialized) { bool init; { diff --git a/src/vm/loader.c b/src/vm/loader.c index 3b6a86e37..b3cddc651 100644 --- a/src/vm/loader.c +++ b/src/vm/loader.c @@ -32,7 +32,7 @@ Edwin Steiner Christian Thalinger - $Id: loader.c 2456 2005-05-12 22:59:04Z twisti $ + $Id: loader.c 2482 2005-05-19 08:48:55Z jowenn $ */ @@ -204,6 +204,8 @@ bool loader_init(u1 *stackbottom) if (!load_class_bootstrap(utf_java_lang_reflect_Method, &class_java_lang_reflect_Method)) return false; + if (! load_class_bootstrap(utf_new_char("[Ljava/lang/Object;"),&arrayclass_java_lang_Object)) + return false; #if defined(USE_THREADS) if (stackbottom != 0) initLocks();