ClassFileAnalyzer (Can) |
Home |
Example: TestCanStackTest directive
/* TestCanStack.java */ public class TestCanStack implements Runnable { public void run() { System.out.println("run..."); } public static void main(String[] args) { TestCanStack tcs = new TestCanStack(); Thread t = new Thread(tcs); t.start(); try { Thread.sleep(2000); } catch (InterruptedException e) { System.out.println(e.toString()); } } }
> javac TestCanStack.java > java ClassFileAnalyzer TestCanStack.class
; TestCanStack.j
; Generated by ClassFileAnalyzer (Can)
; Analyzer and Disassembler for Java class files
; (Jasmin syntax 2, http://jasmin.sourceforge.net)
;
; ClassFileAnalyzer, version 0.7.0
.bytecode 50.0
.source TestCanStack.java
.class public TestCanStack
.super java/lang/Object
.implements java/lang/Runnable
.method public <init>()V
.limit stack 1
.limit locals 1
.line 3
0: aload_0
1: invokespecial java/lang/Object/<init>()V
4: return
.end method
.method public run()V
.limit stack 2
.limit locals 1
.line 6
0: getstatic java/lang/System/out Ljava/io/PrintStream;
3: ldc "run..."
5: invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
.line 7
8: return
.end method
.method public static main([Ljava/lang/String;)V
.limit stack 3
.limit locals 4
.line 10
0: new TestCanStack
3: dup
4: invokespecial TestCanStack/<init>()V
7: astore_1
.line 12
8: new java/lang/Thread
11: dup
12: aload_1
13: invokespecial java/lang/Thread/<init>(Ljava/lang/Runnable;)V
16: astore_2
.line 13
17: aload_2
18: invokevirtual java/lang/Thread/start()V
Label21:
.line 15
21: ldc2_w 2000
24: invokestatic java/lang/Thread/sleep(J)V
Label27:
.line 18
27: goto Label41
Label30:
.line 16
30: astore_3
.line 17
31: getstatic java/lang/System/out Ljava/io/PrintStream;
34: aload_3
35: invokevirtual java/lang/InterruptedException/toString()Ljava/lang/String;
38: invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
Label41:
.line 19
41: return
.catch java/lang/InterruptedException from Label21 to Label27 using Label30
; full_frame (frameNumber = 0)
; frame_type = 255, offset_delta = 30
; frame bytes: 255 0 30 0 3 7 0 25 7 0 26 7 0 27 0 1 7 0 28
.stack
offset 30
locals Object [Ljava/lang/String;
locals Object TestCanStack
locals Object java/lang/Thread
stack Object java/lang/InterruptedException
.end stack
; same_frame (frameNumber = 1)
; frame_type = 10, offset_delta = 10
; frame bytes: 10
.stack
offset 41
locals Object [Ljava/lang/String;
locals Object TestCanStack
locals Object java/lang/Thread
.end stack
.end method
> java Jasmin TestCanStack.j --> TestCanStack.class Attribute StackMapTable within TestCanStack.class: StackMapTable_attribute = 0 26 0 0 0 22 0 2 255 0 30 0 3 7 0 4 7 0 33 7 0 20 0 1 7 0 37 10 Structure of StackMapTable_attribute: StackMapTable_attribute { u2 attribute_name_index; u4 attribute_length u2 number_of_entries; stack_map_frame entries[number_of_entries]; } union { same_frame; same_locals_1_stack_item_frame; same_locals_1_stack_item_frame_extended; chop_frame; same_frame_extended; append_frame; full_frame; } stack_map_frame same_frame { u1 frame_type = SAME; /* 0-63 */ } same_locals_1_stack_item_frame { u1 frame_type = SAME_LOCALS_1_STACK_ITEM; /* 64-127 */ verification_type_info stack[1]; } same_locals_1_stack_item_frame_extended { u1 frame_type = SAME_LOCALS_1_STACK_ITEM_EXTENDED; /* 247 */ u2 offset_delta; verification_type_info stack[1]; } chop_frame { u1 frame_type=CHOP; /* 248-250 */ u2 offset_delta; } same_frame_extended { u1 frame_type = SAME_FRAME_EXTENDED; /* 251 */ u2 offset_delta; } append_frame { u1 frame_type = APPEND; /* 252-254 */ u2 offset_delta; verification_type_info locals[frame_type -251]; } full_frame { u1 frame_type = FULL_FRAME; /* 255 */ u2 offset_delta; u2 number_of_locals; verification_type_info locals[number_of_locals]; u2 number_of_stack_items; verification_type_info stack[number_of_stack_items]; } union { Top_variable_info; Integer_variable_info; Float_variable_info; Long_variable_info; Double_variable_info; Null_variable_info; UninitializedThis_variable_info; Object_variable_info; Uninitialized_variable_info; } verification_type_info Top_variable_info { u1 tag = ITEM_Top; /* 0 */ } Integer_variable_info { u1 tag = ITEM_Integer; /* 1 */ } Float_variable_info { u1 tag = ITEM_Float; /* 2 */ } Long_variable_info { u1 tag = ITEM_Long; /* 4 */ } Double_variable_info { u1 tag = ITEM_Double; /* 3 */ } Null_variable_info { u1 tag = ITEM_Null; /* 5 */ } UninitializedThis_variable_info { u1 tag = ITEM_UninitializedThis; /* 6 */ } Object_variable_info { u1 tag = ITEM_Object; /* 7 */ u2 cpool_index; } Uninitialized_variable_info { u1 tag = ITEM_Uninitialized /* 8 */ u2 offset; }
|