Fixed deserialization bug. When stacktrace = null (i.e. it is unmodifiable), setStackTrace would throw a NullPointerException. Fixed that by moving the stackTrace field setting into a seperate method.

This commit is contained in:
jfrijters 2011-06-26 11:26:13 +00:00
Родитель 63be67bd3c
Коммит 5a77a2d712
1 изменённых файлов: 20 добавлений и 10 удалений

Просмотреть файл

@ -400,19 +400,16 @@ namespace IKVM.Internal
fields.put("cause", x.InnerException); fields.put("cause", x.InnerException);
// suppressed exceptions are not supported on CLR exceptions // suppressed exceptions are not supported on CLR exceptions
fields.put("suppressedExceptions", null); fields.put("suppressedExceptions", null);
fields.put("stackTrace", getOurStackTrace(x));
} }
else else
{ {
fields.put("detailMessage", _thisJava.detailMessage); fields.put("detailMessage", _thisJava.detailMessage);
fields.put("cause", _thisJava.cause); fields.put("cause", _thisJava.cause);
fields.put("suppressedExceptions", _thisJava.suppressedExceptions); fields.put("suppressedExceptions", _thisJava.suppressedExceptions);
getOurStackTrace(x);
fields.put("stackTrace", _thisJava.stackTrace ?? java.lang.ThrowableHelper.SentinelHolder.STACK_TRACE_SENTINEL);
} }
StackTraceElement[] stackTrace = getOurStackTrace(x);
if (stackTrace == null)
{
stackTrace = java.lang.ThrowableHelper.SentinelHolder.STACK_TRACE_SENTINEL;
}
fields.put("stackTrace", stackTrace);
s.writeFields(); s.writeFields();
} }
#endif #endif
@ -475,14 +472,20 @@ namespace IKVM.Internal
} }
else else
{ {
// we don't need to verify non-nullness of the array elements, because setStackTrace will do that foreach (StackTraceElement elem in stackTrace)
{
if (elem == null)
{
throw new java.lang.NullPointerException("null StackTraceElement in serial stream. ");
}
}
} }
} }
else else
{ {
stackTrace = new StackTraceElement[0]; stackTrace = new StackTraceElement[0];
} }
setStackTrace(x, stackTrace); SetStackTraceImpl(x, stackTrace);
} }
#endif #endif
} }
@ -680,10 +683,17 @@ namespace IKVM.Internal
throw new java.lang.NullPointerException(); throw new java.lang.NullPointerException();
} }
} }
SetStackTraceImpl(x, copy);
#endif
}
private static void SetStackTraceImpl(Exception x, StackTraceElement[] stackTrace)
{
#if !FIRST_PASS
Throwable _this = x as Throwable; Throwable _this = x as Throwable;
if (_this == null) if (_this == null)
{ {
ExceptionInfoHelper eih = new ExceptionInfoHelper(copy); ExceptionInfoHelper eih = new ExceptionInfoHelper(stackTrace);
IDictionary data = x.Data; IDictionary data = x.Data;
if (data != null && !data.IsReadOnly) if (data != null && !data.IsReadOnly)
{ {
@ -701,7 +711,7 @@ namespace IKVM.Internal
{ {
return; return;
} }
_this.stackTrace = copy; _this.stackTrace = stackTrace;
} }
} }
#endif #endif