--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/JavaByteCodeProcessor.st Fri Apr 08 12:02:36 2011 +0000
@@ -0,0 +1,2559 @@
+"
+ COPYRIGHT (c) 2003 by Claus Gittinger
+ All Rights Reserved
+
+ 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.
+"
+"{ Package: 'stx:libjava' }"
+
+Object subclass:#JavaByteCodeProcessor
+ instanceVariableNames:'byteCode pc method constantPool context receiver sp retVal
+ instrPointer op wide numArgs numVars leaveProcessor'
+ classVariableNames:'OpSwitchTable Verbose'
+ poolDictionaries:''
+ category:'Languages-Java-Bytecode'
+!
+
+!JavaByteCodeProcessor class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2003 by Claus Gittinger
+ All Rights Reserved
+
+ 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.
+"
+!
+
+documentation
+"
+ Base class for processing Java bytecode.
+ This class is based on NewCompiler::JavaByteCodeProcessor
+ written originally by Claus Gittinger
+
+ [author:]
+ Jan Vrany (jan.vrany@fit.cvut.cz)
+
+ [instance variables:]
+
+ [class variables:]
+
+ [see also:]
+
+"
+! !
+
+!JavaByteCodeProcessor class methodsFor:'initialization'!
+
+initialize
+ OpSwitchTable := Array new: 256.
+ OpSwitchTable at: 1 + 0 put: #nop.
+ OpSwitchTable at: 1 + 1 put: #'aconst_null'.
+ OpSwitchTable at: 1 + 2 put: #'iconst_m1'.
+ OpSwitchTable at: 1 + 3 put: #'iconst_0'.
+ OpSwitchTable at: 1 + 4 put: #'iconst_1'.
+ OpSwitchTable at: 1 + 5 put: #'iconst_2'.
+ OpSwitchTable at: 1 + 6 put: #'iconst_3'.
+ OpSwitchTable at: 1 + 7 put: #'iconst_4'.
+ OpSwitchTable at: 1 + 8 put: #'iconst_5'.
+ OpSwitchTable at: 1 + 9 put: #'lconst_0'.
+ OpSwitchTable at: 1 + 10 put: #'lconst_1'.
+ OpSwitchTable at: 1 + 11 put: #'fconst_0'.
+ OpSwitchTable at: 1 + 12 put: #'fconst_1'.
+ OpSwitchTable at: 1 + 13 put: #'fconst_2'.
+ OpSwitchTable at: 1 + 14 put: #'dconst_0'.
+ OpSwitchTable at: 1 + 15 put: #'dconst_1'.
+ OpSwitchTable at: 1 + 16 put: #bipush.
+ OpSwitchTable at: 1 + 17 put: #sipush.
+ OpSwitchTable at: 1 + 18 put: #ldc1.
+ OpSwitchTable at: 1 + 19 put: #ldc2.
+ OpSwitchTable at: 1 + 20 put: #ldc2w.
+ OpSwitchTable at: 1 + 21 put: #iload.
+ OpSwitchTable at: 1 + 22 put: #lload.
+ OpSwitchTable at: 1 + 23 put: #fload.
+ OpSwitchTable at: 1 + 24 put: #dload.
+ OpSwitchTable at: 1 + 25 put: #aload.
+ OpSwitchTable at: 1 + 26 put: #'iload_0'.
+ OpSwitchTable at: 1 + 27 put: #'iload_1'.
+ OpSwitchTable at: 1 + 28 put: #'iload_2'.
+ OpSwitchTable at: 1 + 29 put: #'iload_3'.
+ OpSwitchTable at: 1 + 30 put: #'lload_0'.
+ OpSwitchTable at: 1 + 31 put: #'lload_1'.
+ OpSwitchTable at: 1 + 32 put: #'lload_2'.
+ OpSwitchTable at: 1 + 33 put: #'lload_3'.
+ OpSwitchTable at: 1 + 34 put: #'fload_0'.
+ OpSwitchTable at: 1 + 35 put: #'fload_1'.
+ OpSwitchTable at: 1 + 36 put: #'fload_2'.
+ OpSwitchTable at: 1 + 37 put: #'fload_3'.
+ OpSwitchTable at: 1 + 38 put: #'dload_0'.
+ OpSwitchTable at: 1 + 39 put: #'dload_1'.
+ OpSwitchTable at: 1 + 40 put: #'dload_2'.
+ OpSwitchTable at: 1 + 41 put: #'dload_3'.
+ OpSwitchTable at: 1 + 42 put: #'aload_0'.
+ OpSwitchTable at: 1 + 43 put: #'aload_1'.
+ OpSwitchTable at: 1 + 44 put: #'aload_2'.
+ OpSwitchTable at: 1 + 45 put: #'aload_3'.
+ OpSwitchTable at: 1 + 46 put: #iaload.
+ OpSwitchTable at: 1 + 47 put: #laload.
+ OpSwitchTable at: 1 + 48 put: #faload.
+ OpSwitchTable at: 1 + 49 put: #daload.
+ OpSwitchTable at: 1 + 50 put: #aaload.
+ OpSwitchTable at: 1 + 51 put: #baload.
+ OpSwitchTable at: 1 + 52 put: #caload.
+ OpSwitchTable at: 1 + 53 put: #saload.
+ OpSwitchTable at: 1 + 54 put: #istore.
+ OpSwitchTable at: 1 + 55 put: #lstore.
+ OpSwitchTable at: 1 + 56 put: #fstore.
+ OpSwitchTable at: 1 + 57 put: #dstore.
+ OpSwitchTable at: 1 + 58 put: #astore.
+ OpSwitchTable at: 1 + 59 put: #'istore_0'.
+ OpSwitchTable at: 1 + 60 put: #'istore_1'.
+ OpSwitchTable at: 1 + 61 put: #'istore_2'.
+ OpSwitchTable at: 1 + 62 put: #'istore_3'.
+ OpSwitchTable at: 1 + 63 put: #'lstore_0'.
+ OpSwitchTable at: 1 + 64 put: #'lstore_1'.
+ OpSwitchTable at: 1 + 65 put: #'lstore_2'.
+ OpSwitchTable at: 1 + 66 put: #'lstore_3'.
+ OpSwitchTable at: 1 + 67 put: #'fstore_0'.
+ OpSwitchTable at: 1 + 68 put: #'fstore_1'.
+ OpSwitchTable at: 1 + 69 put: #'fstore_2'.
+ OpSwitchTable at: 1 + 70 put: #'fstore_3'.
+ OpSwitchTable at: 1 + 71 put: #'dstore_0'.
+ OpSwitchTable at: 1 + 72 put: #'dstore_1'.
+ OpSwitchTable at: 1 + 73 put: #'dstore_2'.
+ OpSwitchTable at: 1 + 74 put: #'dstore_3'.
+ OpSwitchTable at: 1 + 75 put: #'astore_0'.
+ OpSwitchTable at: 1 + 76 put: #'astore_1'.
+ OpSwitchTable at: 1 + 77 put: #'astore_2'.
+ OpSwitchTable at: 1 + 78 put: #'astore_3'.
+ OpSwitchTable at: 1 + 79 put: #iastore.
+ OpSwitchTable at: 1 + 80 put: #lastore.
+ OpSwitchTable at: 1 + 81 put: #fastore.
+ OpSwitchTable at: 1 + 82 put: #dastore.
+ OpSwitchTable at: 1 + 83 put: #aastore.
+ OpSwitchTable at: 1 + 84 put: #bastore.
+ OpSwitchTable at: 1 + 85 put: #castore.
+ OpSwitchTable at: 1 + 86 put: #sastore.
+ OpSwitchTable at: 1 + 87 put: #pop1.
+ OpSwitchTable at: 1 + 88 put: #pop2.
+ OpSwitchTable at: 1 + 89 put: #dup.
+ OpSwitchTable at: 1 + 90 put: #'dup_x1'.
+ OpSwitchTable at: 1 + 91 put: #'dup_x2'.
+ OpSwitchTable at: 1 + 92 put: #dup2.
+ OpSwitchTable at: 1 + 93 put: #'dup2_x1'.
+ OpSwitchTable at: 1 + 94 put: #'dup2_x2'.
+ OpSwitchTable at: 1 + 95 put: #swap.
+ OpSwitchTable at: 1 + 96 put: #iadd.
+ OpSwitchTable at: 1 + 97 put: #ladd.
+ OpSwitchTable at: 1 + 98 put: #fadd.
+ OpSwitchTable at: 1 + 99 put: #dadd.
+ OpSwitchTable at: 1 + 100 put: #isub.
+ OpSwitchTable at: 1 + 101 put: #lsub.
+ OpSwitchTable at: 1 + 102 put: #fsub.
+ OpSwitchTable at: 1 + 103 put: #dsub.
+ OpSwitchTable at: 1 + 104 put: #imul.
+ OpSwitchTable at: 1 + 105 put: #lmul.
+ OpSwitchTable at: 1 + 106 put: #fmul.
+ OpSwitchTable at: 1 + 107 put: #dmul.
+ OpSwitchTable at: 1 + 108 put: #idiv.
+ OpSwitchTable at: 1 + 109 put: #ldiv.
+ OpSwitchTable at: 1 + 110 put: #fdiv.
+ OpSwitchTable at: 1 + 111 put: #ddiv.
+ OpSwitchTable at: 1 + 112 put: #irem.
+ OpSwitchTable at: 1 + 113 put: #lrem.
+ OpSwitchTable at: 1 + 114 put: #frem.
+ OpSwitchTable at: 1 + 115 put: #drem.
+ OpSwitchTable at: 1 + 116 put: #ineg.
+ OpSwitchTable at: 1 + 117 put: #lneg.
+ OpSwitchTable at: 1 + 118 put: #fneg.
+ OpSwitchTable at: 1 + 119 put: #dneg.
+ OpSwitchTable at: 1 + 120 put: #ishl.
+ OpSwitchTable at: 1 + 121 put: #lshl.
+ OpSwitchTable at: 1 + 122 put: #ishr.
+ OpSwitchTable at: 1 + 123 put: #lshr.
+ OpSwitchTable at: 1 + 124 put: #iushr.
+ OpSwitchTable at: 1 + 125 put: #lushr.
+ OpSwitchTable at: 1 + 126 put: #iand.
+ OpSwitchTable at: 1 + 127 put: #land.
+ OpSwitchTable at: 1 + 128 put: #ior.
+ OpSwitchTable at: 1 + 129 put: #lor.
+ OpSwitchTable at: 1 + 130 put: #ixor.
+ OpSwitchTable at: 1 + 131 put: #lxor.
+ OpSwitchTable at: 1 + 132 put: #iinc.
+ OpSwitchTable at: 1 + 133 put: #i2l.
+ OpSwitchTable at: 1 + 134 put: #i2f.
+ OpSwitchTable at: 1 + 135 put: #i2d.
+ OpSwitchTable at: 1 + 136 put: #l2i.
+ OpSwitchTable at: 1 + 137 put: #l2f.
+ OpSwitchTable at: 1 + 138 put: #l2d.
+ OpSwitchTable at: 1 + 139 put: #f2i.
+ OpSwitchTable at: 1 + 140 put: #f2l.
+ OpSwitchTable at: 1 + 141 put: #f2d.
+ OpSwitchTable at: 1 + 142 put: #d2i.
+ OpSwitchTable at: 1 + 143 put: #d2l.
+ OpSwitchTable at: 1 + 144 put: #d2f.
+ OpSwitchTable at: 1 + 145 put: #int2byte.
+ OpSwitchTable at: 1 + 146 put: #int2char.
+ OpSwitchTable at: 1 + 147 put: #int2short.
+ OpSwitchTable at: 1 + 148 put: #lcmp.
+ OpSwitchTable at: 1 + 149 put: #fcmpl.
+ OpSwitchTable at: 1 + 150 put: #fcmpg.
+ OpSwitchTable at: 1 + 151 put: #dcmpl.
+ OpSwitchTable at: 1 + 152 put: #dcmpg.
+ OpSwitchTable at: 1 + 153 put: #ifeq.
+ OpSwitchTable at: 1 + 154 put: #ifne.
+ OpSwitchTable at: 1 + 155 put: #iflt.
+ OpSwitchTable at: 1 + 156 put: #ifge.
+ OpSwitchTable at: 1 + 157 put: #ifgt.
+ OpSwitchTable at: 1 + 158 put: #ifle.
+ OpSwitchTable at: 1 + 159 put: #ificmpeq.
+ OpSwitchTable at: 1 + 160 put: #ificmpne.
+ OpSwitchTable at: 1 + 161 put: #ificmplt.
+ OpSwitchTable at: 1 + 162 put: #ificmpge.
+ OpSwitchTable at: 1 + 163 put: #ificmpgt.
+ OpSwitchTable at: 1 + 164 put: #ificmple.
+ OpSwitchTable at: 1 + 165 put: #ifacmpeq.
+ OpSwitchTable at: 1 + 166 put: #ifacmpne.
+ OpSwitchTable at: 1 + 167 put: #goto.
+ OpSwitchTable at: 1 + 168 put: #jsr.
+ OpSwitchTable at: 1 + 169 put: #ret.
+ OpSwitchTable at: 1 + 170 put: #tableswtch.
+ OpSwitchTable at: 1 + 171 put: #lookupswtch.
+ OpSwitchTable at: 1 + 172 put: #ireturn.
+ OpSwitchTable at: 1 + 173 put: #lreturn.
+ OpSwitchTable at: 1 + 174 put: #freturn.
+ OpSwitchTable at: 1 + 175 put: #dreturn.
+ OpSwitchTable at: 1 + 176 put: #areturn.
+ OpSwitchTable at: 1 + 177 put: #return.
+ OpSwitchTable at: 1 + 178 put: #getstatic.
+ OpSwitchTable at: 1 + 179 put: #putstatic.
+ OpSwitchTable at: 1 + 180 put: #getfield.
+ OpSwitchTable at: 1 + 181 put: #putfield.
+ OpSwitchTable at: 1 + 182 put: #invvirt.
+ OpSwitchTable at: 1 + 183 put: #invnonvirt.
+ OpSwitchTable at: 1 + 184 put: #invstatic.
+ OpSwitchTable at: 1 + 185 put: #invinterface.
+ OpSwitchTable at: 1 + 187 put: #new.
+ OpSwitchTable at: 1 + 188 put: #newarray.
+ OpSwitchTable at: 1 + 189 put: #anewarray.
+ OpSwitchTable at: 1 + 190 put: #arraylength.
+ OpSwitchTable at: 1 + 191 put: #athrow.
+ OpSwitchTable at: 1 + 192 put: #checkcast.
+ OpSwitchTable at: 1 + 193 put: #instanceof.
+ OpSwitchTable at: 1 + 194 put: #monenter.
+ OpSwitchTable at: 1 + 195 put: #monexit.
+ OpSwitchTable at: 1 + 196 put: #wide.
+ OpSwitchTable at: 1 + 197 put: #multianewarray.
+ OpSwitchTable at: 1 + 198 put: #ifnull.
+ OpSwitchTable at: 1 + 199 put: #ifnonnull.
+ OpSwitchTable at: 1 + 200 put: #'goto_w'.
+ OpSwitchTable at: 1 + 201 put: #'jsr_w'.
+ OpSwitchTable at: 1 + 202 put: #breakpoint.
+ OpSwitchTable at: 1 + 203 put: #'ret_w'.
+
+ Verbose := false.
+ "
+ self initialize"
+
+ "Created: / 17-03-2011 / 14:56:13 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 17-03-2011 / 16:43:17 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 21-03-2011 / 20:23:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaByteCodeProcessor class methodsFor:'accessing'!
+
+verbose: bool
+Verbose := bool.
+
+ "Created: / 21-03-2011 / 18:32:37 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+! !
+
+!JavaByteCodeProcessor class methodsFor:'private-logging'!
+
+log: aMessage
+Verbose ifTrue: [
+ ('JAVA [info]: ' , aMessage) infoPrintCR.].
+
+ "Created: / 17-03-2011 / 14:59:24 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+! !
+
+!JavaByteCodeProcessor methodsFor:'initialization'!
+
+reset
+ pc := method startPC.
+ byteCode := method byteCode.
+ constantPool := method javaClass constantPool.
+
+ "Modified: / 17-03-2011 / 14:53:03 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+! !
+
+!JavaByteCodeProcessor methodsFor:'instructions'!
+
+aaload
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+aastore
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+aconst_null
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+aload
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 15:07:27 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+aload: arg
+ "
+ Load reference from local variable 0
+ nothing -> objectRef"
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+ "
+ Description
+ The <n> must be an index into the local variable array of the
+ current frame (§3.6). The local variable at <n> must contain a
+ reference. The objectref in the local variable at index is pushed
+ onto the operand stack.
+
+ Notes
+ An aload_<n> instruction cannot be used to load a value of type
+ returnAddress from a local variable onto the operand stack. This
+ asymmetry with the corresponding astore_<n> instruction is intentional.
+ Each of the aload_<n> instructions is the same as aload with an index
+ of <n>, except that the operand <n> is implicit."
+
+ "Modified: / 17-03-2011 / 15:26:53 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+aload_0
+ "
+ Load reference from local variable 0
+ nothing -> objectRef"
+
+ self aload: 0.
+
+ "
+ Description
+ The <n> must be an index into the local variable array of the
+ current frame (§3.6). The local variable at <n> must contain a
+ reference. The objectref in the local variable at index is pushed
+ onto the operand stack.
+
+ Notes
+ An aload_<n> instruction cannot be used to load a value of type
+ returnAddress from a local variable onto the operand stack. This
+ asymmetry with the corresponding astore_<n> instruction is intentional.
+ Each of the aload_<n> instructions is the same as aload with an index
+ of <n>, except that the operand <n> is implicit."
+
+ "Created: / 10-03-2011 / 21:42:22 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 13-03-2011 / 16:56:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+aload_1
+ self aload: 1.
+
+ "Created: / 10-03-2011 / 21:42:27 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 13-03-2011 / 16:56:20 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+aload_2
+ self aload: 2.
+
+ "Created: / 10-03-2011 / 21:42:31 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 13-03-2011 / 16:56:16 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+aload_3
+ self aload: 3.
+
+ "Created: / 10-03-2011 / 21:43:07 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 13-03-2011 / 16:56:24 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+anewarray
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:57:13 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+areturn
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+arraylength
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+astore
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:37:49 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+astore:arg
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+astore_0
+
+
+ ^self astore: 0.
+
+ "Created: / 17-03-2011 / 16:39:06 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+astore_1
+ ^ self astore: 1.
+
+ "Created: / 17-03-2011 / 16:39:10 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+astore_2
+ ^ self astore: 2.
+
+ "Created: / 17-03-2011 / 16:39:13 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+astore_3
+ ^ self astore: 3.
+
+ "Created: / 17-03-2011 / 16:39:16 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+athrow
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:57:25 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+baload
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+bastore
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+bipush
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+breakpoint
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:59:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+caload
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+castore
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+checkcast
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:57:39 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+d2f
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:50:50 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+d2i
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:50:42 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+d2l
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:50:46 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dadd
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+daload
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+dastore
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+dcmpg
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:52:17 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dcmpl
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:52:11 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dconst: arg
+ "Push the double constant <d> (0.0 or 1.0) onto the operand stack.
+ stack: nothing -> const
+ args: nothing"
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Modified: / 17-03-2011 / 15:27:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dconst_0
+"
+Push the double constant <d> (0.0 or 1.0) onto the operand stack.
+stack: nothing -> const
+args: nothing
+"
+ self dconst: 0.
+
+ "Created: / 14-03-2011 / 18:02:36 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dconst_1
+ "
+ Push the double constant <d> (0.0 or 1.0) onto the operand stack.
+ stack: nothing -> const
+ args: nothing"
+
+ self dconst: 1.
+
+ "Created: / 14-03-2011 / 18:03:26 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+ddiv
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:46:25 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dload
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 15:07:14 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dload: arg
+ "
+ Load double from local variable
+ stack: nothing -> value
+ args: nothing"
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+ "
+ Description
+ Both <n> and <n> + 1 must be indices into the local variable array of the current frame (§3.6).
+ The local variable at <n> must contain a double. The value of the local variable at <n> is pushed
+ onto the operand stack.
+
+ Notes
+ Each of the dload_<n> instructions is the same as dload with an index of <n>, except that the
+ operand <n> is implicit."
+
+ "Modified: / 17-03-2011 / 15:26:26 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dload_0
+ "
+ Load double from local variable
+ stack: nothing -> value
+ args: nothing"
+
+ self dload: 0.
+
+ "
+ Description
+ Both <n> and <n> + 1 must be indices into the local variable array of the current frame (§3.6).
+ The local variable at <n> must contain a double. The value of the local variable at <n> is pushed
+ onto the operand stack.
+
+ Notes
+ Each of the dload_<n> instructions is the same as dload with an index of <n>, except that the
+ operand <n> is implicit."
+
+ "Created: / 13-03-2011 / 17:55:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dload_1
+ self dload: 1.
+
+ "Created: / 13-03-2011 / 17:55:33 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dload_2
+ self dload: 2.
+
+ "Created: / 13-03-2011 / 17:55:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dload_3
+ self dload: 3.
+
+ "Created: / 13-03-2011 / 17:55:45 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dmul
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:46:01 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dneg
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:47:42 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+drem
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:47:05 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dreturn
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+dstore
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+dstore: arg
+ "
+ Store double into local variable
+ stack: value -> nothing
+ args: nothing"
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+"
+ Description
+ Both <n> and <n> + 1 must be indices into the local variable array of the
+ current frame (§3.6). The value on the top of the operand stack must be of
+ type double. It is popped from the operand stack and undergoes value set
+ conversion (§3.8.3), resulting in value'. The local variables at <n> and
+ <n> + 1 are set to value'.
+
+ Notes
+ Each of the dstore_<n> instructions is the same as dstore with an index
+ of <n>, except that the operand <n> is implicit."
+
+ "Modified: / 17-03-2011 / 15:28:07 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dstore_0
+ "
+ Store double into local variable
+ stack: value -> nothing
+ args: nothing"
+
+ self dstore: 0.
+
+ "
+ Description
+ Both <n> and <n> + 1 must be indices into the local variable array of the
+ current frame (§3.6). The value on the top of the operand stack must be of
+ type double. It is popped from the operand stack and undergoes value set
+ conversion (§3.8.3), resulting in value'. The local variables at <n> and
+ <n> + 1 are set to value'.
+
+ Notes
+ Each of the dstore_<n> instructions is the same as dstore with an index
+ of <n>, except that the operand <n> is implicit."
+
+ "Created: / 14-03-2011 / 19:04:44 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dstore_1
+"
+Store double into local variable
+stack: value -> nothing
+args: nothing
+"
+
+self dstore: 1.
+"
+Description
+Both <n> and <n> + 1 must be indices into the local variable array of the
+current frame (§3.6). The value on the top of the operand stack must be of
+type double. It is popped from the operand stack and undergoes value set
+conversion (§3.8.3), resulting in value'. The local variables at <n> and
+<n> + 1 are set to value'.
+
+Notes
+Each of the dstore_<n> instructions is the same as dstore with an index
+of <n>, except that the operand <n> is implicit.
+"
+
+ "Created: / 14-03-2011 / 19:04:39 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dstore_2
+ "
+ Store double into local variable
+ stack: value -> nothing
+ args: nothing"
+
+ self dstore: 2.
+
+ "
+ Description
+ Both <n> and <n> + 1 must be indices into the local variable array of the
+ current frame (§3.6). The value on the top of the operand stack must be of
+ type double. It is popped from the operand stack and undergoes value set
+ conversion (§3.8.3), resulting in value'. The local variables at <n> and
+ <n> + 1 are set to value'.
+
+ Notes
+ Each of the dstore_<n> instructions is the same as dstore with an index
+ of <n>, except that the operand <n> is implicit."
+
+ "Created: / 14-03-2011 / 19:04:49 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dstore_3
+ "
+ Store double into local variable
+ stack: value -> nothing
+ args: nothing"
+
+ self dstore: 3.
+
+ "
+ Description
+ Both <n> and <n> + 1 must be indices into the local variable array of the
+ current frame (§3.6). The value on the top of the operand stack must be of
+ type double. It is popped from the operand stack and undergoes value set
+ conversion (§3.8.3), resulting in value'. The local variables at <n> and
+ <n> + 1 are set to value'.
+
+ Notes
+ Each of the dstore_<n> instructions is the same as dstore with an index
+ of <n>, except that the operand <n> is implicit."
+
+ "Created: / 14-03-2011 / 19:04:54 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dsub
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:45:33 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dup
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:44:08 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+dup2
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+dup2_x1
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+dup2_x2
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+dup_x1
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+dup_x2
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+f2d
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:50:35 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+f2i
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:50:26 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+f2l
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:50:31 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fadd
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:44:46 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+faload
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+fastore
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+fcmpg
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:52:00 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fcmpl
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:51:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fconst: arg
+ "
+ Push float constant
+ stack: nothing -> const
+ arg: nothing"
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility.
+ "
+ Description
+ Push the float constant <f> (0.0, 1.0, or 2.0) onto the operand stack."
+
+ "Modified: / 17-03-2011 / 15:28:47 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fconst_0
+ "
+ Push float constant
+ stack: nothing -> const
+ arg: nothing"
+
+ self fconst: 0.
+
+ "
+ Description
+ Push the float constant <f> (0.0, 1.0, or 2.0) onto the operand stack."
+
+ "Created: / 14-03-2011 / 17:56:55 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fconst_1
+ "
+ Push float constant
+ stack: nothing -> const
+ arg: nothing"
+
+ self fconst: 1.
+
+ "
+ Description
+ Push the float constant <f> (0.0, 1.0, or 2.0) onto the operand stack."
+
+ "Created: / 14-03-2011 / 17:57:50 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fconst_2
+ "
+ Push float constant
+ stack: nothing -> const
+ arg: nothing"
+
+ self fconst: 2.
+
+ "
+ Description
+ Push the float constant <f> (0.0, 1.0, or 2.0) onto the operand stack."
+
+ "Created: / 14-03-2011 / 17:57:56 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fdiv
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:46:20 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fload
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 15:07:02 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fload:arg
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+fload_0
+ ^ self fload: 0.
+
+ "Created: / 17-03-2011 / 16:34:59 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fload_1
+ ^ self fload: 1.
+
+ "Created: / 17-03-2011 / 16:35:03 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fload_2
+ ^ self fload: 2.
+
+ "Created: / 17-03-2011 / 16:35:06 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fload_3
+ ^ self fload: 3.
+
+ "Created: / 17-03-2011 / 16:35:11 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fmul
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:45:57 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fneg
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:47:40 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+frem
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:46:47 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+freturn
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:55:16 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fstore
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+fstore: arg
+ "
+ Store float into local variable
+ stack: value -> nothing
+ args: index"
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+ "
+ Description
+ The index is an unsigned byte that must be an index into the local
+ variable array of the current frame (§3.6). The value on the top of
+ the operand stack must be of type float. It is popped from the operand
+ stack and undergoes value set conversion (§3.8.3), resulting in value'.
+ The value of the local variable at index is set to value'.
+
+ Notes
+ The fstore opcode can be used in conjunction with the wide instruction
+ to access a local variable using a two-byte unsigned index."
+
+ "Modified: / 17-03-2011 / 15:29:22 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fstore_0
+ "
+ Store float into local variable
+ stack: value -> nothing
+ args: index"
+
+ self fstore: 0.
+
+ "
+ Description
+ The index is an unsigned byte that must be an index into the local
+ variable array of the current frame (§3.6). The value on the top of
+ the operand stack must be of type float. It is popped from the operand
+ stack and undergoes value set conversion (§3.8.3), resulting in value'.
+ The value of the local variable at index is set to value'.
+
+ Notes
+ The fstore opcode can be used in conjunction with the wide instruction
+ to access a local variable using a two-byte unsigned index."
+
+ "Created: / 14-03-2011 / 17:59:42 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fstore_1
+ "
+ Store float into local variable
+ stack: value -> nothing
+ args: index"
+
+ self fstore: 1.
+
+ "
+ Description
+ The index is an unsigned byte that must be an index into the local
+ variable array of the current frame (§3.6). The value on the top of
+ the operand stack must be of type float. It is popped from the operand
+ stack and undergoes value set conversion (§3.8.3), resulting in value'.
+ The value of the local variable at index is set to value'.
+
+ Notes
+ The fstore opcode can be used in conjunction with the wide instruction
+ to access a local variable using a two-byte unsigned index."
+
+ "Created: / 14-03-2011 / 17:59:49 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fstore_2
+ "
+ Store float into local variable
+ stack: value -> nothing
+ args: index"
+
+ self fstore: 2.
+
+ "
+ Description
+ The index is an unsigned byte that must be an index into the local
+ variable array of the current frame (§3.6). The value on the top of
+ the operand stack must be of type float. It is popped from the operand
+ stack and undergoes value set conversion (§3.8.3), resulting in value'.
+ The value of the local variable at index is set to value'.
+
+ Notes
+ The fstore opcode can be used in conjunction with the wide instruction
+ to access a local variable using a two-byte unsigned index."
+
+ "Created: / 14-03-2011 / 18:00:03 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fstore_3
+ "
+ Store float into local variable
+ stack: value -> nothing
+ args: index"
+
+ self fstore: 3.
+
+ "
+ Description
+ The index is an unsigned byte that must be an index into the local
+ variable array of the current frame (§3.6). The value on the top of
+ the operand stack must be of type float. It is popped from the operand
+ stack and undergoes value set conversion (§3.8.3), resulting in value'.
+ The value of the local variable at index is set to value'.
+
+ Notes
+ The fstore opcode can be used in conjunction with the wide instruction
+ to access a local variable using a two-byte unsigned index."
+
+ "Created: / 14-03-2011 / 18:00:08 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fsub
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:45:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+getfield
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+getstatic
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:55:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+goto
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+goto_w
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:58:54 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+i2d
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:50:02 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+i2f
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:49:57 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+i2l
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:49:52 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+i_dup
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+iadd
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+iaload
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+iand
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+iastore
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+iconst: arg
+ "
+ Push int constant
+ stack: nothing -> const
+ arg: nothing"
+
+ self subclassResponsibility.
+
+ "
+ Description
+ Push the int constant <i> (-1, 0, 1, 2, 3, 4 or 5) onto the operand stack.
+
+ Notes
+ Each of this family of instructions is equivalent to bipush <i> for the
+ respective value of <i>, except that the operand <i> is implicit."
+
+ "Created: / 17-03-2011 / 15:29:48 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 20-03-2011 / 20:41:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+iconst_0
+ "
+ Push int constant
+ stack: nothing -> const
+ arg: nothing"
+
+ self iconst: 0.
+
+ "
+ Description
+ Push the int constant <i> (-1, 0, 1, 2, 3, 4 or 5) onto the operand stack.
+
+ Notes
+ Each of this family of instructions is equivalent to bipush <i> for the
+ respective value of <i>, except that the operand <i> is implicit."
+
+ "Modified: / 17-03-2011 / 15:30:00 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+iconst_1
+ self iconst:1.
+
+ "Modified: / 17-03-2011 / 15:30:07 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+iconst_2
+ self iconst: 2.
+
+ "Modified: / 17-03-2011 / 15:30:11 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+iconst_3
+ self iconst: 3.
+
+ "Modified: / 17-03-2011 / 15:30:15 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+iconst_4
+ self iconst: 4.
+
+ "Modified: / 17-03-2011 / 15:30:19 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+iconst_5
+ self iconst: 5.
+
+ "Modified: / 17-03-2011 / 15:30:22 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+iconst_m1
+ self iconst: -1.
+
+ "Modified: / 17-03-2011 / 15:30:27 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+idiv
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ifacmpeq
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:53:47 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+ifacmpne
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:53:54 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+ifeq
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ifge
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ifgt
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ificmpeq
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ificmpge
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ificmpgt
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ificmple
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ificmplt
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ificmpne
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ifle
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+iflt
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ifne
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ifnonnull
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:58:39 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+ifnull
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:58:32 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+iinc
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+iload
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 15:06:42 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+iload: arg
+ "
+ loads an int value from local variable 0
+ stack: nothing -> value
+ args: nothing"
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+ "
+ Description
+ The <n> must be an index into the local variable array of the current frame (§3.6).
+ The local variable at <n> must contain an int. The value of the local variable
+ at <n> is pushed onto the operand stack.
+
+ Notes
+ Each of the iload_<n> instructions is the same as iload with an index of <n>,
+ except that the operand <n> is implicit."
+
+ "Modified: / 17-03-2011 / 15:30:58 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+iload_0
+ "
+ loads an int value from local variable 0
+ stack: nothing -> value
+ args: nothing"
+
+ self iload: 0.
+
+ "
+ Description
+ The <n> must be an index into the local variable array of the current frame (§3.6).
+ The local variable at <n> must contain an int. The value of the local variable
+ at <n> is pushed onto the operand stack.
+
+ Notes
+ Each of the iload_<n> instructions is the same as iload with an index of <n>,
+ except that the operand <n> is implicit."
+
+ "Created: / 06-03-2011 / 21:22:17 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 13-03-2011 / 20:58:31 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+iload_1
+ "check iload_0"
+ self iload: 1.
+
+ "Created: / 06-03-2011 / 21:22:30 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 13-03-2011 / 16:36:59 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+iload_2
+ "check iload_0"
+ self iload:2.
+
+ "Created: / 06-03-2011 / 21:24:02 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+iload_3
+ "check iload_0"
+
+ self iload: 3.
+
+ "Created: / 14-03-2011 / 19:05:26 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+imul
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ineg
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:47:24 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+instanceof
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:57:57 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+int2byte
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:51:03 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+int2char
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:51:08 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+int2short
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:51:13 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+invinterface
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:56:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+invnonvirt
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:56:26 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+invstatic
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+invvirt
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:56:21 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+ior
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+irem
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ireturn
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ishl
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ishr
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+istore
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:36:55 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+istore: arg
+ "store int value into variable 0
+ stack: value -> nothing
+ args: nothing"
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+ "
+ Description
+ The <n> must be an index into the local variable array of the current frame (§3.6).
+ The value on the top of the operand stack must be of type int. It is popped from
+ the operand stack, and the value of the local variable at <n> is set to value.
+
+ Notes
+ Each of the istore_<n> instructions is the same as istore with an index of <n>,
+ except that the operand <n> is implicit."
+
+ "Modified: / 17-03-2011 / 15:31:20 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+istore_0
+ "store int value into variable 0
+ stack: value -> nothing
+ args: nothing"
+
+ self istore: 0.
+
+ "
+ Description
+ The <n> must be an index into the local variable array of the current frame (§3.6).
+ The value on the top of the operand stack must be of type int. It is popped from
+ the operand stack, and the value of the local variable at <n> is set to value.
+
+ Notes
+ Each of the istore_<n> instructions is the same as istore with an index of <n>,
+ except that the operand <n> is implicit."
+
+ "Created: / 06-03-2011 / 21:01:27 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 17-03-2011 / 15:31:16 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+istore_1
+ "check istore_0"
+ self istore: 1.
+
+ "Created: / 06-03-2011 / 21:18:15 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+istore_2
+ "check istore_0"
+ self istore: 2.
+
+ "Created: / 06-03-2011 / 21:23:54 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+istore_3
+ "check istore_0"
+
+ self istore: 3.
+
+ "Created: / 14-03-2011 / 19:05:12 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+isub
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+iushr
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ixor
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+jsr
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:54:10 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+jsr_w
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:58:58 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+l2d
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:50:17 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+l2f
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:50:14 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+l2i
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:50:09 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+ladd
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:44:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+laload
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+land
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:48:57 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lastore
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+lcmp
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:51:30 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lconst: arg
+ "
+ Push long constant
+ stack: nothing -> const
+ arg: nothing"
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+ "
+ Push the long constant <l> (0 or 1) onto the operand stack."
+
+ "Modified: / 17-03-2011 / 16:30:28 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lconst_0
+ "
+ Push long constant
+ stack: nothing -> const
+ arg: nothing"
+
+ self lconst: 0.
+
+ "
+ Push the long constant <l> (0 or 1) onto the operand stack."
+
+ "Created: / 14-03-2011 / 17:53:32 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 17-03-2011 / 16:28:58 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lconst_1
+ "
+ Push long constant
+ stack: nothing -> const
+ arg: nothing"
+
+ self lconst: 1.
+
+ "
+ Push the long constant <l> (0 or 1) onto the operand stack."
+
+ "Created: / 14-03-2011 / 17:53:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 17-03-2011 / 16:29:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+ldc1
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ldc2
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ldc2w
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ldiv
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:46:16 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lload
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 15:06:08 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lload: arg
+ "
+ Load long from local variable
+ stack: nothing -> value
+ args: nothing"
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility.
+
+ "
+ Description
+ Both <n> and <n> + 1 must be indices into the local variable array of the
+ current frame (§3.6). The local variable at <n> must contain a long. The
+ value of the local variable at <n> is pushed onto the operand stack.
+
+ Notes
+ Each of the lload_<n> instructions is the same as lload with an index
+ of <n>, except that the operand <n> is implicit."
+
+ "Modified: / 17-03-2011 / 16:33:33 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lload_0
+"
+Load long from local variable
+stack: nothing -> value
+args: nothing
+"
+ self lload: 0.
+
+"
+Description
+Both <n> and <n> + 1 must be indices into the local variable array of the
+current frame (§3.6). The local variable at <n> must contain a long. The
+value of the local variable at <n> is pushed onto the operand stack.
+
+Notes
+Each of the lload_<n> instructions is the same as lload with an index
+of <n>, except that the operand <n> is implicit.
+"
+
+ "Created: / 14-03-2011 / 13:38:11 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lload_1
+self lload: 1.
+
+ "Created: / 14-03-2011 / 13:37:42 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lload_2
+ self lload: 2.
+
+ "Created: / 14-03-2011 / 13:38:39 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lload_3
+ self lload: 3.
+
+ "Created: / 14-03-2011 / 13:38:43 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lmul
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:45:53 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lneg
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:47:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lookupswtch
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:55:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lor
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:49:03 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lrem
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:46:58 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lreturn
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+lshl
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:48:09 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lshr
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:48:21 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lstore
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:37:14 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lstore:arg
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+lstore_0
+ "store long into local variable 0
+ stack: value -> nothing
+ args: nothing"
+
+ self lstore: 0.
+
+ "
+ Description
+ Both <n> and <n> + 1 must be indices into the local variable array of the
+ current frame (§3.6). The value on the top of the operand stack must be
+ of type long. It is popped from the operand stack, and the local variables
+ at <n> and <n> + 1 are set to value.
+
+ Notes
+ Each of the lstore_<n> instructions is the same as lstore with an index
+ of <n>, except that the operand <n> is implicit."
+
+ "Created: / 14-03-2011 / 17:54:43 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lstore_1
+ "store long into local variable
+ stack: value -> nothing
+ args: nothing"
+
+ self lstore: 1.
+
+ "
+ Description
+ Both <n> and <n> + 1 must be indices into the local variable array of the
+ current frame (§3.6). The value on the top of the operand stack must be
+ of type long. It is popped from the operand stack, and the local variables
+ at <n> and <n> + 1 are set to value.
+
+ Notes
+ Each of the lstore_<n> instructions is the same as lstore with an index
+ of <n>, except that the operand <n> is implicit."
+
+ "Created: / 14-03-2011 / 17:55:15 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lstore_2
+ "store long into local variable
+ stack: value -> nothing
+ args: nothing"
+
+ self lstore: 2.
+
+ "
+ Description
+ Both <n> and <n> + 1 must be indices into the local variable array of the
+ current frame (§3.6). The value on the top of the operand stack must be
+ of type long. It is popped from the operand stack, and the local variables
+ at <n> and <n> + 1 are set to value.
+
+ Notes
+ Each of the lstore_<n> instructions is the same as lstore with an index
+ of <n>, except that the operand <n> is implicit."
+
+ "Created: / 14-03-2011 / 17:55:20 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lstore_3
+ "store long into local variable
+ stack: value -> nothing
+ args: nothing"
+
+ self lstore: 3.
+
+ "
+ Description
+ Both <n> and <n> + 1 must be indices into the local variable array of the
+ current frame (§3.6). The value on the top of the operand stack must be
+ of type long. It is popped from the operand stack, and the local variables
+ at <n> and <n> + 1 are set to value.
+
+ Notes
+ Each of the lstore_<n> instructions is the same as lstore with an index
+ of <n>, except that the operand <n> is implicit."
+
+ "Created: / 14-03-2011 / 17:56:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lsub
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:45:25 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lushr
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:48:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+lxor
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:49:09 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+monenter
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:58:06 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+monexit
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:58:10 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+multianewarray
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:58:28 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+new
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+newarray
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+nop
+"Do nothing"
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Modified: / 17-03-2011 / 16:27:12 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+pop1
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:43:07 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+pop2
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+putfield
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+putstatic
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+ret
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:54:31 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+ret_w
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:59:12 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+return
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+saload
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+sastore
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+sipush
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+swap
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+!
+
+tableswtch
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:54:55 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+wide
+ "raise an error: must be redefined in concrete subclass(es)"
+
+ ^ self subclassResponsibility
+
+ "Created: / 17-03-2011 / 16:58:16 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+! !
+
+!JavaByteCodeProcessor methodsFor:'private-helpers'!
+
+fetchByte
+ "fetch sign extended byte value stored in bytecode"
+ pc := pc + 1.
+ ^ (byteCode at: (pc - 1)) signExtendedByteValue.
+
+ "Created: / 06-03-2011 / 22:26:09 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 17-03-2011 / 17:00:30 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fetchBytes2
+ "fetch sign extended 2 byte value stored in bytecode"
+ pc := pc + 2.
+ ^ (((byteCode at: (pc - 2)) bitShift: 8) + (byteCode at: (pc - 1)))
+ signExtendedShortValue.
+
+ "Created: / 06-03-2011 / 21:12:07 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 17-03-2011 / 17:00:43 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fetchBytes4
+ "fetch sign extended 4 byte value stored in bytecode"
+
+ pc := pc + 4.
+ ^ (((((byteCode at: (pc - 4)) bitShift: 24)
+ bitOr: ((byteCode at: (pc - 3)) bitShift: 16))
+ bitOr: ((byteCode at: (pc - 2)) bitShift: 8))
+ bitOr: (byteCode at: (pc - 1))) asSigned32.
+
+ "Created: / 21-03-2011 / 12:59:26 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 21-03-2011 / 15:10:22 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fetchIndex
+ "fetch index value from bytecode"
+ pc := pc + 1.
+ ^ (byteCode at: (pc - 1)).
+
+ "Created: / 24-02-2011 / 22:37:18 / Marcel Hlopko <hlopik@gmail.com>"
+ "Modified: / 17-03-2011 / 17:01:14 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+fetchIndex2
+ "fetch index 2 byte value from bytecode"
+ pc := pc + 2.
+ ^ ((byteCode at: (pc - 2)) bitShift: 8) bitOr: (byteCode at: (pc - 1)).
+
+ "Modified: / 24-02-2011 / 21:33:53 / Marcel Hlopko <hlopik@gmail.com>"
+ "Modified: / 17-03-2011 / 17:01:24 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+pop
+ "return and remove top of the stack"
+
+ sp := sp - 1.
+ ^ context at: sp + 1.
+
+ "Modified: / 17-03-2011 / 17:39:09 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+popDouble
+ "so far I didn't find a reason to handle doubles and long on stack differently"
+ ^ self pop.
+
+ "Modified: / 17-03-2011 / 17:02:34 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+popLong
+"so far I didn't find a reason to handle doubles and long on stack differently"
+ ^ self pop.
+
+ "Modified: / 17-03-2011 / 17:02:38 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+pushConstant: something
+ "push constant value on the stack - is there really not any better push method?"
+ sp := sp + 1.
+ context at: sp put: something
+
+ "Modified: / 17-03-2011 / 17:05:56 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+pushDouble: something
+ "push double value on the stack"
+
+ ^ self pushInt: something.
+
+ "Modified: / 17-03-2011 / 17:06:28 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+pushFloat: something
+ "push float value on the stack"
+ self pushInt: something.
+
+ "Created: / 13-03-2011 / 16:39:52 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 17-03-2011 / 17:06:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+pushInt: something
+ "push integer value on the stack"
+ sp := sp + 1.
+ context at: sp put: something
+
+ "Created: / 13-03-2011 / 17:28:16 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 17-03-2011 / 17:06:52 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+pushLong: something
+ "push long value on the stack"
+
+ ^ self pushInt: something.
+
+ "sp := sp + 2.
+ context at: sp - 1 put: #'dummy long complement'.
+ context at: sp put: something asLargeInteger."
+
+ "Modified: / 17-03-2011 / 17:07:06 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+pushNewArrayOf: type sized: size
+ "push new array of type with <size> slots"
+
+ self pushRef: ((JavaArray javaArrayClassFor: type) new: size).
+
+ "Created: / 14-03-2011 / 18:36:15 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 27-03-2011 / 21:06:30 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+pushNewPrimitiveArrayOf: typeName sized: size
+ "push new array of <typeName> (e.g. 'long', only primitive types) with <size> slots"
+
+ self
+ pushRef: ((JavaArray
+ javaArrayClassFor: (JavaDescriptor baseTypesByTypeName at: typeName))
+ new: size).
+
+ "Created: / 27-03-2011 / 21:06:07 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+pushRef: something
+ "push java ref on the stack"
+ sp := sp + 1.
+ context at: sp put: something
+
+ "Created: / 13-03-2011 / 16:35:55 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 21-03-2011 / 16:49:30 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+relativeJump: pos
+ "move pc relatively by the position <pos>."
+
+ pc := instrPointer + pos.
+
+ "Created: / 21-03-2011 / 18:19:44 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+skipPadding
+ "in tableswitch and lookupswitch instructions, there's a padding after instruction to ensure
+ 32bit values following begin at address that is multiple of 4 bytes from the start of the current
+ method bytecode"
+
+ | jmpSize |
+
+ jmpSize := ((4 - (pc \\ 4)) + 1) \\ 4.
+ pc := pc + jmpSize.
+ ^ jmpSize.
+
+ "Created: / 21-03-2011 / 13:13:55 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 22-03-2011 / 15:54:23 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+tos
+ ^ context at:sp.
+! !
+
+!JavaByteCodeProcessor methodsFor:'private-logging'!
+
+log: aMessage
+self class log: aMessage.
+
+ "Created: / 17-03-2011 / 14:59:56 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+! !
+
+!JavaByteCodeProcessor methodsFor:'processing loop'!
+
+enterProcessingLoop
+ Context cannotReturnSignal handle:
+ [:ex |
+ "/ this is required for blocks of this method, which do a homeReturn.
+ "/ since my context is not really on the stack (and therefore not returnable),
+ "/ catch the error and return manually.
+ ^ ex parameter ]
+ do:
+ [ [ leaveProcessor ] whileFalse:
+ [ instrPointer := pc.
+ op := byteCode at: pc.
+ pc := pc + 1.
+ self switch: op. ]. ].
+
+ "Created: / 31-03-2011 / 16:38:01 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+handleAbstractMethod
+ self subclassResponsibility.
+
+ "Created: / 22-03-2011 / 14:49:43 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+initializeContextArgsFrom: argArray
+ 1 to: numArgs do: [:idx | context at: idx put: (argArray at: idx). ]
+
+ "Created: / 21-03-2011 / 15:17:23 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+initializeContextVars
+ 1 to: numVars do: [:idx | context at: (numArgs + idx) put: nil. ]
+!
+
+leaveProcessorWith: aReturnObject
+ retVal := aReturnObject.
+ leaveProcessor := true
+
+ "Modified: / 17-03-2011 / 17:39:21 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+process: aMethod receiver: aReceiver arguments: args
+ | argArray |
+
+ aMethod isAbstract
+ ifTrue:
+ [ ('Processing abstract method ' , aMethod displayString) infoPrintCR.
+ ^ self handleAbstractMethod. ].
+ args size ~~ aMethod javaNumArgs
+ ifTrue: [ self error: 'bad number of arguments' ].
+ aMethod isStatic
+ ifTrue: [ argArray := args ]
+ ifFalse:
+ [ argArray := OrderedCollection with: aReceiver.
+ args ifNotNil: [ argArray addAll: args. ]. ].
+ numArgs := argArray size.
+ numVars := aMethod numVars.
+ method := aMethod.
+ context := JavaContext new: (numArgs + numVars + aMethod stackSize).
+ context setNumArgs: numArgs numVars: numVars.
+ receiver := aReceiver.
+ byteCode := aMethod byteCode.
+ constantPool := aMethod constantPool.
+ pc := 1.
+ wide := false.
+ self initializeContextArgsFrom: argArray.
+ self initializeContextVars.
+ sp := numArgs + numVars.
+ leaveProcessor := false.
+ self enterProcessingLoop.
+ ^ retVal
+
+ "Modified: / 24-02-2011 / 11:09:07 / Marcel Hlopko <hlopik@gmail.com>"
+ "Created: / 17-03-2011 / 17:25:31 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 31-03-2011 / 16:38:05 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+switch: op
+
+ self log: 'invoking ' , (OpSwitchTable at: op + 1) printString , '(' , op printString , ')'.
+ self perform: (OpSwitchTable at: op + 1)
+
+ "Modified: / 17-03-2011 / 15:01:15 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 22-03-2011 / 20:55:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaByteCodeProcessor class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/cg/newCompiler/ByteCodeProcessor.st,v 1.8 2008/11/04 12:42:00 cg Exp $'
+!
+
+version_SVN
+ ^ '$Id$'
+! !
+
+JavaByteCodeProcessor initialize!