Skip to content

Instantly share code, notes, and snippets.

@YujiSoftware
Last active December 22, 2015 21:48
Show Gist options
  • Save YujiSoftware/5226330 to your computer and use it in GitHub Desktop.
Save YujiSoftware/5226330 to your computer and use it in GitHub Desktop.
java version "1.6.0_25-ea-fastdebug" Java(TM) SE Runtime Environment (build 1.6.0_25-ea-fastdebug-b03) Java HotSpot(TM) Server VM (build 20.0-b10-fastdebug, mixed mode)
{method}
- klass: {other class}
- this oop: 0x10252480
- method holder: 'StringJoin'
- constants: 0x10252078 constant pool [54] for 'StringJoin' cache=0x10252690
- access: 0xc100008a private static transient
- name: 'joinTest'
- signature: '([Ljava/lang/String;)Ljava/lang/String;'
- max stack: 2
- max locals: 6
- size of params: 1
- method size: 24
- vtable index: -2
- i2i entry: 0x0217b700
- adapter: 0x0213b66c
- compiled entry 0x0221ab87
- code size: 51
- code start: 0x10252440
- code end (excl): 0x10252473
- method data: 0x10255718
- checked ex length: 0
- linenumber start: 0x10252473
- localvar length: 0
#
# java/lang/String:exact * ( java/lang/String:exact *[int:>=0]:exact * )
#
#r000 ecx : parm 0: java/lang/String:exact *[int:>=0]:exact *
# -- Old esp -- Framesize: 80 --
#r045 esp+76: return address
#r044 esp+72: pad2, in_preserve
#r043 esp+68: pad2, in_preserve
#r042 esp+64: Fixed slot 0
#r061 esp+60: spill
#r060 esp+56: spill
#r059 esp+52: spill
#r058 esp+48: spill
#r057 esp+44: spill
#r056 esp+40: spill
#r055 esp+36: spill
#r054 esp+32: spill
#r053 esp+28: spill
#r052 esp+24: spill
#r051 esp+20: spill
#r050 esp+16: spill
#r049 esp+12: spill
#r048 esp+ 8: outgoing argument
#r047 esp+ 4: outgoing argument
#r046 esp+ 0: outgoing argument
#
abababab N1: # B1 <- B46 B44 B29 B42 B45 B43 B54 Freq: 1
abababab
000 B1: # B46 B2 <- BLOCK HEAD IS JUNK Freq: 1
000 # stack bang
PUSHL EBP
SUB ESP,72 # Create frame
00e MOV EBX,ECX
010 MOV EAX,[ECX + #8]
013 NullCheck ECX
013
013 B2: # B38 B3 <- B1 Freq: 0.999999
013 TEST EAX,EAX
015 Jle B38 P=0.000993 C=26191.000000
015
01b B3: # B44 B4 <- B2 Freq: 0.999006
01b TESTu EAX,EAX
01d Jbe,u B44 P=0.000001 C=-1.000000
01d
023 B4: # B44 B5 <- B3 Freq: 0.999005
023 MOV ECX,EAX
025 DEC ECX
026 CMPu ECX,EAX
028 Jnb,u B44 P=0.000001 C=-1.000000
028
02e B5: # B9 <- B4 Freq: 0.999004
02e MOV [ESP + #16],EAX
032 MOV [ESP + #12],EBX
036 MOV EBX,FS:[0x00]
03d MOV ECX,[EBX + TLS::thread_ptr_offset()]
043 MOV [ESP + #20],ECX
047 MOV ECX,[ESP + #12]
04b MOV EBP,java/lang/String:exact *
050 MOV [ESP + #32],EBP
054 XOR EBP,EBP
056 JMP,s B9
NOP # 8 bytes pad for loops and calls
060 B6: # B7 <- B26 top-of-loop Freq: 983.557
060 MOV EBX,[ESP + #44]
064 MOV ECX,[EBX] # int
066 MOV EBX,EDX
068 MOV [EBX],ECX
06a MOV EBX,[ESP + #28]
06e LEA ECX,[EBX + #16]
071 ADD EDI,#-16
074 SHR EDI,#3
077 MOV [ESP + #0],ECX
07a MOV [ESP + #4],EAX
07e MOV [ESP + #8],EDI
082 CALL_LEAF_NOFP,runtime jlong_disjoint_arraycopy
No JVM State Info
#
087
087 B7: # B28 B8 <- B27 B6 B40 B41 Freq: 984.544
087
087 MOV ECX,[ESP + #32]
08b MOV EBP,[ESP + #40]
08f MOV [ECX + #8],EBP ! Field java/lang/String.value
092 MOV EBP,[ESP + #48]
096 INC EBP
097 MOV EBX, ECX # CastP2X
099 SHR EBX,#9
09c MOV8 [EBX + 0x051aff80],#0
0a3 MEMBAR-release ! (empty encoding)
0a3 CMP EBP,[ESP + #16]
0a7 Jge B28 # Loop end P=0.000993 C=26164.000000
0a7
0ad B8: # B9 <- B7 Freq: 983.567
0ad MOV EBX,[ESP + #12]
0b1 MOV ECX,[ESP + #48]
0b5 LEA ECX,[EBX + #4 + ECX << #2]
0b5
0b9 B9: # B32 B10 <- B5 B8 Loop: B9-B8 inner stride: not constant Freq: 984.586
0b9 MOV EBX,[ESP + #20]
0bd MOV EAX,[EBX + #68]
0c0 MOV EBX,[ECX + #12]
0c3 MOV [ESP + #24],EBX
0c7 LEA EBX,[EAX + #16]
0ca MOV ECX,[ESP + #20]
0ce CMPu EBX,[ECX + #76]
0d1 Jnb,u B32 P=0.000100 C=-1.000000
0d1
0d7 B10: # B11 <- B9 Freq: 984.487
0d7 MOV [ECX + #68],EBX
0da PREFETCHNTA [EBX + #192] ! Prefetch into non-temporal cache for write
0e1 MOV ECX,precise klass java/lang/StringBuilder: 0x02123c10:Constant:exact *
0e6 MOV ECX,[ECX + #104]
0e9 MOV [EAX],ECX
0eb MOV [EAX + #4],precise klass java/lang/StringBuilder: 0x02123c10:Constant:exact *
0f2 XOR ECX.lo,ECX.lo
XOR ECX.hi,ECX.hi
0f6 MOV [EAX + #8],ECX.lo
MOV [EAX + #8]+4,ECX.hi
0f6
0fc B11: # B30 B12 <- B33 B10 Freq: 984.586
0fc
0fc #checkcastPP of EAX
0fc MOV [ESP + #28],EAX
100 MOV ECX,[ESP + #20]
104 MOV EAX,[ECX + #68]
107 LEA ECX,[EAX + #48]
10a MOV EDI,[ESP + #20]
10e CMPu ECX,[EDI + #76]
111 Jnb,u B30 P=0.000100 C=-1.000000
111
117 B12: # B13 <- B11 Freq: 984.487
117 MOV [EDI + #68],ECX
11a PREFETCHNTA [ECX + #192] ! Prefetch into non-temporal cache for write
121 MOV [EAX],0x00000001
127 PREFETCHNTA [ECX + #256] ! Prefetch into non-temporal cache for write
12e MOV [EAX + #4],precise klass [C: 0x0212de28:Constant:exact *
135 PREFETCHNTA [ECX + #320] ! Prefetch into non-temporal cache for write
13c MOV [EAX + #8],#16
143 PREFETCHNTA [ECX + #384] ! Prefetch into non-temporal cache for write
14a MOV [EAX + #12],#0
151 XOR ECX.lo,ECX.lo
XOR ECX.hi,ECX.hi
155 MOV [EAX + #16],ECX.lo
MOV [EAX + #16]+4,ECX.hi
15b MOV [EAX + #24],ECX.lo
MOV [EAX + #24]+4,ECX.hi
161 MOV [EAX + #32],ECX.lo
MOV [EAX + #32]+4,ECX.hi
167 MOV [EAX + #40],ECX.lo
MOV [EAX + #40]+4,ECX.hi
16d MOV [ESP + #48],EBP
16d
171 B13: # B52 B14 <- B31 B12 Freq: 984.586
171
171 #checkcastPP of EAX
171 MOV ECX,[ESP + #28]
175 MOV [ECX + #12],EAX ! Field java/lang/AbstractStringBuilder.value
178 MOV EBX, ECX # CastP2X
17a SHR EBX,#9
17d MOV8 [EBX + 0x051aff80],#0
184 MOV EDX,[ESP + #32]
188 NOP # 3 bytes pad for loops and calls
18b CALL,static java.lang.AbstractStringBuilder::append
# java.lang.StringBuilder::append @ bci:2 L[0]=esp + #28 L[1]=_
# StringJoin::joinTest @ bci:31 L[0]=_ L[1]=_ L[2]=esp + #12 L[3]=esp + #16 L[4]=esp + #48 L[5]=esp + #24
# OopMap{[12]=Oop [24]=Oop [28]=Oop off=400}
190
190 B14: # B53 B15 <- B13 Freq: 984.566
# Block is sole successor of call
190 MOV ECX,[ESP + #28]
194 MOV EDX,[ESP + #24]
198 NOP # 3 bytes pad for loops and calls
19b CALL,static java.lang.AbstractStringBuilder::append
# java.lang.StringBuilder::append @ bci:2 L[0]=esp + #28 L[1]=_
# StringJoin::joinTest @ bci:36 L[0]=_ L[1]=_ L[2]=esp + #12 L[3]=esp + #16 L[4]=esp + #48 L[5]=_
# OopMap{[12]=Oop [28]=Oop off=416}
1a0
1a0 B15: # B34 B16 <- B14 Freq: 984.546
# Block is sole successor of call
1a0 MOV ECX,[ESP + #20]
1a4 MOV EBP,[ECX + #68]
1a7 LEA EBX,[EBP + #24]
1aa CMPu EBX,[ECX + #76]
1ad Jnb,u B34 P=0.000100 C=-1.000000
1ad
1b3 B16: # B17 <- B15 Freq: 984.448
1b3 MOV [ECX + #68],EBX
1b6 PREFETCHNTA [EBX + #192] ! Prefetch into non-temporal cache for write
1bd MOV ECX,precise klass java/lang/String: 0x02122388:Constant:exact *
1c2 MOV EBX,[ECX + #104]
1c5 MOV [EBP],EBX
1c8 MOV [EBP + #4],precise klass java/lang/String: 0x02122388:Constant:exact *
1cf XOR ECX.lo,ECX.lo
XOR ECX.hi,ECX.hi
1d3 MOV [EBP + #8],ECX.lo
MOV [EBP + #8]+4,ECX.hi
1d9 MOV [EBP + #16],ECX.lo
MOV [EBP + #16]+4,ECX.hi
1d9
1df B17: # B42 B18 <- B35 B16 Freq: 984.546
1df
1df #checkcastPP of EBP
1df MOV [ESP + #32],EBP
1e3 MOV ECX,[ESP + #28]
1e7 MOV ECX,[ECX + #8] # int ! Field java/lang/AbstractStringBuilder.count
1ea MOV [ESP + #24],ECX
1ee TEST ECX,ECX
1f0 Jl B42 P=0.000000 C=23830.000000
1f0
1f6 B18: # B45 B19 <- B17 Freq: 984.546
1f6 MOV ECX,[ESP + #28]
1fa MOV EBX,[ECX + #12] ! Field java/lang/AbstractStringBuilder.value
1fd MOV [ESP + #28],EBX
201 MOV EBP,[EBX + #8]
204 NullCheck EBX
204
204 B19: # B43 B20 <- B18 Freq: 984.545
204 MOV EBX,EBP
206 SUB EBX,[ESP + #24]
20a TEST EBX,EBX
20c Jl B43 P=0.000000 C=23830.000000
20c
212 B20: # B36 B21 <- B19 Freq: 984.544
212 MOV EBX,[ESP + #32]
216 MOV ECX,[ESP + #24]
21a MOV [EBX + #16],ECX ! Field java/lang/String.count
21d MOV EBX,ECX
21f SHL EBX,#1
221 ADD EBX,#19
224 MOV [ESP + #36],EBX
228 MOV EDI,EBX
22a AND EDI,#-8
22d CMPu ECX,#524288
233 Jnbe,u B36 P=0.000001 C=-1.000000
233
239 B21: # B36 B22 <- B20 Freq: 984.543
239 MOV EBX,[ESP + #20]
23d MOV ECX,[EBX + #68]
240 MOV EBX,ECX
242 ADD EBX,EDI
244 MOV EDX,[ESP + #20]
248 CMPu EBX,[EDX + #76]
24b Jnb,u B36 P=0.000100 C=-1.000000
24b
251 B22: # B23 <- B21 Freq: 984.445
251 MOV [EDX + #68],EBX
254 PREFETCHNTA [EBX + #192] ! Prefetch into non-temporal cache for write
25b MOV [ECX],0x00000001
261 PREFETCHNTA [EBX + #256] ! Prefetch into non-temporal cache for write
268 MOV [ECX + #4],precise klass [C: 0x0212de28:Constant:exact *
26f MOV EDX,[ESP + #24]
273 MOV [ECX + #8],EDX
276 PREFETCHNTA [EBX + #320] ! Prefetch into non-temporal cache for write
27d PREFETCHNTA [EBX + #384] ! Prefetch into non-temporal cache for write
27d
284 B23: # B39 B24 <- B37 B22 Freq: 984.544
284
284 #checkcastPP of ECX
284 MOV [ESP + #40],ECX
288 CMP EBP,[ESP + #24]
28c MOV EBX,[ESP + #24]
290 CMOVl EBX,EBP
293 MOV ESI,EBX
295 LEA EBX,[ECX + #16]
298 MOV EAX,EBX
29a LEA EBX,[ECX + #12]
29d MOV EDX,EBX
29f MOV ECX,[ESP + #36]
2a3 SHR ECX,#3
2a6 MOV [ESP + #36],ECX
2aa ADD ECX,#-2
2ad CMPu EBP,ESI
2af Jb,u B39 P=0.000001 C=-1.000000
2af
2b5 B24: # B39 B25 <- B23 Freq: 984.543
2b5 MOV EBX,[ESP + #24]
2b9 CMPu EBX,ESI
2bb Jb,u B39 P=0.000001 C=-1.000000
2bb
2c1 B25: # B41 B26 <- B24 Freq: 984.542
2c1 MOV EBX,ESI
2c3 TEST EBX,EBX
2c5 Jle B41 P=0.000001 C=-1.000000
2c5
2cb B26: # B6 B27 <- B25 Freq: 984.541
2cb MOV EBX,[ESP + #28]
2cf LEA EBX,[EBX + #12]
2d2 MOV [ESP + #44],EBX
2d6 MOV EBX,ESI
2d8 CMP EBX,[ESP + #24]
2dc Jge B6 P=0.999000 C=-1.000000
2dc
2e2 B27: # B7 <- B26 Freq: 0.984541
2e2 SHL EBX,#1
2e4 ADD EBX,#16
2e7 MOV ECX,EBX
2e9 SHR ECX,#3
2ec MOV EBP,[ESP + #36]
2f0 SUB EBP,ECX
2f2 AND EBX,#-7
2f5 MOV EDI,[ESP + #40]
2f9 ADD EDI,EBX
2fb MOV [EDI + #-4],#0
302 MOV ECX,EBP
304 SHL ECX,1 # Convert doublewords to words
XOR EAX,EAX
REP STOS # store EAX into [EDI++] while ECX--
30a MOV EBX,[ESP + #44]
30e MOV [ESP + #0],EBX
311 MOV [ESP + #4],EDX
315 MOV [ESP + #8],ESI
319 CALL_LEAF_NOFP,runtime arrayof_jshort_disjoint_arraycopy
No JVM State Info
#
31e JMP B7
31e
323 B28: # B29 <- B7 Freq: 0.977372
323 MOV EAX,ECX
323
325 B29: # N1 <- B28 B38 Freq: 0.978365
325 ADD ESP,72 # Destroy frame
POPL EBP
TEST PollPage,EAX ! Poll Safepoint
32f RET
32f
330 B30: # B50 B31 <- B11 Freq: 0.0984749
330 MOV [ESP + #48],EBP
334 MOV ECX,precise klass [C: 0x0212de28:Constant:exact *
339 MOV EDX,#16
33e NOP # 1 bytes pad for loops and calls
33f CALL,static wrapper for: _new_array_Java
# java.lang.AbstractStringBuilder::<init> @ bci:6 L[0]=_ L[1]=_ STK[0]=esp + #28
# java.lang.StringBuilder::<init> @ bci:3 L[0]=_
# StringJoin::joinTest @ bci:27 L[0]=_ L[1]=esp + #32 L[2]=esp + #12 L[3]=esp + #16 L[4]=EBP L[5]=esp + #24 STK[0]=esp + #28
# OopMap{[12]=Oop [24]=Oop [28]=Oop [32]=Oop off=836}
344
344 B31: # B13 <- B30 Freq: 0.0984729
# Block is sole successor of call
344 JMP B13
344
349 B32: # B49 B33 <- B9 Freq: 0.0984749
349 MOV ECX,precise klass java/lang/StringBuilder: 0x02123c10:Constant:exact *
34e NOP # 1 bytes pad for loops and calls
34f CALL,static wrapper for: _new_instance_Java
# StringJoin::joinTest @ bci:23 L[0]=_ L[1]=esp + #32 L[2]=esp + #12 L[3]=esp + #16 L[4]=EBP L[5]=esp + #24
# OopMap{[12]=Oop [24]=Oop [32]=Oop off=852}
354
354 B33: # B11 <- B32 Freq: 0.0984729
# Block is sole successor of call
354 JMP B11
354
359 B34: # B48 B35 <- B15 Freq: 0.0984709
359 MOV ECX,precise klass java/lang/String: 0x02122388:Constant:exact *
35e NOP # 1 bytes pad for loops and calls
35f CALL,static wrapper for: _new_instance_Java
# java.lang.StringBuilder::toString @ bci:0 L[0]=esp + #28
# StringJoin::joinTest @ bci:39 L[0]=_ L[1]=_ L[2]=esp + #12 L[3]=esp + #16 L[4]=esp + #48 L[5]=_
# OopMap{[12]=Oop [28]=Oop off=868}
364
364 B35: # B17 <- B34 Freq: 0.098469
# Block is sole successor of call
364 MOV EBP,EAX
366 JMP B17
366
36b B36: # B51 B37 <- B20 B21 Freq: 0.0994683
36b MOV [ESP + #40],EDI
36f MOV ECX,precise klass [C: 0x0212de28:Constant:exact *
374 MOV EDX,[ESP + #24]
378 NOP # 3 bytes pad for loops and calls
37b CALL,static wrapper for: _new_array_Java
# java.util.Arrays::copyOfRange @ bci:40 L[0]=esp + #28 L[1]=#0 L[2]=_ L[3]=esp + #24 L[4]=_
# java.lang.String::<init> @ bci:65 L[0]=_ L[1]=_ L[2]=_ L[3]=_ STK[0]=esp + #32
# java.lang.StringBuilder::toString @ bci:13 L[0]=_ STK[0]=esp + #32
# StringJoin::joinTest @ bci:39 L[0]=_ L[1]=_ L[2]=esp + #12 L[3]=esp + #16 L[4]=esp + #48 L[5]=_
# OopMap{[12]=Oop [28]=Oop [32]=Oop off=896}
380
380 B37: # B23 <- B36 Freq: 0.0994663
# Block is sole successor of call
380 MOV ECX,EAX
382 MOV EDI,[ESP + #40]
386 JMP B23
386
38b B38: # B29 <- B2 Freq: 0.000992706
38b MOV EAX,java/lang/String:exact *
390 JMP,s B29
390
392 B39: # B47 B40 <- B23 B24 Freq: 0.00196909
392 MOV EBX,EDX
394 MOV [EBX],#0
39a MOV EDI,EAX
39c SHL ECX,1 # Convert doublewords to words
XOR EAX,EAX
REP STOS # store EAX into [EDI++] while ECX--
3a2 MOV ECX,[ESP + #28]
3a6 XOR EDX,EDX
3a8 MOV EBP,[ESP + #40]
3ac MOV [ESP + #0],EBP
3af XOR EBP,EBP
3b1 MOV [ESP + #4],EBP
3b5 MOV [ESP + #8],ESI
3b9 NOP # 2 bytes pad for loops and calls
3bb CALL,static wrapper for: slow_arraycopy
# java.util.Arrays::copyOfRange @ bci:57 L[0]=_ L[1]=_ L[2]=_ L[3]=_ L[4]=esp + #40
# java.lang.String::<init> @ bci:65 L[0]=_ L[1]=_ L[2]=_ L[3]=_ STK[0]=esp + #32
# java.lang.StringBuilder::toString @ bci:13 L[0]=_ STK[0]=esp + #32
# StringJoin::joinTest @ bci:39 L[0]=_ L[1]=_ L[2]=esp + #12 L[3]=esp + #16 L[4]=esp + #48 L[5]=_
# OopMap{[12]=Oop [32]=Oop [40]=Oop off=960}
3c0
3c0 B40: # B7 <- B39 Freq: 0.00196905
# Block is sole successor of call
3c0 JMP B7
3c0
3c5 B41: # B7 <- B25 Freq: 0.000984542
3c5 MOV [EDX],#0
3cb MOV EDI,EAX
3cd SHL ECX,1 # Convert doublewords to words
XOR EAX,EAX
REP STOS # store EAX into [EDI++] while ECX--
3d3
3d3 JMP B7
3d3
3d8 B42: # N1 <- B17 Freq: 0.000469468
3d8 MOV ECX,#7
3dd MOV EBP,[ESP + #12]
3e1 MOV EBX,[ESP + #16]
3e5 MOV [ESP + #12],EBX
3e9 NOP # 2 bytes pad for loops and calls
3eb CALL,static wrapper for: uncommon_trap(reason='unloaded' action='reinterpret' index='7')
# java.lang.String::<init> @ bci:21 L[0]=_ L[1]=_ L[2]=_ L[3]=esp + #24
# java.lang.StringBuilder::toString @ bci:13 L[0]=_ STK[0]=esp + #32
# StringJoin::joinTest @ bci:39 L[0]=_ L[1]=_ L[2]=EBP L[3]=esp + #12 L[4]=esp + #48 L[5]=_
# OopMap{ebp=Oop [32]=Oop off=1008}
3f0 INT3 ; ShouldNotReachHere
3f0
3f1 B43: # N1 <- B19 Freq: 0.000469467
3f1 MOV ECX,#7
3f6 MOV EBP,[ESP + #12]
3fa MOV EBX,[ESP + #16]
3fe MOV [ESP + #12],EBX
402 NOP # 1 bytes pad for loops and calls
403 CALL,static wrapper for: uncommon_trap(reason='unloaded' action='reinterpret' index='7')
# java.lang.String::<init> @ bci:38 L[0]=_ L[1]=_ L[2]=#0 L[3]=esp + #24
# java.lang.StringBuilder::toString @ bci:13 L[0]=_ STK[0]=esp + #32
# StringJoin::joinTest @ bci:39 L[0]=_ L[1]=_ L[2]=EBP L[3]=esp + #12 L[4]=esp + #48 L[5]=_
# OopMap{ebp=Oop [32]=Oop off=1032}
408 INT3 ; ShouldNotReachHere
408
409 B44: # N1 <- B4 B3 Freq: 2.01128e-006
409 MOV ECX,#-122
40e MOV EBP,EBX
410 MOV [ESP + #12],EAX
414 NOP # 3 bytes pad for loops and calls
417 CALL,static wrapper for: uncommon_trap(reason='predicate' action='maybe_recompile')
# StringJoin::joinTest @ bci:17 L[0]=_ L[1]=#Ptr0x0631a668 L[2]=EBP L[3]=esp + #12 L[4]=#0 L[5]=_
# OopMap{ebp=Oop off=1052}
41c INT3 ; ShouldNotReachHere
41c
41d B45: # N1 <- B18 Freq: 0.000997619
41d MOV ECX,#-10
422 NOP # 1 bytes pad for loops and calls
423 CALL,static wrapper for: uncommon_trap(reason='null_check' action='maybe_recompile')
# java.lang.String::<init> @ bci:32 L[0]=_ L[1]=_ L[2]=_ L[3]=_ STK[0]=_ STK[1]=#NULL
# java.lang.StringBuilder::toString @ bci:13 L[0]=_ STK[0]=_
# StringJoin::joinTest @ bci:39 L[0]=_ L[1]=_ L[2]=_ L[3]=_ L[4]=_ L[5]=_
# OopMap{off=1064}
428 INT3 ; ShouldNotReachHere
428
429 B46: # N1 <- B1 Freq: 1.01328e-006
429 MOV ECX,#-10
42e NOP # 1 bytes pad for loops and calls
42f CALL,static wrapper for: uncommon_trap(reason='null_check' action='maybe_recompile')
# StringJoin::joinTest @ bci:6 L[0]=_ L[1]=_ L[2]=_ L[3]=_ L[4]=_ L[5]=_ STK[0]=#NULL
# OopMap{off=1076}
434 INT3 ; ShouldNotReachHere
434
435 B47: # B54 <- B39 Freq: 1.96909e-008
435 # exception oop is in EAX; no code emitted
435 MOV ECX,EAX
437 JMP,s B54
437
439 B48: # B54 <- B34 Freq: 9.8471e-007
439 # exception oop is in EAX; no code emitted
439 MOV ECX,EAX
43b JMP,s B54
43b
43d B49: # B54 <- B32 Freq: 9.84749e-007
43d # exception oop is in EAX; no code emitted
43d MOV ECX,EAX
43f JMP,s B54
43f
441 B50: # B54 <- B30 Freq: 9.84749e-007
441 # exception oop is in EAX; no code emitted
441 MOV ECX,EAX
443 JMP,s B54
443
445 B51: # B54 <- B36 Freq: 9.94683e-007
445 # exception oop is in EAX; no code emitted
445 MOV ECX,EAX
447 JMP,s B54
447
449 B52: # B54 <- B13 Freq: 0.00984585
449 # exception oop is in EAX; no code emitted
449 MOV ECX,EAX
44b JMP,s B54
44b
44d B53: # B54 <- B14 Freq: 0.00984566
44d # exception oop is in EAX; no code emitted
44d MOV ECX,EAX
44d
44f B54: # N1 <- B52 B53 B47 B49 B50 B48 B51 Freq: 0.0196955
44f ADD ESP,72 # Destroy frame
POPL EBP
453 JMP rethrow_stub
453
public class StringJoin{
public static void main(String... args){
String[] list = new String[1000];
for(int i = 0; i < list.length; i++){
list[i] = String.valueOf(i);
}
for(int i = 0; i < 10000; i++){
System.err.println(joinTest(list));
}
}
private static String joinTest(String... list){
String str = "";
for (String s : list) {
str += s;
}
return str;
}
}
Compiled from "StringJoin.java"
public class StringJoin extends java.lang.Object
SourceFile: "StringJoin.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #13.#27; // java/lang/Object."<init>":()V
const #2 = class #28; // java/lang/String
const #3 = Method #2.#29; // java/lang/String.valueOf:(I)Ljava/lang/String;
const #4 = Field #30.#31; // java/lang/System.err:Ljava/io/PrintStream;
const #5 = Method #12.#32; // StringJoin.joinTest:([Ljava/lang/String;)Ljava/lang/String;
const #6 = Method #33.#34; // java/io/PrintStream.println:(Ljava/lang/String;)V
const #7 = String #35; //
const #8 = class #36; // java/lang/StringBuilder
const #9 = Method #8.#27; // java/lang/StringBuilder."<init>":()V
const #10 = Method #8.#37; // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
const #11 = Method #8.#38; // java/lang/StringBuilder.toString:()Ljava/lang/String;
const #12 = class #39; // StringJoin
const #13 = class #40; // java/lang/Object
const #14 = Asciz <init>;
const #15 = Asciz ()V;
const #16 = Asciz Code;
const #17 = Asciz LineNumberTable;
const #18 = Asciz main;
const #19 = Asciz ([Ljava/lang/String;)V;
const #20 = Asciz StackMapTable;
const #21 = class #41; // "[Ljava/lang/String;"
const #22 = Asciz joinTest;
const #23 = Asciz ([Ljava/lang/String;)Ljava/lang/String;;
const #24 = class #28; // java/lang/String
const #25 = Asciz SourceFile;
const #26 = Asciz StringJoin.java;
const #27 = NameAndType #14:#15;// "<init>":()V
const #28 = Asciz java/lang/String;
const #29 = NameAndType #42:#43;// valueOf:(I)Ljava/lang/String;
const #30 = class #44; // java/lang/System
const #31 = NameAndType #45:#46;// err:Ljava/io/PrintStream;
const #32 = NameAndType #22:#23;// joinTest:([Ljava/lang/String;)Ljava/lang/String;
const #33 = class #47; // java/io/PrintStream
const #34 = NameAndType #48:#49;// println:(Ljava/lang/String;)V
const #35 = Asciz ;
const #36 = Asciz java/lang/StringBuilder;
const #37 = NameAndType #50:#51;// append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
const #38 = NameAndType #52:#53;// toString:()Ljava/lang/String;
const #39 = Asciz StringJoin;
const #40 = Asciz java/lang/Object;
const #41 = Asciz [Ljava/lang/String;;
const #42 = Asciz valueOf;
const #43 = Asciz (I)Ljava/lang/String;;
const #44 = Asciz java/lang/System;
const #45 = Asciz err;
const #46 = Asciz Ljava/io/PrintStream;;
const #47 = Asciz java/io/PrintStream;
const #48 = Asciz println;
const #49 = Asciz (Ljava/lang/String;)V;
const #50 = Asciz append;
const #51 = Asciz (Ljava/lang/String;)Ljava/lang/StringBuilder;;
const #52 = Asciz toString;
const #53 = Asciz ()Ljava/lang/String;;
{
public StringJoin();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 2: 0
public static void main(java.lang.String[]);
Code:
Stack=3, Locals=3, Args_size=1
0: sipush 1000
3: anewarray #2; //class java/lang/String
6: astore_1
7: iconst_0
8: istore_2
9: iload_2
10: aload_1
11: arraylength
12: if_icmpge 28
15: aload_1
16: iload_2
17: iload_2
18: invokestatic #3; //Method java/lang/String.valueOf:(I)Ljava/lang/String;
21: aastore
22: iinc 2, 1
25: goto 9
28: iconst_0
29: istore_2
30: iload_2
31: sipush 10000
34: if_icmpge 53
37: getstatic #4; //Field java/lang/System.err:Ljava/io/PrintStream;
40: aload_1
41: invokestatic #5; //Method joinTest:([Ljava/lang/String;)Ljava/lang/String;
44: invokevirtual #6; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
47: iinc 2, 1
50: goto 30
53: return
LineNumberTable:
line 4: 0
line 5: 7
line 6: 15
line 5: 22
line 9: 28
line 10: 37
line 9: 47
line 12: 53
StackMapTable: number_of_entries = 4
frame_type = 253 /* append */
offset_delta = 9
locals = [ class "[Ljava/lang/String;", int ]
frame_type = 250 /* chop */
offset_delta = 18
frame_type = 252 /* append */
offset_delta = 1
locals = [ int ]
frame_type = 250 /* chop */
offset_delta = 22
private static java.lang.String joinTest(java.lang.String[]);
Code:
Stack=2, Locals=6, Args_size=1
0: ldc #7; //String
2: astore_1
3: aload_0
4: astore_2
5: aload_2
6: arraylength
7: istore_3
8: iconst_0
9: istore 4
11: iload 4
13: iload_3
14: if_icmpge 49
17: aload_2
18: iload 4
20: aaload
21: astore 5
23: new #8; //class java/lang/StringBuilder
26: dup
27: invokespecial #9; //Method java/lang/StringBuilder."<init>":()V
30: aload_1
31: invokevirtual #10; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
34: aload 5
36: invokevirtual #10; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
39: invokevirtual #11; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
42: astore_1
43: iinc 4, 1
46: goto 11
49: aload_1
50: areturn
LineNumberTable:
line 15: 0
line 16: 3
line 17: 23
line 16: 43
line 19: 49
StackMapTable: number_of_entries = 2
frame_type = 255 /* full_frame */
offset_delta = 11
locals = [ class "[Ljava/lang/String;", class java/lang/String, class "[Ljava/lang/String;", int, int ]
stack = []
frame_type = 248 /* chop */
offset_delta = 37
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment