Added callback methods sent by VM when an invalid class format is detected
authorJan Vrany <jan.vrany@fit.cvut.cz>
Wed, 25 Oct 2017 23:46:33 +0100
changeset 3787 13b3e613b1e6
parent 3786 5955382113e0
child 3788 f3e69321789b
Added callback methods sent by VM when an invalid class format is detected ...such as invalic constant pool or constant pool index is out of bounds. In that case the VM sends a message to a `JavaMethod` instance. It's a responsibility to smalltalk code to handle this and unwind tne execution of Java method.
JavaClassFormatError.st
JavaMethod.st
Make.proto
Make.spec
abbrev.stc
bc.mak
libInit.cc
stx_libjava.st
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/JavaClassFormatError.st	Wed Oct 25 23:46:33 2017 +0100
@@ -0,0 +1,75 @@
+"
+ COPYRIGHT (c) 1996-2015 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2015 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava' }"
+
+"{ NameSpace: Smalltalk }"
+
+JavaError subclass:#JavaClassFormatError
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Support'
+!
+
+!JavaClassFormatError class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2015 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2015 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+!
+
+documentation
+"
+    Thrown when the VM detects class format corruption, like
+    class's constant pool is nil, index to constant pool is out
+    of bounds and so on.
+
+    [author:]
+        Jan Vrany <jan.vrany@fit.cvut.cz>
+
+    [instance variables:]
+
+    [class variables:]
+
+    [see also:]
+
+"
+! !
+
--- a/JavaMethod.st	Wed Oct 25 23:18:30 2017 +0100
+++ b/JavaMethod.st	Wed Oct 25 23:46:33 2017 +0100
@@ -1734,19 +1734,72 @@
 
 !JavaMethod methodsFor:'error handling'!
 
-invalidByteCode
-    "This error is triggered when the interpreter tries to execute a
-     code object, where the byteCode is nonNil, but not a ByteArray.
-     Can only happen when Compiler/runtime system is broken or
-     someone played around with a blocks/methods code."     
-
-    self isAbstract ifTrue:[
+invalidByteCode: anObject
+    "
+    Sent by VM when method's bytecode (value `byteCode` slot) is invalid
+    such as it's nil or a ByteArray instance
+    "
+    (anObject isNil and:[ self isAbstract ]) ifTrue:[ 
         JavaVM throwExceptionClassName: 'java.lang.AbstractMethodError' withMessage: ('trying to execute abstract method %1#%2' bindWith: javaClass javaName with: selector).
     ].
-    ^ super invalidByteCode
-
-    "Created: / 27-01-1998 / 21:48:01 / cg"
-    "Modified: / 25-10-2017 / 23:12:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+
+    JavaClassFormatError newException
+        messageText: 'Invalid method bytecode';
+        parameter: (Array with: self with: anObject );
+        raise
+
+    "Created: / 25-10-2017 / 23:25:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 26-10-2017 / 11:39:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+invalidClass: anObject
+    "
+    Sent by VM when method's class (value `javaClass` slot) is invalid
+    such it's nil or not a Java class.
+    "
+    JavaClassFormatError newException
+        messageText: 'Invalid method class';
+        parameter: (Array with: self with: anObject );
+        raise
+
+    "Created: / 25-10-2017 / 23:25:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 26-10-2017 / 11:39:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+invalidConstantPool: anObject
+    "
+    Sent by VM when method's class constant pool is invalid
+    such it's nil or not a constant pool.
+    "
+    JavaClassFormatError newException
+        messageText: 'Invalid constant pool:';
+        parameter: (Array with: self with: anObject );
+        raise
+
+    "Created: / 25-10-2017 / 23:27:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 26-10-2017 / 11:39:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+invalidConstantPool: anObject index: anInteger
+    "
+    Sent by VM when constant pool index or entry at
+    given index is invalid, such as if it's out of
+    bouunds or constant pool entry is nil.
+    "
+    anInteger > anObject size ifTrue:[ 
+        JavaClassFormatError newException
+            messageText: 'Constant pool index out of bounds:';
+            parameter: (Array with: self with: anObject with: anInteger);
+            raise
+    ] ifFalse:[ 
+        JavaClassFormatError newException
+            messageText: 'Invalid constant pool entry';
+            parameter: (Array with: self with: anObject with: anInteger);
+            raise
+    ].
+
+    "Created: / 25-10-2017 / 23:40:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 26-10-2017 / 11:39:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 wrongNumberOfArguments:numArgsGiven
--- a/Make.proto	Wed Oct 25 23:18:30 2017 +0100
+++ b/Make.proto	Wed Oct 25 23:46:33 2017 +0100
@@ -268,6 +268,7 @@
 $(OUTDIR)JavaByteCodeDisassembler.$(O) JavaByteCodeDisassembler.$(C) JavaByteCodeDisassembler.$(H): JavaByteCodeDisassembler.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libjava/JavaByteCodeProcessor.$(H) $(STCHDR)
 $(OUTDIR)JavaByteCodeProcessorAdapter.$(O) JavaByteCodeProcessorAdapter.$(C) JavaByteCodeProcessorAdapter.$(H): JavaByteCodeProcessorAdapter.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libjava/JavaByteCodeProcessor.$(H) $(STCHDR)
 $(OUTDIR)JavaClassAnnotationContainer.$(O) JavaClassAnnotationContainer.$(C) JavaClassAnnotationContainer.$(H): JavaClassAnnotationContainer.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libjava/JavaAnnotationContainer.$(H) $(STCHDR)
+$(OUTDIR)JavaClassFormatError.$(O) JavaClassFormatError.$(C) JavaClassFormatError.$(H): JavaClassFormatError.st $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libjava/JavaError.$(H) $(STCHDR)
 $(OUTDIR)JavaClassMemberRef2.$(O) JavaClassMemberRef2.$(C) JavaClassMemberRef2.$(H): JavaClassMemberRef2.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libjava/JavaRef2.$(H) $(STCHDR)
 $(OUTDIR)JavaClassReader.$(O) JavaClassReader.$(C) JavaClassReader.$(H): JavaClassReader.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libjava/JavaConstants.$(H) $(STCHDR)
 $(OUTDIR)JavaClassRef2.$(O) JavaClassRef2.$(C) JavaClassRef2.$(H): JavaClassRef2.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libjava/JavaRef2.$(H) $(STCHDR)
--- a/Make.spec	Wed Oct 25 23:18:30 2017 +0100
+++ b/Make.spec	Wed Oct 25 23:46:33 2017 +0100
@@ -129,6 +129,7 @@
 	JavaByteCodeDisassembler \
 	JavaByteCodeProcessorAdapter \
 	JavaClassAnnotationContainer \
+	JavaClassFormatError \
 	JavaClassMemberRef2 \
 	JavaClassReader \
 	JavaClassRef2 \
@@ -269,6 +270,7 @@
     $(OUTDIR)JavaByteCodeDisassembler.$(O) \
     $(OUTDIR)JavaByteCodeProcessorAdapter.$(O) \
     $(OUTDIR)JavaClassAnnotationContainer.$(O) \
+    $(OUTDIR)JavaClassFormatError.$(O) \
     $(OUTDIR)JavaClassMemberRef2.$(O) \
     $(OUTDIR)JavaClassReader.$(O) \
     $(OUTDIR)JavaClassRef2.$(O) \
--- a/abbrev.stc	Wed Oct 25 23:18:30 2017 +0100
+++ b/abbrev.stc	Wed Oct 25 23:46:33 2017 +0100
@@ -79,6 +79,7 @@
 JavaByteCodeDisassembler JavaByteCodeDisassembler stx:libjava 'Languages-Java-Bytecode' 0
 JavaByteCodeProcessorAdapter JavaByteCodeProcessorAdapter stx:libjava 'Languages-Java-Bytecode' 0
 JavaClassAnnotationContainer JavaClassAnnotationContainer stx:libjava 'Languages-Java-Annotations' 1
+JavaClassFormatError JavaClassFormatError stx:libjava 'Languages-Java-Support' 1
 JavaClassMemberRef2 JavaClassMemberRef2 stx:libjava 'Languages-Java-Reader-Support-new' 0
 JavaClassReader JavaClassReader stx:libjava 'Languages-Java-Support' 0
 JavaClassRef2 JavaClassRef2 stx:libjava 'Languages-Java-Reader-Support-new' 0
--- a/bc.mak	Wed Oct 25 23:18:30 2017 +0100
+++ b/bc.mak	Wed Oct 25 23:46:33 2017 +0100
@@ -208,6 +208,7 @@
 $(OUTDIR)JavaByteCodeDisassembler.$(O) JavaByteCodeDisassembler.$(C) JavaByteCodeDisassembler.$(H): JavaByteCodeDisassembler.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libjava\JavaByteCodeProcessor.$(H) $(STCHDR)
 $(OUTDIR)JavaByteCodeProcessorAdapter.$(O) JavaByteCodeProcessorAdapter.$(C) JavaByteCodeProcessorAdapter.$(H): JavaByteCodeProcessorAdapter.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libjava\JavaByteCodeProcessor.$(H) $(STCHDR)
 $(OUTDIR)JavaClassAnnotationContainer.$(O) JavaClassAnnotationContainer.$(C) JavaClassAnnotationContainer.$(H): JavaClassAnnotationContainer.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libjava\JavaAnnotationContainer.$(H) $(STCHDR)
+$(OUTDIR)JavaClassFormatError.$(O) JavaClassFormatError.$(C) JavaClassFormatError.$(H): JavaClassFormatError.st $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libjava\JavaError.$(H) $(STCHDR)
 $(OUTDIR)JavaClassMemberRef2.$(O) JavaClassMemberRef2.$(C) JavaClassMemberRef2.$(H): JavaClassMemberRef2.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libjava\JavaRef2.$(H) $(STCHDR)
 $(OUTDIR)JavaClassReader.$(O) JavaClassReader.$(C) JavaClassReader.$(H): JavaClassReader.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libjava\JavaConstants.$(H) $(STCHDR)
 $(OUTDIR)JavaClassRef2.$(O) JavaClassRef2.$(C) JavaClassRef2.$(H): JavaClassRef2.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libjava\JavaRef2.$(H) $(STCHDR)
--- a/libInit.cc	Wed Oct 25 23:18:30 2017 +0100
+++ b/libInit.cc	Wed Oct 25 23:46:33 2017 +0100
@@ -94,6 +94,7 @@
 extern void _JavaByteCodeDisassembler_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _JavaByteCodeProcessorAdapter_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _JavaClassAnnotationContainer_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _JavaClassFormatError_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _JavaClassMemberRef2_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _JavaClassReader_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _JavaClassRef2_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
@@ -243,6 +244,7 @@
     _JavaByteCodeDisassembler_Init(pass,__pRT__,snd);
     _JavaByteCodeProcessorAdapter_Init(pass,__pRT__,snd);
     _JavaClassAnnotationContainer_Init(pass,__pRT__,snd);
+    _JavaClassFormatError_Init(pass,__pRT__,snd);
     _JavaClassMemberRef2_Init(pass,__pRT__,snd);
     _JavaClassReader_Init(pass,__pRT__,snd);
     _JavaClassRef2_Init(pass,__pRT__,snd);
--- a/stx_libjava.st	Wed Oct 25 23:18:30 2017 +0100
+++ b/stx_libjava.st	Wed Oct 25 23:46:33 2017 +0100
@@ -136,7 +136,7 @@
      Please take a look at the #referencedPreRequisites method as well."
 
     ^ #(
-        #'stx:libbasic'    "AbstractNumberVector - extended"
+        #'stx:libbasic'    "AbstractLock - superclass of JavaMonitor"
         #'stx:libbasic2'    "Socket - extended"
         #'stx:libbasic3'    "SystemEnvironment - superclass of JavaClassEnvironment"
         #'stx:libview'    "DisplaySurface - superclass of JavaEmbeddedFrameView"
@@ -412,6 +412,7 @@
         JavaByteCodeDisassembler
         JavaByteCodeProcessorAdapter
         JavaClassAnnotationContainer
+        JavaClassFormatError
         JavaClassMemberRef2
         JavaClassReader
         JavaClassRef2