[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Again line number problem



Hi there...

The problem turned out to again be with the Aggregator. A fixed version
is attached, and will be included in future versions of Soot. The line
number tags that it produces for the piece of code in question are:

3710 $e108 = e11.getFunction();
3714 $e109 = $e108.equals("vortex");

When bytecode is converted to Jimple, it contains many simple copies of
the form local1 = local2. The purpose of the Aggregator is to remove
many of these simple copies. In the process, multiple statements are
often collapsed into one. This single statement gets the tags from
one of the multiple statements. Because the Aggregator was written
before Soot had tags, it may still, in some cases, attach the tags from
the "wrong" one of statements to the single resulting statement.
If the Aggregator causes you any further similar problems, you can turn
it off with the option -p jb no-aggregating.

If I understand correctly, your project involves visualizing code, but
you are not using Soot to optimize and Jimple or produce any bytecode.
In this case, you probably have no need for the Aggregator at all.

Ondrej

On Wed, Feb 26, 2003 at 03:10:17PM -0000, Eric Bodden wrote:
> Hi!
> 
> I have a small problem with the line number resolution again:
> In one of my example files I have the invocation
> 
> if(f.getFunction().equals(Protocol.STR_VORTEX))
> 
> Now I want to resolve the callers for "equals". My algorithm correctly
> returns bytecode Line 3714 for this call, which refers to the line
> 
> 578 invokevirtual #95 <Method boolean equals(java.lang.Object)>
> 
> (output by javap).
> 
> But when I parse the class with Soot, line 3714 was for some reason
> attached to the last invocation before:
> 
> 573 invokevirtual #99 <Method java.lang.String getFunction()>
> 
> Does anyone have a clue, why?
> 
> I have the source file and a javap dump attached.
> 
> Thanks,
> Eric
> 
> ------------------------------------------------------------
> Eric Bodden
> CS-DIP full time student @ University of Kent at Canterbury
> UKC internal phone: 5095
> ICQ UIN: 12656220, secure mail on demand
> Website: http://www.bodden.de


> Compiled from Board.java
> public class board.Board extends java.lang.Object {
>     protected board.Field board[][];
>     protected int width;
>     protected int height;
>     protected int depth;
>     protected int n_dest;
>     protected int n_startpoints_;
>     protected board.Position startpoints_[];
>     protected board.Position destinations[];
>     public board.Board(int,int,int);
>     public board.Board(java.lang.String);
>     protected int actionToInt(java.lang.String);
>     protected int directionToInt(java.lang.String);
>     public int getDepth();
>     public board.Position getDest(int);
>     public board.Field getField(int, int);
>     public int getHeight();
>     public int getNDest();
>     public int getNStartPoints();
>     public board.Position getStartPoint(int);
>     public int getWidth();
>     protected java.lang.String intToAction(int);
>     protected java.lang.String intToDirection(int);
>     protected java.lang.String intToSpin(int);
>     public void load(java.lang.String) throws java.io.IOException;
>     public void randomit();
>     public void save(java.lang.String);
>     public void setDest(int, int, int);
>     public void setDest(int, board.Position);
>     public void setField(int, int, board.Field);
>     public void setNDest(int);
>     public void setNStartPoints(int);
>     public void setStartPoint(int, board.Position);
>     protected int spinToInt(java.lang.String);
>     public java.lang.String toString();
> }
> 
> Method board.Board(int,int,int)
>    0 aload_0
>    1 invokespecial #73 <Method java.lang.Object()>
>    4 aload_0
>    5 bipush 7
>    7 putfield #115 <Field int numActions>
>   10 aload_0
>   11 iload_1
>   12 putfield #133 <Field int width>
>   15 aload_0
>   16 iload_2
>   17 putfield #107 <Field int height>
>   20 aload_0
>   21 iload_3
>   22 putfield #93 <Field int depth>
>   25 aload_0
>   26 iload_1
>   27 iload_2
>   28 multianewarray #51 dim #2 <Class [[Lboard.Field;>
>   32 putfield #88 <Field board.Field board[][]>
>   35 iconst_0
>   36 istore 4
>   38 goto 80
>   41 iconst_0
>   42 istore 5
>   44 goto 71
>   47 aload_0
>   48 getfield #88 <Field board.Field board[][]>
>   51 iload 4
>   53 aaload
>   54 iload 5
>   56 new #53 <Class board.Field>
>   59 dup
>   60 aload_0
>   61 getfield #93 <Field int depth>
>   64 invokespecial #76 <Method board.Field(int)>
>   67 aastore
>   68 iinc 5 1
>   71 iload 5
>   73 iload_2
>   74 if_icmplt 47
>   77 iinc 4 1
>   80 iload 4
>   82 iload_1
>   83 if_icmplt 41
>   86 return
> 
> Line numbers for method board.Board(int,int,int)
>    line 1549: 0
>    line 1142: 4
>    line 1143: 5
>    line 1142: 7
>    line 1561: 10
>    line 1565: 11
>    line 1562: 12
>    line 1567: 15
>    line 1571: 16
>    line 1568: 17
>    line 1573: 20
>    line 1577: 21
>    line 1574: 22
>    line 1579: 25
>    line 1584: 26
>    line 1587: 27
>    line 1581: 28
>    line 1579: 32
>    line 1595: 35
>    line 1593: 36
>    line 1590: 38
>    line 1610: 41
>    line 1608: 42
>    line 1605: 44
>    line 1620: 47
>    line 1622: 51
>    line 1621: 53
>    line 1625: 54
>    line 1628: 56
>    line 1631: 60
>    line 1628: 64
>    line 1624: 67
>    line 1617: 68
>    line 1612: 71
>    line 1614: 73
>    line 1613: 74
>    line 1602: 77
>    line 1597: 80
>    line 1599: 82
>    line 1598: 83
>    line 1549: 86
> 
> Method board.Board(java.lang.String)
>    0 aload_0
>    1 invokespecial #73 <Method java.lang.Object()>
>    4 aload_0
>    5 bipush 7
>    7 putfield #115 <Field int numActions>
>   10 aload_0
>   11 aload_1
>   12 invokevirtual #111 <Method void load(java.lang.String)>
>   15 goto 50
>   18 astore_2
>   19 getstatic #117 <Field java.io.PrintStream out>
>   22 new #68 <Class java.lang.StringBuffer>
>   25 dup
>   26 ldc #10 <String "ERROR in reading a board from '">
>   28 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>   31 aload_1
>   32 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>   35 ldc #7 <String "': ">
>   37 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>   40 aload_2
>   41 invokevirtual #86 <Method java.lang.StringBuffer append(java.lang.Object)>
>   44 invokevirtual #131 <Method java.lang.String toString()>
>   47 invokevirtual #119 <Method void println(java.lang.String)>
>   50 return
> Exception table:
>    from   to  target type
>     10    15    18   <Class java.lang.Exception>
> 
> Line numbers for method board.Board(java.lang.String)
>    line 1509: 0
>    line 1142: 4
>    line 1143: 5
>    line 1142: 7
>    line 1515: 10
>    line 1517: 10
>    line 1521: 11
>    line 1520: 12
>    line 1515: 15
>    line 1525: 18
>    line 1532: 19
>    line 1537: 22
>    line 1539: 31
>    line 1541: 35
>    line 1543: 40
>    line 1542: 44
>    line 1536: 47
>    line 1509: 50
> 
> Method int actionToInt(java.lang.String)
>    0 iconst_0
>    1 istore_2
>    2 goto 22
>    5 aload_1
>    6 aload_0
>    7 iload_2
>    8 invokevirtual #108 <Method java.lang.String intToAction(int)>
>   11 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>   14 ifeq 19
>   17 iload_2
>   18 ireturn
>   19 iinc 2 1
>   22 iload_2
>   23 bipush 7
>   25 if_icmplt 5
>   28 getstatic #117 <Field java.io.PrintStream out>
>   31 ldc #12 <String "Error in actionToInt
> ">
>   33 invokevirtual #119 <Method void println(java.lang.String)>
>   36 iconst_0
>   37 ireturn
> 
> Line numbers for method int actionToInt(java.lang.String)
>    line 1241: 0
>    line 1239: 1
>    line 1236: 2
>    line 1253: 5
>    line 1258: 6
>    line 1259: 7
>    line 1258: 8
>    line 1256: 11
>    line 1264: 17
>    line 1263: 18
>    line 1248: 19
>    line 1243: 22
>    line 1245: 23
>    line 1244: 25
>    line 1268: 28
>    line 1273: 31
>    line 1272: 33
>    line 1277: 36
>    line 1276: 37
> 
> Method int directionToInt(java.lang.String)
>    0 iconst_0
>    1 istore_2
>    2 goto 22
>    5 aload_1
>    6 aload_0
>    7 iload_2
>    8 invokevirtual #109 <Method java.lang.String intToDirection(int)>
>   11 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>   14 ifeq 19
>   17 iload_2
>   18 ireturn
>   19 iinc 2 1
>   22 iload_2
>   23 iconst_4
>   24 if_icmplt 5
>   27 getstatic #117 <Field java.io.PrintStream out>
>   30 ldc #13 <String "Error in directionToInt">
>   32 invokevirtual #119 <Method void println(java.lang.String)>
>   35 iconst_0
>   36 ireturn
> 
> Line numbers for method int directionToInt(java.lang.String)
>    line 1360: 0
>    line 1358: 1
>    line 1355: 2
>    line 1372: 5
>    line 1377: 6
>    line 1378: 7
>    line 1377: 8
>    line 1375: 11
>    line 1383: 17
>    line 1382: 18
>    line 1366: 19
>    line 1362: 22
>    line 1364: 23
>    line 1363: 24
>    line 1387: 27
>    line 1392: 30
>    line 1391: 32
>    line 1396: 35
>    line 1395: 36
> 
> Method int getDepth()
>    0 aload_0
>    1 getfield #93 <Field int depth>
>    4 ireturn
> 
> Line numbers for method int getDepth()
>    line 2015: 0
>    line 2014: 4
> 
> Method board.Position getDest(int)
>    0 aload_0
>    1 getfield #94 <Field board.Position destinations[]>
>    4 iload_1
>    5 aaload
>    6 areturn
> 
> Line numbers for method board.Position getDest(int)
>    line 1709: 0
>    line 1711: 4
>    line 1710: 5
>    line 1708: 6
> 
> Method board.Field getField(int, int)
>    0 aload_0
>    1 getfield #88 <Field board.Field board[][]>
>    4 iload_1
>    5 aaload
>    6 iload_2
>    7 aaload
>    8 areturn
> 
> Line numbers for method board.Field getField(int, int)
>    line 2030: 0
>    line 2032: 4
>    line 2031: 5
>    line 2035: 6
>    line 2034: 7
>    line 2029: 8
> 
> Method int getHeight()
>    0 aload_0
>    1 getfield #107 <Field int height>
>    4 ireturn
> 
> Line numbers for method int getHeight()
>    line 2005: 0
>    line 2004: 4
> 
> Method int getNDest()
>    0 aload_0
>    1 getfield #112 <Field int n_dest>
>    4 ireturn
> 
> Line numbers for method int getNDest()
>    line 1644: 0
>    line 1645: 1
>    line 1643: 4
> 
> Method int getNStartPoints()
>    0 aload_0
>    1 getfield #113 <Field int n_startpoints_>
>    4 ireturn
> 
> Line numbers for method int getNStartPoints()
>    line 1790: 0
>    line 1789: 4
> 
> Method board.Position getStartPoint(int)
>    0 aload_0
>    1 getfield #129 <Field board.Position startpoints_[]>
>    4 iload_1
>    5 aaload
>    6 areturn
> 
> Line numbers for method board.Position getStartPoint(int)
>    line 1802: 0
>    line 1804: 4
>    line 1803: 5
>    line 1801: 6
> 
> Method int getWidth()
>    0 aload_0
>    1 getfield #133 <Field int width>
>    4 ireturn
> 
> Line numbers for method int getWidth()
>    line 1995: 0
>    line 1994: 4
> 
> Method java.lang.String intToAction(int)
>    0 iload_1
>    1 tableswitch 0 to 6: default=65
> 	    0: 44
> 	    1: 47
> 	    2: 50
> 	    3: 53
> 	    4: 56
> 	    5: 59
> 	    6: 62
>   44 ldc #40 <String "normal">
>   46 areturn
>   47 ldc #22 <String "alien">
>   49 areturn
>   50 ldc #37 <String "mountain">
>   52 areturn
>   53 ldc #36 <String "marsh">
>   55 areturn
>   56 ldc #34 <String "glacier">
>   58 areturn
>   59 ldc #49 <String "vortex">
>   61 areturn
>   62 ldc #48 <String "tunnel">
>   64 areturn
>   65 getstatic #117 <Field java.io.PrintStream out>
>   68 ldc #12 <String "Error in actionToInt
> ">
>   70 invokevirtual #119 <Method void println(java.lang.String)>
>   73 ldc #30 <String "error">
>   75 areturn
> 
> Line numbers for method java.lang.String intToAction(int)
>    line 1155: 0
>    line 1153: 1
>    line 1163: 44
>    line 1161: 46
>    line 1171: 47
>    line 1169: 49
>    line 1179: 50
>    line 1177: 52
>    line 1187: 53
>    line 1185: 55
>    line 1195: 56
>    line 1193: 58
>    line 1203: 59
>    line 1201: 61
>    line 1211: 62
>    line 1209: 64
>    line 1216: 65
>    line 1221: 68
>    line 1220: 70
>    line 1225: 73
>    line 1224: 75
> 
> Method java.lang.String intToDirection(int)
>    0 iload_1
>    1 tableswitch 0 to 3: default=44
> 	    0: 32
> 	    1: 38
> 	    2: 35
> 	    3: 41
>   32 ldc #41 <String "north">
>   34 areturn
>   35 ldc #45 <String "south">
>   37 areturn
>   38 ldc #50 <String "west">
>   40 areturn
>   41 ldc #29 <String "east">
>   43 areturn
>   44 getstatic #117 <Field java.io.PrintStream out>
>   47 ldc #14 <String "Error in intToDirection">
>   49 invokevirtual #119 <Method void println(java.lang.String)>
>   52 ldc #30 <String "error">
>   54 areturn
> 
> Line numbers for method java.lang.String intToDirection(int)
>    line 1290: 0
>    line 1288: 1
>    line 1300: 32
>    line 1298: 34
>    line 1310: 35
>    line 1308: 37
>    line 1320: 38
>    line 1318: 40
>    line 1330: 41
>    line 1328: 43
>    line 1335: 44
>    line 1340: 47
>    line 1339: 49
>    line 1344: 52
>    line 1343: 54
> 
> Method java.lang.String intToSpin(int)
>    0 iload_1
>    1 tableswitch 0 to 2: default=37
> 	    0: 28
> 	    1: 31
> 	    2: 34
>   28 ldc #35 <String "left">
>   30 areturn
>   31 ldc #44 <String "right">
>   33 areturn
>   34 ldc #33 <String "flip">
>   36 areturn
>   37 getstatic #117 <Field java.io.PrintStream out>
>   40 ldc #15 <String "Error in intToSpin">
>   42 invokevirtual #119 <Method void println(java.lang.String)>
>   45 ldc #30 <String "error">
>   47 areturn
> 
> Line numbers for method java.lang.String intToSpin(int)
>    line 1409: 0
>    line 1407: 1
>    line 1419: 28
>    line 1417: 30
>    line 1429: 31
>    line 1427: 33
>    line 1439: 34
>    line 1437: 36
>    line 1444: 37
>    line 1449: 40
>    line 1448: 42
>    line 1453: 45
>    line 1452: 47
> 
> Method void load(java.lang.String)
>    0 new #58 <Class java.io.FileReader>
>    3 dup
>    4 aload_1
>    5 invokespecial #80 <Method java.io.FileReader(java.lang.String)>
>    8 astore_2
>    9 new #55 <Class com.FileTokenizer>
>   12 dup
>   13 aload_2
>   14 invokespecial #78 <Method com.FileTokenizer(java.io.InputStreamReader)>
>   17 astore_3
>   18 new #71 <Class java.util.Vector>
>   21 dup
>   22 invokespecial #75 <Method java.util.Vector()>
>   25 astore 4
>   27 iconst_0
>   28 istore 5
>   30 goto 1048
>   33 aload 4
>   35 invokevirtual #89 <Method void clear()>
>   38 aload_3
>   39 invokevirtual #106 <Method java.util.Vector hear()>
>   42 astore 4
>   44 aload 4
>   46 iconst_0
>   47 invokevirtual #96 <Method java.lang.Object get(int)>
>   50 checkcast #57 <Class com.Token>
>   53 getfield #130 <Field java.lang.String sval>
>   56 ldc #25 <String "boardsize">
>   58 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>   61 ifeq 191
>   64 aload_0
>   65 aload 4
>   67 iconst_1
>   68 invokevirtual #96 <Method java.lang.Object get(int)>
>   71 checkcast #57 <Class com.Token>
>   74 getfield #116 <Field double nval>
>   77 d2i
>   78 putfield #133 <Field int width>
>   81 aload_0
>   82 aload 4
>   84 iconst_2
>   85 invokevirtual #96 <Method java.lang.Object get(int)>
>   88 checkcast #57 <Class com.Token>
>   91 getfield #116 <Field double nval>
>   94 d2i
>   95 putfield #107 <Field int height>
>   98 aload_0
>   99 aload 4
>  101 iconst_3
>  102 invokevirtual #96 <Method java.lang.Object get(int)>
>  105 checkcast #57 <Class com.Token>
>  108 getfield #116 <Field double nval>
>  111 d2i
>  112 putfield #93 <Field int depth>
>  115 aload_0
>  116 aload_0
>  117 getfield #133 <Field int width>
>  120 aload_0
>  121 getfield #107 <Field int height>
>  124 multianewarray #51 dim #2 <Class [[Lboard.Field;>
>  128 putfield #88 <Field board.Field board[][]>
>  131 iconst_0
>  132 istore 6
>  134 goto 179
>  137 iconst_0
>  138 istore 7
>  140 goto 167
>  143 aload_0
>  144 getfield #88 <Field board.Field board[][]>
>  147 iload 6
>  149 aaload
>  150 iload 7
>  152 new #53 <Class board.Field>
>  155 dup
>  156 aload_0
>  157 getfield #93 <Field int depth>
>  160 invokespecial #76 <Method board.Field(int)>
>  163 aastore
>  164 iinc 7 1
>  167 iload 7
>  169 aload_0
>  170 getfield #107 <Field int height>
>  173 if_icmplt 143
>  176 iinc 6 1
>  179 iload 6
>  181 aload_0
>  182 getfield #133 <Field int width>
>  185 if_icmplt 137
>  188 goto 1048
>  191 aload 4
>  193 iconst_0
>  194 invokevirtual #96 <Method java.lang.Object get(int)>
>  197 checkcast #57 <Class com.Token>
>  200 getfield #130 <Field java.lang.String sval>
>  203 ldc #23 <String "board">
>  205 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  208 ifeq 342
>  211 aload 4
>  213 invokevirtual #128 <Method int size()>
>  216 aload_0
>  217 getfield #93 <Field int depth>
>  220 aload_0
>  221 invokevirtual #105 <Method int getWidth()>
>  224 imul
>  225 iconst_3
>  226 iadd
>  227 if_icmpeq 238
>  230 getstatic #117 <Field java.io.PrintStream out>
>  233 ldc #18 <String "Line of the board of invalid size received. Continuing anyway">
>  235 invokevirtual #119 <Method void println(java.lang.String)>
>  238 aload 4
>  240 iconst_1
>  241 invokevirtual #96 <Method java.lang.Object get(int)>
>  244 checkcast #57 <Class com.Token>
>  247 getfield #116 <Field double nval>
>  250 d2i
>  251 istore 6
>  253 iconst_2
>  254 istore 8
>  256 iconst_0
>  257 istore 9
>  259 goto 330
>  262 new #53 <Class board.Field>
>  265 dup
>  266 aload_0
>  267 getfield #93 <Field int depth>
>  270 invokespecial #76 <Method board.Field(int)>
>  273 astore 7
>  275 iconst_0
>  276 istore 10
>  278 goto 308
>  281 aload 7
>  283 iload 10
>  285 aload 4
>  287 iload 8
>  289 invokevirtual #96 <Method java.lang.Object get(int)>
>  292 checkcast #57 <Class com.Token>
>  295 getfield #116 <Field double nval>
>  298 d2i
>  299 invokevirtual #121 <Method void setComponent(int, int)>
>  302 iinc 8 1
>  305 iinc 10 1
>  308 iload 10
>  310 aload_0
>  311 getfield #93 <Field int depth>
>  314 if_icmplt 281
>  317 aload_0
>  318 iload 9
>  320 iload 6
>  322 aload 7
>  324 invokevirtual #122 <Method void setField(int, int, board.Field)>
>  327 iinc 9 1
>  330 iload 9
>  332 aload_0
>  333 invokevirtual #105 <Method int getWidth()>
>  336 if_icmplt 262
>  339 goto 1048
>  342 aload 4
>  344 iconst_0
>  345 invokevirtual #96 <Method java.lang.Object get(int)>
>  348 checkcast #57 <Class com.Token>
>  351 getfield #130 <Field java.lang.String sval>
>  354 ldc #38 <String "ndest">
>  356 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  359 ifeq 393
>  362 aload_0
>  363 aload 4
>  365 iconst_1
>  366 invokevirtual #96 <Method java.lang.Object get(int)>
>  369 checkcast #57 <Class com.Token>
>  372 getfield #116 <Field double nval>
>  375 d2i
>  376 putfield #112 <Field int n_dest>
>  379 aload_0
>  380 aload_0
>  381 getfield #112 <Field int n_dest>
>  384 anewarray class #54 <Class board.Position>
>  387 putfield #94 <Field board.Position destinations[]>
>  390 goto 1048
>  393 aload 4
>  395 iconst_0
>  396 invokevirtual #96 <Method java.lang.Object get(int)>
>  399 checkcast #57 <Class com.Token>
>  402 getfield #130 <Field java.lang.String sval>
>  405 ldc #42 <String "nstartpoints">
>  407 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  410 ifeq 444
>  413 aload_0
>  414 aload 4
>  416 iconst_1
>  417 invokevirtual #96 <Method java.lang.Object get(int)>
>  420 checkcast #57 <Class com.Token>
>  423 getfield #116 <Field double nval>
>  426 d2i
>  427 putfield #113 <Field int n_startpoints_>
>  430 aload_0
>  431 aload_0
>  432 getfield #113 <Field int n_startpoints_>
>  435 anewarray class #54 <Class board.Position>
>  438 putfield #129 <Field board.Position startpoints_[]>
>  441 goto 1048
>  444 aload 4
>  446 iconst_0
>  447 invokevirtual #96 <Method java.lang.Object get(int)>
>  450 checkcast #57 <Class com.Token>
>  453 getfield #130 <Field java.lang.String sval>
>  456 ldc #46 <String "startpoint">
>  458 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  461 ifeq 522
>  464 aload 4
>  466 iconst_1
>  467 invokevirtual #96 <Method java.lang.Object get(int)>
>  470 checkcast #57 <Class com.Token>
>  473 getfield #116 <Field double nval>
>  476 d2i
>  477 istore 6
>  479 aload_0
>  480 getfield #129 <Field board.Position startpoints_[]>
>  483 iload 6
>  485 new #54 <Class board.Position>
>  488 dup
>  489 aload 4
>  491 iconst_2
>  492 invokevirtual #96 <Method java.lang.Object get(int)>
>  495 checkcast #57 <Class com.Token>
>  498 getfield #116 <Field double nval>
>  501 d2i
>  502 aload 4
>  504 iconst_3
>  505 invokevirtual #96 <Method java.lang.Object get(int)>
>  508 checkcast #57 <Class com.Token>
>  511 getfield #116 <Field double nval>
>  514 d2i
>  515 invokespecial #77 <Method board.Position(int,int)>
>  518 aastore
>  519 goto 1048
>  522 aload 4
>  524 iconst_0
>  525 invokevirtual #96 <Method java.lang.Object get(int)>
>  528 checkcast #57 <Class com.Token>
>  531 getfield #130 <Field java.lang.String sval>
>  534 ldc #31 <String "field">
>  536 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  539 ifeq 947
>  542 new #54 <Class board.Position>
>  545 dup
>  546 aload 4
>  548 iconst_1
>  549 invokevirtual #96 <Method java.lang.Object get(int)>
>  552 checkcast #57 <Class com.Token>
>  555 getfield #116 <Field double nval>
>  558 d2i
>  559 aload 4
>  561 iconst_2
>  562 invokevirtual #96 <Method java.lang.Object get(int)>
>  565 checkcast #57 <Class com.Token>
>  568 getfield #116 <Field double nval>
>  571 d2i
>  572 invokespecial #77 <Method board.Position(int,int)>
>  575 astore 6
>  577 aload_0
>  578 getfield #88 <Field board.Field board[][]>
>  581 aload 6
>  583 getfield #134 <Field int x>
>  586 aaload
>  587 aload 6
>  589 getfield #135 <Field int y>
>  592 aaload
>  593 aload 4
>  595 iconst_3
>  596 invokevirtual #96 <Method java.lang.Object get(int)>
>  599 checkcast #57 <Class com.Token>
>  602 getfield #130 <Field java.lang.String sval>
>  605 invokevirtual #123 <Method void setFunction(java.lang.String)>
>  608 aload 4
>  610 iconst_3
>  611 invokevirtual #96 <Method java.lang.Object get(int)>
>  614 checkcast #57 <Class com.Token>
>  617 getfield #130 <Field java.lang.String sval>
>  620 ldc #48 <String "tunnel">
>  622 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  625 ifeq 683
>  628 aload_0
>  629 getfield #88 <Field board.Field board[][]>
>  632 aload 6
>  634 getfield #134 <Field int x>
>  637 aaload
>  638 aload 6
>  640 getfield #135 <Field int y>
>  643 aaload
>  644 new #54 <Class board.Position>
>  647 dup
>  648 aload 4
>  650 iconst_4
>  651 invokevirtual #96 <Method java.lang.Object get(int)>
>  654 checkcast #57 <Class com.Token>
>  657 getfield #116 <Field double nval>
>  660 d2i
>  661 aload 4
>  663 iconst_5
>  664 invokevirtual #96 <Method java.lang.Object get(int)>
>  667 checkcast #57 <Class com.Token>
>  670 getfield #116 <Field double nval>
>  673 d2i
>  674 invokespecial #77 <Method board.Position(int,int)>
>  677 invokevirtual #126 <Method void setTunnelEnd(board.Position)>
>  680 goto 1048
>  683 aload 4
>  685 iconst_3
>  686 invokevirtual #96 <Method java.lang.Object get(int)>
>  689 checkcast #57 <Class com.Token>
>  692 getfield #130 <Field java.lang.String sval>
>  695 ldc #49 <String "vortex">
>  697 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  700 ifeq 737
>  703 aload_0
>  704 getfield #88 <Field board.Field board[][]>
>  707 aload 6
>  709 getfield #134 <Field int x>
>  712 aaload
>  713 aload 6
>  715 getfield #135 <Field int y>
>  718 aaload
>  719 aload 4
>  721 iconst_4
>  722 invokevirtual #96 <Method java.lang.Object get(int)>
>  725 checkcast #57 <Class com.Token>
>  728 getfield #130 <Field java.lang.String sval>
>  731 invokevirtual #127 <Method void setVortexDirection(java.lang.String)>
>  734 goto 1048
>  737 aload 4
>  739 iconst_3
>  740 invokevirtual #96 <Method java.lang.Object get(int)>
>  743 checkcast #57 <Class com.Token>
>  746 getfield #130 <Field java.lang.String sval>
>  749 ldc #34 <String "glacier">
>  751 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  754 ifeq 791
>  757 aload_0
>  758 getfield #88 <Field board.Field board[][]>
>  761 aload 6
>  763 getfield #134 <Field int x>
>  766 aaload
>  767 aload 6
>  769 getfield #135 <Field int y>
>  772 aaload
>  773 aload 4
>  775 iconst_4
>  776 invokevirtual #96 <Method java.lang.Object get(int)>
>  779 checkcast #57 <Class com.Token>
>  782 getfield #130 <Field java.lang.String sval>
>  785 invokevirtual #124 <Method void setGlacierDirection(java.lang.String)>
>  788 goto 1048
>  791 aload 4
>  793 iconst_3
>  794 invokevirtual #96 <Method java.lang.Object get(int)>
>  797 checkcast #57 <Class com.Token>
>  800 getfield #130 <Field java.lang.String sval>
>  803 ldc #36 <String "marsh">
>  805 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  808 ifeq 846
>  811 aload_0
>  812 getfield #88 <Field board.Field board[][]>
>  815 aload 6
>  817 getfield #134 <Field int x>
>  820 aaload
>  821 aload 6
>  823 getfield #135 <Field int y>
>  826 aaload
>  827 aload 4
>  829 iconst_4
>  830 invokevirtual #96 <Method java.lang.Object get(int)>
>  833 checkcast #57 <Class com.Token>
>  836 getfield #116 <Field double nval>
>  839 d2i
>  840 invokevirtual #125 <Method void setMarshDepth(int)>
>  843 goto 1048
>  846 aload 4
>  848 iconst_3
>  849 invokevirtual #96 <Method java.lang.Object get(int)>
>  852 checkcast #57 <Class com.Token>
>  855 getfield #130 <Field java.lang.String sval>
>  858 ldc #37 <String "mountain">
>  860 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  863 ifne 1048
>  866 aload 4
>  868 iconst_3
>  869 invokevirtual #96 <Method java.lang.Object get(int)>
>  872 checkcast #57 <Class com.Token>
>  875 getfield #130 <Field java.lang.String sval>
>  878 ldc #22 <String "alien">
>  880 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  883 ifne 1048
>  886 aload 4
>  888 iconst_3
>  889 invokevirtual #96 <Method java.lang.Object get(int)>
>  892 checkcast #57 <Class com.Token>
>  895 getfield #130 <Field java.lang.String sval>
>  898 ldc #40 <String "normal">
>  900 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  903 ifne 1048
>  906 getstatic #117 <Field java.io.PrintStream out>
>  909 new #68 <Class java.lang.StringBuffer>
>  912 dup
>  913 ldc #17 <String "Got unknown field Type: '">
>  915 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  918 aload 4
>  920 iconst_1
>  921 invokevirtual #96 <Method java.lang.Object get(int)>
>  924 checkcast #57 <Class com.Token>
>  927 getfield #130 <Field java.lang.String sval>
>  930 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  933 ldc #5 <String "'. continuing nonetheless.">
>  935 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  938 invokevirtual #131 <Method java.lang.String toString()>
>  941 invokevirtual #119 <Method void println(java.lang.String)>
>  944 goto 1048
>  947 aload 4
>  949 iconst_0
>  950 invokevirtual #96 <Method java.lang.Object get(int)>
>  953 checkcast #57 <Class com.Token>
>  956 getfield #130 <Field java.lang.String sval>
>  959 ldc #27 <String "destination">
>  961 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  964 ifeq 1025
>  967 aload 4
>  969 iconst_1
>  970 invokevirtual #96 <Method java.lang.Object get(int)>
>  973 checkcast #57 <Class com.Token>
>  976 getfield #116 <Field double nval>
>  979 d2i
>  980 istore 6
>  982 aload_0
>  983 getfield #94 <Field board.Position destinations[]>
>  986 iload 6
>  988 new #54 <Class board.Position>
>  991 dup
>  992 aload 4
>  994 iconst_2
>  995 invokevirtual #96 <Method java.lang.Object get(int)>
>  998 checkcast #57 <Class com.Token>
> 1001 getfield #116 <Field double nval>
> 1004 d2i
> 1005 aload 4
> 1007 iconst_3
> 1008 invokevirtual #96 <Method java.lang.Object get(int)>
> 1011 checkcast #57 <Class com.Token>
> 1014 getfield #116 <Field double nval>
> 1017 d2i
> 1018 invokespecial #77 <Method board.Position(int,int)>
> 1021 aastore
> 1022 goto 1048
> 1025 aload 4
> 1027 iconst_0
> 1028 invokevirtual #96 <Method java.lang.Object get(int)>
> 1031 checkcast #57 <Class com.Token>
> 1034 getfield #130 <Field java.lang.String sval>
> 1037 ldc #32 <String "fileend">
> 1039 invokevirtual #95 <Method boolean equals(java.lang.Object)>
> 1042 ifeq 1048
> 1045 iconst_1
> 1046 istore 5
> 1048 iload 5
> 1050 ifeq 33
> 1053 aload_2
> 1054 invokevirtual #90 <Method void close()>
> 1057 getstatic #117 <Field java.io.PrintStream out>
> 1060 new #68 <Class java.lang.StringBuffer>
> 1063 dup
> 1064 ldc #19 <String "Read board from '">
> 1066 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
> 1069 aload_1
> 1070 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
> 1073 ldc #6 <String "':">
> 1075 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
> 1078 invokevirtual #131 <Method java.lang.String toString()>
> 1081 invokevirtual #119 <Method void println(java.lang.String)>
> 1084 goto 1152
> 1087 astore_2
> 1088 getstatic #117 <Field java.io.PrintStream out>
> 1091 new #68 <Class java.lang.StringBuffer>
> 1094 dup
> 1095 ldc #10 <String "ERROR in reading a board from '">
> 1097 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
> 1100 aload_1
> 1101 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
> 1104 ldc #7 <String "': ">
> 1106 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
> 1109 aload_2
> 1110 invokevirtual #86 <Method java.lang.StringBuffer append(java.lang.Object)>
> 1113 invokevirtual #131 <Method java.lang.String toString()>
> 1116 invokevirtual #119 <Method void println(java.lang.String)>
> 1119 new #60 <Class java.io.IOException>
> 1122 dup
> 1123 new #68 <Class java.lang.StringBuffer>
> 1126 dup
> 1127 ldc #10 <String "ERROR in reading a board from '">
> 1129 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
> 1132 aload_1
> 1133 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
> 1136 ldc #7 <String "': ">
> 1138 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
> 1141 aload_2
> 1142 invokevirtual #86 <Method java.lang.StringBuffer append(java.lang.Object)>
> 1145 invokevirtual #131 <Method java.lang.String toString()>
> 1148 invokespecial #82 <Method java.io.IOException(java.lang.String)>
> 1151 athrow
> 1152 return
> Exception table:
>    from   to  target type
>      0  1084  1087   <Class java.lang.Exception>
> 
> Line numbers for method void load(java.lang.String)
>    line 2074: 0
>    line 2079: 0
>    line 2082: 4
>    line 2079: 5
>    line 2077: 8
>    line 2088: 9
>    line 2091: 13
>    line 2088: 14
>    line 2086: 17
>    line 2097: 18
>    line 2095: 25
>    line 2105: 27
>    line 2103: 28
>    line 2107: 30
>    line 2113: 33
>    line 2116: 35
>    line 2121: 38
>    line 2124: 39
>    line 2119: 42
>    line 2133: 44
>    line 2137: 46
>    line 2136: 47
>    line 2130: 50
>    line 2140: 53
>    line 2146: 56
>    line 2144: 58
>    line 2151: 64
>    line 2162: 65
>    line 2166: 67
>    line 2165: 68
>    line 2159: 71
>    line 2169: 74
>    line 2155: 77
>    line 2152: 78
>    line 2172: 81
>    line 2183: 82
>    line 2187: 84
>    line 2186: 85
>    line 2180: 88
>    line 2190: 91
>    line 2176: 94
>    line 2173: 95
>    line 2193: 98
>    line 2204: 99
>    line 2208: 101
>    line 2207: 102
>    line 2201: 105
>    line 2211: 108
>    line 2197: 111
>    line 2194: 112
>    line 2214: 115
>    line 2219: 116
>    line 2222: 120
>    line 2216: 124
>    line 2214: 128
>    line 2230: 131
>    line 2228: 132
>    line 2225: 134
>    line 2245: 137
>    line 2243: 138
>    line 2240: 140
>    line 2255: 143
>    line 2257: 147
>    line 2256: 149
>    line 2260: 150
>    line 2263: 152
>    line 2266: 156
>    line 2263: 160
>    line 2259: 163
>    line 2252: 164
>    line 2247: 167
>    line 2249: 169
>    line 2248: 173
>    line 2237: 176
>    line 2232: 179
>    line 2234: 181
>    line 2233: 185
>    line 2127: 188
>    line 2279: 191
>    line 2283: 193
>    line 2282: 194
>    line 2276: 197
>    line 2286: 200
>    line 2292: 203
>    line 2290: 205
>    line 2299: 211
>    line 2302: 213
>    line 2305: 216
>    line 2307: 220
>    line 2310: 221
>    line 2306: 224
>    line 2313: 225
>    line 2312: 226
>    line 2304: 227
>    line 2317: 230
>    line 2322: 233
>    line 2321: 235
>    line 2336: 238
>    line 2340: 240
>    line 2339: 241
>    line 2333: 244
>    line 2343: 247
>    line 2329: 250
>    line 2327: 251
>    line 2352: 253
>    line 2350: 254
>    line 2359: 256
>    line 2357: 257
>    line 2354: 259
>    line 2375: 262
>    line 2378: 266
>    line 2375: 270
>    line 2373: 273
>    line 2386: 275
>    line 2384: 276
>    line 2381: 278
>    line 2396: 281
>    line 2400: 283
>    line 2409: 285
>    line 2413: 287
>    line 2412: 289
>    line 2406: 292
>    line 2416: 295
>    line 2402: 298
>    line 2399: 299
>    line 2421: 302
>    line 2393: 305
>    line 2388: 308
>    line 2390: 310
>    line 2389: 314
>    line 2424: 317
>    line 2428: 318
>    line 2430: 320
>    line 2432: 322
>    line 2427: 324
>    line 2370: 327
>    line 2361: 330
>    line 2363: 332
>    line 2366: 333
>    line 2362: 336
>    line 2273: 339
>    line 2444: 342
>    line 2448: 344
>    line 2447: 345
>    line 2441: 348
>    line 2451: 351
>    line 2457: 354
>    line 2455: 356
>    line 2462: 362
>    line 2473: 363
>    line 2477: 365
>    line 2476: 366
>    line 2470: 369
>    line 2480: 372
>    line 2466: 375
>    line 2463: 376
>    line 2483: 379
>    line 2488: 380
>    line 2485: 384
>    line 2483: 387
>    line 2438: 390
>    line 2499: 393
>    line 2503: 395
>    line 2502: 396
>    line 2496: 399
>    line 2506: 402
>    line 2512: 405
>    line 2510: 407
>    line 2517: 413
>    line 2528: 414
>    line 2532: 416
>    line 2531: 417
>    line 2525: 420
>    line 2535: 423
>    line 2521: 426
>    line 2518: 427
>    line 2538: 430
>    line 2543: 431
>    line 2540: 435
>    line 2538: 438
>    line 2493: 441
>    line 2554: 444
>    line 2558: 446
>    line 2557: 447
>    line 2551: 450
>    line 2561: 453
>    line 2567: 456
>    line 2565: 458
>    line 2582: 464
>    line 2586: 466
>    line 2585: 467
>    line 2579: 470
>    line 2589: 473
>    line 2575: 476
>    line 2573: 477
>    line 2592: 479
>    line 2594: 483
>    line 2597: 485
>    line 2607: 489
>    line 2611: 491
>    line 2610: 492
>    line 2604: 495
>    line 2614: 498
>    line 2600: 501
>    line 2624: 502
>    line 2628: 504
>    line 2627: 505
>    line 2621: 508
>    line 2631: 511
>    line 2617: 514
>    line 2597: 515
>    line 2593: 518
>    line 2548: 519
>    line 2643: 522
>    line 2647: 524
>    line 2646: 525
>    line 2640: 528
>    line 2650: 531
>    line 2656: 534
>    line 2654: 536
>    line 2664: 542
>    line 2674: 546
>    line 2678: 548
>    line 2677: 549
>    line 2671: 552
>    line 2681: 555
>    line 2667: 558
>    line 2691: 559
>    line 2695: 561
>    line 2694: 562
>    line 2688: 565
>    line 2698: 568
>    line 2684: 571
>    line 2664: 572
>    line 2662: 575
>    line 2702: 577
>    line 2704: 581
>    line 2705: 583
>    line 2703: 586
>    line 2709: 587
>    line 2710: 589
>    line 2708: 592
>    line 2720: 593
>    line 2724: 595
>    line 2723: 596
>    line 2717: 599
>    line 2727: 602
>    line 2715: 605
>    line 2737: 608
>    line 2741: 610
>    line 2740: 611
>    line 2734: 614
>    line 2744: 617
>    line 2750: 620
>    line 2748: 622
>    line 2755: 628
>    line 2757: 632
>    line 2758: 634
>    line 2756: 637
>    line 2762: 638
>    line 2763: 640
>    line 2761: 643
>    line 2769: 644
>    line 2779: 648
>    line 2783: 650
>    line 2782: 651
>    line 2776: 654
>    line 2786: 657
>    line 2772: 660
>    line 2796: 661
>    line 2800: 663
>    line 2799: 664
>    line 2793: 667
>    line 2803: 670
>    line 2789: 673
>    line 2769: 674
>    line 2768: 677
>    line 2731: 680
>    line 2816: 683
>    line 2820: 685
>    line 2819: 686
>    line 2813: 689
>    line 2823: 692
>    line 2829: 695
>    line 2827: 697
>    line 2834: 703
>    line 2836: 707
>    line 2837: 709
>    line 2835: 712
>    line 2841: 713
>    line 2842: 715
>    line 2840: 718
>    line 2852: 719
>    line 2856: 721
>    line 2855: 722
>    line 2849: 725
>    line 2859: 728
>    line 2847: 731
>    line 2810: 734
>    line 2871: 737
>    line 2875: 739
>    line 2874: 740
>    line 2868: 743
>    line 2878: 746
>    line 2884: 749
>    line 2882: 751
>    line 2889: 757
>    line 2891: 761
>    line 2892: 763
>    line 2890: 766
>    line 2896: 767
>    line 2897: 769
>    line 2895: 772
>    line 2907: 773
>    line 2911: 775
>    line 2910: 776
>    line 2904: 779
>    line 2914: 782
>    line 2902: 785
>    line 2865: 788
>    line 2926: 791
>    line 2930: 793
>    line 2929: 794
>    line 2923: 797
>    line 2933: 800
>    line 2939: 803
>    line 2937: 805
>    line 2944: 811
>    line 2946: 815
>    line 2947: 817
>    line 2945: 820
>    line 2951: 821
>    line 2952: 823
>    line 2950: 826
>    line 2965: 827
>    line 2969: 829
>    line 2968: 830
>    line 2962: 833
>    line 2972: 836
>    line 2958: 839
>    line 2957: 840
>    line 2920: 843
>    line 2984: 846
>    line 2988: 848
>    line 2987: 849
>    line 2981: 852
>    line 2991: 855
>    line 2997: 858
>    line 2995: 860
>    line 3010: 866
>    line 3014: 868
>    line 3013: 869
>    line 3007: 872
>    line 3017: 875
>    line 3023: 878
>    line 3021: 880
>    line 3036: 886
>    line 3040: 888
>    line 3039: 889
>    line 3033: 892
>    line 3043: 895
>    line 3049: 898
>    line 3047: 900
>    line 3058: 906
>    line 3063: 909
>    line 3069: 918
>    line 3073: 920
>    line 3072: 921
>    line 3066: 924
>    line 3076: 927
>    line 3079: 933
>    line 3078: 938
>    line 3062: 941
>    line 2637: 944
>    line 3091: 947
>    line 3095: 949
>    line 3094: 950
>    line 3088: 953
>    line 3098: 956
>    line 3104: 959
>    line 3102: 961
>    line 3119: 967
>    line 3123: 969
>    line 3122: 970
>    line 3116: 973
>    line 3126: 976
>    line 3112: 979
>    line 3110: 980
>    line 3129: 982
>    line 3131: 986
>    line 3134: 988
>    line 3144: 992
>    line 3148: 994
>    line 3147: 995
>    line 3141: 998
>    line 3151: 1001
>    line 3137: 1004
>    line 3161: 1005
>    line 3165: 1007
>    line 3164: 1008
>    line 3158: 1011
>    line 3168: 1014
>    line 3154: 1017
>    line 3134: 1018
>    line 3130: 1021
>    line 3085: 1022
>    line 3180: 1025
>    line 3184: 1027
>    line 3183: 1028
>    line 3177: 1031
>    line 3187: 1034
>    line 3193: 1037
>    line 3191: 1039
>    line 3200: 1045
>    line 3198: 1046
>    line 2110: 1048
>    line 3204: 1053
>    line 3207: 1054
>    line 3211: 1057
>    line 3216: 1060
>    line 3218: 1069
>    line 3220: 1073
>    line 3219: 1078
>    line 3215: 1081
>    line 2074: 1084
>    line 3224: 1087
>    line 3231: 1088
>    line 3236: 1091
>    line 3238: 1100
>    line 3240: 1104
>    line 3242: 1109
>    line 3241: 1113
>    line 3235: 1116
>    line 3247: 1119
>    line 3250: 1123
>    line 3252: 1132
>    line 3254: 1136
>    line 3256: 1141
>    line 3255: 1145
>    line 3247: 1148
>    line 3245: 1151
>    line 2066: 1152
> 
> Method void randomit()
>    0 new #70 <Class java.util.Random>
>    3 dup
>    4 invokespecial #74 <Method java.util.Random()>
>    7 astore_1
>    8 iconst_0
>    9 istore_3
>   10 goto 585
>   13 iconst_0
>   14 istore 4
>   16 goto 573
>   19 aload_1
>   20 bipush 100
>   22 invokevirtual #114 <Method int nextInt(int)>
>   25 istore 5
>   27 goto 38
>   30 aload_1
>   31 bipush 100
>   33 invokevirtual #114 <Method int nextInt(int)>
>   36 istore 5
>   38 iload 4
>   40 ifne 50
>   43 iload 5
>   45 bipush 95
>   47 if_icmpge 30
>   50 iload 5
>   52 bipush 50
>   54 if_icmpge 74
>   57 aload_0
>   58 getfield #88 <Field board.Field board[][]>
>   61 iload_3
>   62 aaload
>   63 iload 4
>   65 aaload
>   66 ldc #40 <String "normal">
>   68 invokevirtual #123 <Method void setFunction(java.lang.String)>
>   71 goto 570
>   74 iload 5
>   76 bipush 40
>   78 if_icmplt 105
>   81 iload 5
>   83 bipush 60
>   85 if_icmpge 105
>   88 aload_0
>   89 getfield #88 <Field board.Field board[][]>
>   92 iload_3
>   93 aaload
>   94 iload 4
>   96 aaload
>   97 ldc #37 <String "mountain">
>   99 invokevirtual #123 <Method void setFunction(java.lang.String)>
>  102 goto 570
>  105 iload 5
>  107 bipush 60
>  109 if_icmplt 136
>  112 iload 5
>  114 bipush 65
>  116 if_icmpge 136
>  119 aload_0
>  120 getfield #88 <Field board.Field board[][]>
>  123 iload_3
>  124 aaload
>  125 iload 4
>  127 aaload
>  128 ldc #22 <String "alien">
>  130 invokevirtual #123 <Method void setFunction(java.lang.String)>
>  133 goto 570
>  136 iload 5
>  138 bipush 65
>  140 if_icmplt 186
>  143 iload 5
>  145 bipush 75
>  147 if_icmpge 186
>  150 aload_0
>  151 getfield #88 <Field board.Field board[][]>
>  154 iload_3
>  155 aaload
>  156 iload 4
>  158 aaload
>  159 ldc #36 <String "marsh">
>  161 invokevirtual #123 <Method void setFunction(java.lang.String)>
>  164 aload_0
>  165 getfield #88 <Field board.Field board[][]>
>  168 iload_3
>  169 aaload
>  170 iload 4
>  172 aaload
>  173 aload_1
>  174 iconst_3
>  175 invokevirtual #114 <Method int nextInt(int)>
>  178 iconst_1
>  179 iadd
>  180 invokevirtual #125 <Method void setMarshDepth(int)>
>  183 goto 570
>  186 iload 5
>  188 bipush 75
>  190 if_icmplt 320
>  193 iload 5
>  195 bipush 85
>  197 if_icmpge 320
>  200 aload_0
>  201 getfield #88 <Field board.Field board[][]>
>  204 iload_3
>  205 aaload
>  206 iload 4
>  208 aaload
>  209 ldc #34 <String "glacier">
>  211 invokevirtual #123 <Method void setFunction(java.lang.String)>
>  214 aload_1
>  215 iconst_4
>  216 invokevirtual #114 <Method int nextInt(int)>
>  219 istore 5
>  221 iload 5
>  223 tableswitch 0 to 3: default=570
> 	    0: 252
> 	    1: 269
> 	    2: 286
> 	    3: 303
>  252 aload_0
>  253 getfield #88 <Field board.Field board[][]>
>  256 iload_3
>  257 aaload
>  258 iload 4
>  260 aaload
>  261 ldc #41 <String "north">
>  263 invokevirtual #124 <Method void setGlacierDirection(java.lang.String)>
>  266 goto 570
>  269 aload_0
>  270 getfield #88 <Field board.Field board[][]>
>  273 iload_3
>  274 aaload
>  275 iload 4
>  277 aaload
>  278 ldc #45 <String "south">
>  280 invokevirtual #124 <Method void setGlacierDirection(java.lang.String)>
>  283 goto 570
>  286 aload_0
>  287 getfield #88 <Field board.Field board[][]>
>  290 iload_3
>  291 aaload
>  292 iload 4
>  294 aaload
>  295 ldc #50 <String "west">
>  297 invokevirtual #124 <Method void setGlacierDirection(java.lang.String)>
>  300 goto 570
>  303 aload_0
>  304 getfield #88 <Field board.Field board[][]>
>  307 iload_3
>  308 aaload
>  309 iload 4
>  311 aaload
>  312 ldc #29 <String "east">
>  314 invokevirtual #124 <Method void setGlacierDirection(java.lang.String)>
>  317 goto 570
>  320 iload 5
>  322 bipush 85
>  324 if_icmplt 435
>  327 iload 5
>  329 bipush 95
>  331 if_icmpge 435
>  334 aload_0
>  335 getfield #88 <Field board.Field board[][]>
>  338 iload_3
>  339 aaload
>  340 iload 4
>  342 aaload
>  343 ldc #49 <String "vortex">
>  345 invokevirtual #123 <Method void setFunction(java.lang.String)>
>  348 aload_1
>  349 iconst_3
>  350 invokevirtual #114 <Method int nextInt(int)>
>  353 istore 5
>  355 iload 5
>  357 tableswitch 0 to 2: default=570
> 	    0: 384
> 	    1: 401
> 	    2: 418
>  384 aload_0
>  385 getfield #88 <Field board.Field board[][]>
>  388 iload_3
>  389 aaload
>  390 iload 4
>  392 aaload
>  393 ldc #35 <String "left">
>  395 invokevirtual #127 <Method void setVortexDirection(java.lang.String)>
>  398 goto 570
>  401 aload_0
>  402 getfield #88 <Field board.Field board[][]>
>  405 iload_3
>  406 aaload
>  407 iload 4
>  409 aaload
>  410 ldc #44 <String "right">
>  412 invokevirtual #127 <Method void setVortexDirection(java.lang.String)>
>  415 goto 570
>  418 aload_0
>  419 getfield #88 <Field board.Field board[][]>
>  422 iload_3
>  423 aaload
>  424 iload 4
>  426 aaload
>  427 ldc #33 <String "flip">
>  429 invokevirtual #127 <Method void setVortexDirection(java.lang.String)>
>  432 goto 570
>  435 iload 5
>  437 bipush 95
>  439 if_icmplt 570
>  442 aload_0
>  443 getfield #88 <Field board.Field board[][]>
>  446 iload_3
>  447 aaload
>  448 iload 4
>  450 aaload
>  451 ldc #48 <String "tunnel">
>  453 invokevirtual #123 <Method void setFunction(java.lang.String)>
>  456 aload_1
>  457 iload_3
>  458 iconst_1
>  459 iadd
>  460 invokevirtual #114 <Method int nextInt(int)>
>  463 istore 6
>  465 aload_1
>  466 iload 4
>  468 iconst_1
>  469 iadd
>  470 invokevirtual #114 <Method int nextInt(int)>
>  473 istore 7
>  475 iload 6
>  477 iload_3
>  478 if_icmpne 491
>  481 iload 7
>  483 iload 4
>  485 if_icmpne 491
>  488 iinc 7 -1
>  491 aload_0
>  492 getfield #88 <Field board.Field board[][]>
>  495 iload 6
>  497 aaload
>  498 iload 7
>  500 aaload
>  501 invokevirtual #99 <Method java.lang.String getFunction()>
>  504 ldc #48 <String "tunnel">
>  506 if_acmpeq 456
>  509 aload_0
>  510 getfield #88 <Field board.Field board[][]>
>  513 iload_3
>  514 aaload
>  515 iload 4
>  517 aaload
>  518 new #54 <Class board.Position>
>  521 dup
>  522 iload 6
>  524 iload 7
>  526 invokespecial #77 <Method board.Position(int,int)>
>  529 invokevirtual #126 <Method void setTunnelEnd(board.Position)>
>  532 aload_0
>  533 getfield #88 <Field board.Field board[][]>
>  536 iload 6
>  538 aaload
>  539 iload 7
>  541 aaload
>  542 ldc #48 <String "tunnel">
>  544 invokevirtual #123 <Method void setFunction(java.lang.String)>
>  547 aload_0
>  548 getfield #88 <Field board.Field board[][]>
>  551 iload 6
>  553 aaload
>  554 iload 7
>  556 aaload
>  557 new #54 <Class board.Position>
>  560 dup
>  561 iload_3
>  562 iload 4
>  564 invokespecial #77 <Method board.Position(int,int)>
>  567 invokevirtual #126 <Method void setTunnelEnd(board.Position)>
>  570 iinc 4 1
>  573 iload 4
>  575 aload_0
>  576 getfield #107 <Field int height>
>  579 if_icmplt 19
>  582 iinc 3 1
>  585 iload_3
>  586 aload_0
>  587 getfield #133 <Field int width>
>  590 if_icmplt 13
>  593 aload_0
>  594 iconst_4
>  595 putfield #112 <Field int n_dest>
>  598 aload_0
>  599 aload_0
>  600 getfield #112 <Field int n_dest>
>  603 anewarray class #54 <Class board.Position>
>  606 putfield #94 <Field board.Position destinations[]>
>  609 iconst_0
>  610 istore 4
>  612 goto 718
>  615 aload_0
>  616 getfield #94 <Field board.Position destinations[]>
>  619 iload 4
>  621 new #54 <Class board.Position>
>  624 dup
>  625 invokespecial #72 <Method board.Position()>
>  628 aastore
>  629 aload_0
>  630 getfield #94 <Field board.Position destinations[]>
>  633 iload 4
>  635 aaload
>  636 aload_1
>  637 aload_0
>  638 getfield #133 <Field int width>
>  641 invokevirtual #114 <Method int nextInt(int)>
>  644 putfield #134 <Field int x>
>  647 aload_0
>  648 getfield #94 <Field board.Position destinations[]>
>  651 iload 4
>  653 aaload
>  654 aload_1
>  655 aload_0
>  656 getfield #107 <Field int height>
>  659 invokevirtual #114 <Method int nextInt(int)>
>  662 putfield #135 <Field int y>
>  665 aload_0
>  666 getfield #88 <Field board.Field board[][]>
>  669 aload_0
>  670 getfield #94 <Field board.Position destinations[]>
>  673 iload 4
>  675 aaload
>  676 getfield #134 <Field int x>
>  679 aaload
>  680 aload_0
>  681 getfield #94 <Field board.Position destinations[]>
>  684 iload 4
>  686 aaload
>  687 getfield #135 <Field int y>
>  690 aaload
>  691 invokevirtual #99 <Method java.lang.String getFunction()>
>  694 ldc #40 <String "normal">
>  696 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  699 ifeq 629
>  702 getstatic #117 <Field java.io.PrintStream out>
>  705 aload_0
>  706 getfield #94 <Field board.Position destinations[]>
>  709 iload 4
>  711 aaload
>  712 invokevirtual #118 <Method void println(java.lang.Object)>
>  715 iinc 4 1
>  718 iload 4
>  720 aload_0
>  721 getfield #112 <Field int n_dest>
>  724 if_icmplt 615
>  727 aload_0
>  728 iconst_4
>  729 putfield #113 <Field int n_startpoints_>
>  732 aload_0
>  733 aload_0
>  734 getfield #113 <Field int n_startpoints_>
>  737 anewarray class #54 <Class board.Position>
>  740 putfield #129 <Field board.Position startpoints_[]>
>  743 iconst_0
>  744 istore 5
>  746 goto 852
>  749 aload_0
>  750 getfield #129 <Field board.Position startpoints_[]>
>  753 iload 5
>  755 new #54 <Class board.Position>
>  758 dup
>  759 invokespecial #72 <Method board.Position()>
>  762 aastore
>  763 aload_0
>  764 getfield #129 <Field board.Position startpoints_[]>
>  767 iload 5
>  769 aaload
>  770 aload_1
>  771 aload_0
>  772 getfield #133 <Field int width>
>  775 invokevirtual #114 <Method int nextInt(int)>
>  778 putfield #134 <Field int x>
>  781 aload_0
>  782 getfield #129 <Field board.Position startpoints_[]>
>  785 iload 5
>  787 aaload
>  788 aload_1
>  789 aload_0
>  790 getfield #107 <Field int height>
>  793 invokevirtual #114 <Method int nextInt(int)>
>  796 putfield #135 <Field int y>
>  799 aload_0
>  800 getfield #88 <Field board.Field board[][]>
>  803 aload_0
>  804 getfield #129 <Field board.Position startpoints_[]>
>  807 iload 5
>  809 aaload
>  810 getfield #134 <Field int x>
>  813 aaload
>  814 aload_0
>  815 getfield #129 <Field board.Position startpoints_[]>
>  818 iload 5
>  820 aaload
>  821 getfield #135 <Field int y>
>  824 aaload
>  825 invokevirtual #99 <Method java.lang.String getFunction()>
>  828 ldc #40 <String "normal">
>  830 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  833 ifeq 763
>  836 getstatic #117 <Field java.io.PrintStream out>
>  839 aload_0
>  840 getfield #129 <Field board.Position startpoints_[]>
>  843 iload 5
>  845 aaload
>  846 invokevirtual #118 <Method void println(java.lang.Object)>
>  849 iinc 5 1
>  852 iload 5
>  854 aload_0
>  855 getfield #113 <Field int n_startpoints_>
>  858 if_icmplt 749
>  861 bipush 7
>  863 anewarray class #53 <Class board.Field>
>  866 astore 6
>  868 iconst_0
>  869 istore 7
>  871 goto 928
>  874 aload 6
>  876 iload 7
>  878 new #53 <Class board.Field>
>  881 dup
>  882 aload_0
>  883 getfield #93 <Field int depth>
>  886 invokespecial #76 <Method board.Field(int)>
>  889 aastore
>  890 iconst_0
>  891 istore 8
>  893 goto 916
>  896 aload 6
>  898 iload 7
>  900 aaload
>  901 iload 8
>  903 aload_1
>  904 sipush 256
>  907 invokevirtual #114 <Method int nextInt(int)>
>  910 invokevirtual #121 <Method void setComponent(int, int)>
>  913 iinc 8 1
>  916 iload 8
>  918 aload_0
>  919 getfield #93 <Field int depth>
>  922 if_icmplt 896
>  925 iinc 7 1
>  928 iload 7
>  930 bipush 7
>  932 if_icmplt 874
>  935 iconst_0
>  936 istore 8
>  938 goto 1059
>  941 iconst_0
>  942 istore 9
>  944 goto 1047
>  947 iconst_0
>  948 istore 10
>  950 goto 1035
>  953 aload 6
>  955 aload_0
>  956 aload_0
>  957 getfield #88 <Field board.Field board[][]>
>  960 iload 8
>  962 aaload
>  963 iload 9
>  965 aaload
>  966 invokevirtual #99 <Method java.lang.String getFunction()>
>  969 invokevirtual #84 <Method int actionToInt(java.lang.String)>
>  972 aaload
>  973 iload 10
>  975 invokevirtual #97 <Method int getComponent(int)>
>  978 istore 11
>  980 iload 11
>  982 aload_1
>  983 bipush 30
>  985 invokevirtual #114 <Method int nextInt(int)>
>  988 bipush 15
>  990 isub
>  991 iadd
>  992 istore 11
>  994 iload 11
>  996 ifge 1002
>  999 iconst_0
> 1000 istore 11
> 1002 iload 11
> 1004 sipush 255
> 1007 if_icmple 1015
> 1010 sipush 255
> 1013 istore 11
> 1015 aload_0
> 1016 getfield #88 <Field board.Field board[][]>
> 1019 iload 8
> 1021 aaload
> 1022 iload 9
> 1024 aaload
> 1025 iload 10
> 1027 iload 11
> 1029 invokevirtual #121 <Method void setComponent(int, int)>
> 1032 iinc 10 1
> 1035 iload 10
> 1037 aload_0
> 1038 getfield #93 <Field int depth>
> 1041 if_icmplt 953
> 1044 iinc 9 1
> 1047 iload 9
> 1049 aload_0
> 1050 getfield #107 <Field int height>
> 1053 if_icmplt 947
> 1056 iinc 8 1
> 1059 iload 8
> 1061 aload_0
> 1062 getfield #133 <Field int width>
> 1065 if_icmplt 941
> 1068 return
> 
> Line numbers for method void randomit()
>    line 141: 0
>    line 139: 7
>    line 154: 8
>    line 152: 9
>    line 149: 10
>    line 171: 13
>    line 169: 14
>    line 166: 16
>    line 186: 19
>    line 190: 20
>    line 189: 22
>    line 184: 25
>    line 193: 27
>    line 206: 30
>    line 210: 31
>    line 209: 33
>    line 204: 36
>    line 195: 38
>    line 196: 40
>    line 199: 43
>    line 201: 45
>    line 200: 47
>    line 216: 50
>    line 218: 52
>    line 217: 54
>    line 221: 57
>    line 223: 61
>    line 222: 62
>    line 226: 63
>    line 225: 65
>    line 232: 66
>    line 230: 68
>    line 214: 71
>    line 240: 74
>    line 242: 76
>    line 241: 78
>    line 244: 81
>    line 246: 83
>    line 245: 85
>    line 249: 88
>    line 251: 92
>    line 250: 93
>    line 254: 94
>    line 253: 96
>    line 260: 97
>    line 258: 99
>    line 238: 102
>    line 268: 105
>    line 270: 107
>    line 269: 109
>    line 272: 112
>    line 274: 114
>    line 273: 116
>    line 277: 119
>    line 279: 123
>    line 278: 124
>    line 282: 125
>    line 281: 127
>    line 288: 128
>    line 286: 130
>    line 266: 133
>    line 296: 136
>    line 298: 138
>    line 297: 140
>    line 300: 143
>    line 302: 145
>    line 301: 147
>    line 305: 150
>    line 307: 154
>    line 306: 155
>    line 310: 156
>    line 309: 158
>    line 316: 159
>    line 314: 161
>    line 320: 164
>    line 322: 168
>    line 321: 169
>    line 325: 170
>    line 324: 172
>    line 330: 173
>    line 334: 174
>    line 333: 175
>    line 337: 178
>    line 336: 179
>    line 329: 180
>    line 294: 183
>    line 344: 186
>    line 346: 188
>    line 345: 190
>    line 348: 193
>    line 350: 195
>    line 349: 197
>    line 353: 200
>    line 355: 204
>    line 354: 205
>    line 358: 206
>    line 357: 208
>    line 364: 209
>    line 362: 211
>    line 370: 214
>    line 374: 215
>    line 373: 216
>    line 368: 219
>    line 379: 221
>    line 377: 223
>    line 385: 252
>    line 387: 256
>    line 386: 257
>    line 390: 258
>    line 389: 260
>    line 396: 261
>    line 394: 263
>    line 400: 266
>    line 405: 269
>    line 407: 273
>    line 406: 274
>    line 410: 275
>    line 409: 277
>    line 416: 278
>    line 414: 280
>    line 420: 283
>    line 425: 286
>    line 427: 290
>    line 426: 291
>    line 430: 292
>    line 429: 294
>    line 436: 295
>    line 434: 297
>    line 440: 300
>    line 445: 303
>    line 447: 307
>    line 446: 308
>    line 450: 309
>    line 449: 311
>    line 456: 312
>    line 454: 314
>    line 460: 317
>    line 467: 320
>    line 469: 322
>    line 468: 324
>    line 471: 327
>    line 473: 329
>    line 472: 331
>    line 476: 334
>    line 478: 338
>    line 477: 339
>    line 481: 340
>    line 480: 342
>    line 487: 343
>    line 485: 345
>    line 493: 348
>    line 497: 349
>    line 496: 350
>    line 491: 353
>    line 502: 355
>    line 500: 357
>    line 508: 384
>    line 510: 388
>    line 509: 389
>    line 513: 390
>    line 512: 392
>    line 519: 393
>    line 517: 395
>    line 523: 398
>    line 528: 401
>    line 530: 405
>    line 529: 406
>    line 533: 407
>    line 532: 409
>    line 539: 410
>    line 537: 412
>    line 543: 415
>    line 548: 418
>    line 550: 422
>    line 549: 423
>    line 553: 424
>    line 552: 426
>    line 559: 427
>    line 557: 429
>    line 563: 432
>    line 570: 435
>    line 572: 437
>    line 571: 439
>    line 575: 442
>    line 577: 446
>    line 576: 447
>    line 580: 448
>    line 579: 450
>    line 586: 451
>    line 584: 453
>    line 599: 456
>    line 603: 457
>    line 605: 458
>    line 604: 459
>    line 602: 460
>    line 597: 463
>    line 610: 465
>    line 614: 466
>    line 616: 468
>    line 615: 469
>    line 613: 470
>    line 608: 473
>    line 621: 475
>    line 623: 477
>    line 622: 478
>    line 625: 481
>    line 627: 483
>    line 626: 485
>    line 630: 488
>    line 635: 491
>    line 637: 495
>    line 636: 497
>    line 640: 498
>    line 639: 500
>    line 644: 501
>    line 648: 504
>    line 646: 506
>    line 652: 509
>    line 654: 513
>    line 653: 514
>    line 657: 515
>    line 656: 517
>    line 662: 518
>    line 665: 522
>    line 667: 524
>    line 662: 526
>    line 661: 529
>    line 671: 532
>    line 673: 536
>    line 672: 538
>    line 676: 539
>    line 675: 541
>    line 682: 542
>    line 680: 544
>    line 686: 547
>    line 688: 551
>    line 687: 553
>    line 691: 554
>    line 690: 556
>    line 696: 557
>    line 699: 561
>    line 701: 562
>    line 696: 564
>    line 695: 567
>    line 180: 570
>    line 173: 573
>    line 175: 575
>    line 176: 576
>    line 174: 579
>    line 163: 582
>    line 156: 585
>    line 158: 586
>    line 159: 587
>    line 157: 590
>    line 708: 593
>    line 710: 594
>    line 708: 595
>    line 712: 598
>    line 717: 599
>    line 714: 603
>    line 712: 606
>    line 725: 609
>    line 723: 610
>    line 720: 612
>    line 735: 615
>    line 737: 619
>    line 740: 621
>    line 736: 628
>    line 747: 629
>    line 749: 633
>    line 748: 635
>    line 754: 636
>    line 758: 637
>    line 757: 641
>    line 751: 644
>    line 761: 647
>    line 763: 651
>    line 762: 653
>    line 768: 654
>    line 772: 655
>    line 771: 659
>    line 765: 662
>    line 779: 665
>    line 781: 669
>    line 783: 673
>    line 782: 675
>    line 785: 676
>    line 780: 679
>    line 789: 680
>    line 791: 684
>    line 790: 686
>    line 793: 687
>    line 788: 690
>    line 798: 691
>    line 804: 694
>    line 802: 696
>    line 810: 702
>    line 815: 705
>    line 817: 709
>    line 816: 711
>    line 814: 712
>    line 732: 715
>    line 727: 718
>    line 729: 720
>    line 728: 724
>    line 822: 727
>    line 824: 728
>    line 822: 729
>    line 826: 732
>    line 831: 733
>    line 828: 737
>    line 826: 740
>    line 839: 743
>    line 837: 744
>    line 834: 746
>    line 849: 749
>    line 851: 753
>    line 854: 755
>    line 850: 762
>    line 861: 763
>    line 863: 767
>    line 862: 769
>    line 868: 770
>    line 872: 771
>    line 871: 775
>    line 865: 778
>    line 875: 781
>    line 877: 785
>    line 876: 787
>    line 882: 788
>    line 886: 789
>    line 885: 793
>    line 879: 796
>    line 893: 799
>    line 895: 803
>    line 897: 807
>    line 896: 809
>    line 899: 810
>    line 894: 813
>    line 903: 814
>    line 905: 818
>    line 904: 820
>    line 907: 821
>    line 902: 824
>    line 912: 825
>    line 918: 828
>    line 916: 830
>    line 924: 836
>    line 929: 839
>    line 931: 843
>    line 930: 845
>    line 928: 846
>    line 846: 849
>    line 841: 852
>    line 843: 854
>    line 842: 858
>    line 944: 861
>    line 941: 863
>    line 939: 866
>    line 952: 868
>    line 950: 869
>    line 947: 871
>    line 962: 874
>    line 964: 876
>    line 967: 878
>    line 970: 882
>    line 971: 883
>    line 967: 886
>    line 963: 889
>    line 980: 890
>    line 978: 891
>    line 975: 893
>    line 992: 896
>    line 994: 898
>    line 993: 900
>    line 999: 901
>    line 1001: 903
>    line 1005: 904
>    line 1004: 907
>    line 998: 910
>    line 989: 913
>    line 982: 916
>    line 984: 918
>    line 985: 919
>    line 983: 922
>    line 959: 925
>    line 954: 928
>    line 956: 930
>    line 955: 932
>    line 1016: 935
>    line 1014: 936
>    line 1011: 938
>    line 1033: 941
>    line 1031: 942
>    line 1028: 944
>    line 1050: 947
>    line 1048: 948
>    line 1045: 950
>    line 1065: 953
>    line 1068: 955
>    line 1069: 956
>    line 1071: 960
>    line 1070: 962
>    line 1074: 963
>    line 1073: 965
>    line 1078: 966
>    line 1068: 969
>    line 1066: 972
>    line 1085: 973
>    line 1084: 975
>    line 1063: 978
>    line 1088: 980
>    line 1090: 982
>    line 1094: 983
>    line 1093: 985
>    line 1097: 988
>    line 1096: 990
>    line 1089: 991
>    line 1088: 992
>    line 1101: 994
>    line 1102: 996
>    line 1107: 999
>    line 1105: 1000
>    line 1111: 1002
>    line 1113: 1004
>    line 1112: 1007
>    line 1117: 1010
>    line 1115: 1013
>    line 1119: 1015
>    line 1121: 1019
>    line 1120: 1021
>    line 1124: 1022
>    line 1123: 1024
>    line 1129: 1025
>    line 1131: 1027
>    line 1128: 1029
>    line 1059: 1032
>    line 1052: 1035
>    line 1054: 1037
>    line 1055: 1038
>    line 1053: 1041
>    line 1042: 1044
>    line 1035: 1047
>    line 1037: 1049
>    line 1038: 1050
>    line 1036: 1053
>    line 1025: 1056
>    line 1018: 1059
>    line 1020: 1061
>    line 1021: 1062
>    line 1019: 1065
>    line 134: 1068
> 
> Method void save(java.lang.String)
>    0 new #59 <Class java.io.FileWriter>
>    3 dup
>    4 aload_1
>    5 invokespecial #81 <Method java.io.FileWriter(java.lang.String)>
>    8 astore_2
>    9 new #64 <Class java.io.PrintWriter>
>   12 dup
>   13 aload_2
>   14 invokespecial #79 <Method java.io.PrintWriter(java.io.Writer)>
>   17 astore_3
>   18 ldc #1 <String "">
>   20 astore 4
>   22 new #68 <Class java.lang.StringBuffer>
>   25 dup
>   26 aload 4
>   28 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>   31 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>   34 ldc #26 <String "boardsize ">
>   36 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>   39 aload_0
>   40 getfield #133 <Field int width>
>   43 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>   46 ldc #4 <String " ">
>   48 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>   51 aload_0
>   52 getfield #107 <Field int height>
>   55 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>   58 ldc #4 <String " ">
>   60 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>   63 aload_0
>   64 getfield #93 <Field int depth>
>   67 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>   70 invokevirtual #131 <Method java.lang.String toString()>
>   73 astore 4
>   75 aload_3
>   76 aload 4
>   78 invokevirtual #120 <Method void println(java.lang.String)>
>   81 ldc #1 <String "">
>   83 astore 4
>   85 iconst_0
>   86 istore 5
>   88 goto 187
>   91 new #68 <Class java.lang.StringBuffer>
>   94 dup
>   95 aload 4
>   97 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>  100 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  103 ldc #24 <String "board ">
>  105 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  108 iload 5
>  110 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  113 ldc #4 <String " ">
>  115 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  118 invokevirtual #131 <Method java.lang.String toString()>
>  121 astore 4
>  123 iconst_0
>  124 istore 6
>  126 goto 165
>  129 new #68 <Class java.lang.StringBuffer>
>  132 dup
>  133 aload 4
>  135 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>  138 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  141 aload_0
>  142 iload 6
>  144 iload 5
>  146 invokevirtual #98 <Method board.Field getField(int, int)>
>  149 invokevirtual #86 <Method java.lang.StringBuffer append(java.lang.Object)>
>  152 ldc #4 <String " ">
>  154 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  157 invokevirtual #131 <Method java.lang.String toString()>
>  160 astore 4
>  162 iinc 6 1
>  165 iload 6
>  167 aload_0
>  168 invokevirtual #105 <Method int getWidth()>
>  171 if_icmplt 129
>  174 aload_3
>  175 aload 4
>  177 invokevirtual #120 <Method void println(java.lang.String)>
>  180 ldc #1 <String "">
>  182 astore 4
>  184 iinc 5 1
>  187 iload 5
>  189 aload_0
>  190 invokevirtual #101 <Method int getHeight()>
>  193 if_icmplt 91
>  196 aload_3
>  197 new #68 <Class java.lang.StringBuffer>
>  200 dup
>  201 ldc #39 <String "ndest ">
>  203 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  206 aload_0
>  207 getfield #112 <Field int n_dest>
>  210 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  213 invokevirtual #131 <Method java.lang.String toString()>
>  216 invokevirtual #120 <Method void println(java.lang.String)>
>  219 iconst_0
>  220 istore 6
>  222 goto 301
>  225 ldc #1 <String "">
>  227 astore 4
>  229 new #68 <Class java.lang.StringBuffer>
>  232 dup
>  233 aload 4
>  235 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>  238 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  241 ldc #28 <String "destination ">
>  243 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  246 iload 6
>  248 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  251 ldc #4 <String " ">
>  253 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  256 aload_0
>  257 getfield #94 <Field board.Position destinations[]>
>  260 iload 6
>  262 aaload
>  263 getfield #134 <Field int x>
>  266 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  269 ldc #4 <String " ">
>  271 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  274 aload_0
>  275 getfield #94 <Field board.Position destinations[]>
>  278 iload 6
>  280 aaload
>  281 getfield #135 <Field int y>
>  284 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  287 invokevirtual #131 <Method java.lang.String toString()>
>  290 astore 4
>  292 aload_3
>  293 aload 4
>  295 invokevirtual #120 <Method void println(java.lang.String)>
>  298 iinc 6 1
>  301 iload 6
>  303 aload_0
>  304 getfield #112 <Field int n_dest>
>  307 if_icmplt 225
>  310 aload_3
>  311 new #68 <Class java.lang.StringBuffer>
>  314 dup
>  315 ldc #43 <String "nstartpoints ">
>  317 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  320 aload_0
>  321 getfield #113 <Field int n_startpoints_>
>  324 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  327 invokevirtual #131 <Method java.lang.String toString()>
>  330 invokevirtual #120 <Method void println(java.lang.String)>
>  333 iconst_0
>  334 istore 7
>  336 goto 415
>  339 ldc #1 <String "">
>  341 astore 4
>  343 new #68 <Class java.lang.StringBuffer>
>  346 dup
>  347 aload 4
>  349 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>  352 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  355 ldc #47 <String "startpoint ">
>  357 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  360 iload 7
>  362 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  365 ldc #4 <String " ">
>  367 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  370 aload_0
>  371 getfield #129 <Field board.Position startpoints_[]>
>  374 iload 7
>  376 aaload
>  377 getfield #134 <Field int x>
>  380 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  383 ldc #4 <String " ">
>  385 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  388 aload_0
>  389 getfield #129 <Field board.Position startpoints_[]>
>  392 iload 7
>  394 aaload
>  395 getfield #135 <Field int y>
>  398 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  401 invokevirtual #131 <Method java.lang.String toString()>
>  404 astore 4
>  406 aload_3
>  407 aload 4
>  409 invokevirtual #120 <Method void println(java.lang.String)>
>  412 iinc 7 1
>  415 iload 7
>  417 aload_0
>  418 getfield #113 <Field int n_startpoints_>
>  421 if_icmplt 339
>  424 ldc #1 <String "">
>  426 astore 4
>  428 iconst_0
>  429 istore 9
>  431 goto 762
>  434 iconst_0
>  435 istore 10
>  437 goto 750
>  440 aload_0
>  441 getfield #88 <Field board.Field board[][]>
>  444 iload 9
>  446 aaload
>  447 iload 10
>  449 aaload
>  450 astore 8
>  452 ldc #31 <String "field">
>  454 astore 4
>  456 new #68 <Class java.lang.StringBuffer>
>  459 dup
>  460 aload 4
>  462 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>  465 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  468 ldc #4 <String " ">
>  470 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  473 iload 9
>  475 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  478 ldc #4 <String " ">
>  480 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  483 iload 10
>  485 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  488 ldc #4 <String " ">
>  490 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  493 aload 8
>  495 invokevirtual #99 <Method java.lang.String getFunction()>
>  498 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  501 ldc #4 <String " ">
>  503 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  506 invokevirtual #131 <Method java.lang.String toString()>
>  509 astore 4
>  511 aload 8
>  513 invokevirtual #99 <Method java.lang.String getFunction()>
>  516 ldc #48 <String "tunnel">
>  518 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  521 ifeq 571
>  524 new #68 <Class java.lang.StringBuffer>
>  527 dup
>  528 aload 4
>  530 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>  533 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  536 aload 8
>  538 invokevirtual #103 <Method board.Position getTunnelEnd()>
>  541 getfield #134 <Field int x>
>  544 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  547 ldc #4 <String " ">
>  549 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  552 aload 8
>  554 invokevirtual #103 <Method board.Position getTunnelEnd()>
>  557 getfield #135 <Field int y>
>  560 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  563 invokevirtual #131 <Method java.lang.String toString()>
>  566 astore 4
>  568 goto 741
>  571 aload 8
>  573 invokevirtual #99 <Method java.lang.String getFunction()>
>  576 ldc #49 <String "vortex">
>  578 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  581 ifeq 612
>  584 new #68 <Class java.lang.StringBuffer>
>  587 dup
>  588 aload 4
>  590 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>  593 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  596 aload 8
>  598 invokevirtual #104 <Method java.lang.String getVortexDirection()>
>  601 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  604 invokevirtual #131 <Method java.lang.String toString()>
>  607 astore 4
>  609 goto 741
>  612 aload 8
>  614 invokevirtual #99 <Method java.lang.String getFunction()>
>  617 ldc #34 <String "glacier">
>  619 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  622 ifeq 653
>  625 new #68 <Class java.lang.StringBuffer>
>  628 dup
>  629 aload 4
>  631 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>  634 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  637 aload 8
>  639 invokevirtual #100 <Method java.lang.String getGlacierDirection()>
>  642 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  645 invokevirtual #131 <Method java.lang.String toString()>
>  648 astore 4
>  650 goto 741
>  653 aload 8
>  655 invokevirtual #99 <Method java.lang.String getFunction()>
>  658 ldc #36 <String "marsh">
>  660 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  663 ifeq 694
>  666 new #68 <Class java.lang.StringBuffer>
>  669 dup
>  670 aload 4
>  672 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>  675 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  678 aload 8
>  680 invokevirtual #102 <Method int getMarshDepth()>
>  683 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  686 invokevirtual #131 <Method java.lang.String toString()>
>  689 astore 4
>  691 goto 741
>  694 aload 8
>  696 invokevirtual #99 <Method java.lang.String getFunction()>
>  699 ldc #37 <String "mountain">
>  701 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  704 ifne 741
>  707 aload 8
>  709 invokevirtual #99 <Method java.lang.String getFunction()>
>  712 ldc #22 <String "alien">
>  714 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  717 ifne 741
>  720 aload 8
>  722 invokevirtual #99 <Method java.lang.String getFunction()>
>  725 ldc #40 <String "normal">
>  727 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>  730 ifne 741
>  733 getstatic #117 <Field java.io.PrintStream out>
>  736 ldc #21 <String "Strange field reached while saving board">
>  738 invokevirtual #119 <Method void println(java.lang.String)>
>  741 aload_3
>  742 aload 4
>  744 invokevirtual #120 <Method void println(java.lang.String)>
>  747 iinc 10 1
>  750 iload 10
>  752 aload_0
>  753 invokevirtual #101 <Method int getHeight()>
>  756 if_icmplt 440
>  759 iinc 9 1
>  762 iload 9
>  764 aload_0
>  765 invokevirtual #105 <Method int getWidth()>
>  768 if_icmplt 434
>  771 aload_3
>  772 ldc #32 <String "fileend">
>  774 invokevirtual #120 <Method void println(java.lang.String)>
>  777 aload_3
>  778 invokevirtual #92 <Method void close()>
>  781 aload_2
>  782 invokevirtual #91 <Method void close()>
>  785 goto 820
>  788 astore_2
>  789 getstatic #117 <Field java.io.PrintStream out>
>  792 new #68 <Class java.lang.StringBuffer>
>  795 dup
>  796 ldc #11 <String "ERROR in writing a board to '">
>  798 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  801 aload_1
>  802 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  805 ldc #7 <String "': ">
>  807 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  810 aload_2
>  811 invokevirtual #86 <Method java.lang.StringBuffer append(java.lang.Object)>
>  814 invokevirtual #131 <Method java.lang.String toString()>
>  817 invokevirtual #119 <Method void println(java.lang.String)>
>  820 return
> Exception table:
>    from   to  target type
>      0   785   788   <Class java.lang.Exception>
> 
> Line numbers for method void save(java.lang.String)
>    line 3270: 0
>    line 3275: 0
>    line 3278: 4
>    line 3275: 5
>    line 3273: 8
>    line 3284: 9
>    line 3287: 13
>    line 3284: 14
>    line 3282: 17
>    line 3293: 18
>    line 3291: 20
>    line 3296: 22
>    line 3295: 26
>    line 3296: 31
>    line 3300: 34
>    line 3305: 39
>    line 3306: 40
>    line 3310: 46
>    line 3313: 51
>    line 3314: 52
>    line 3318: 58
>    line 3321: 63
>    line 3322: 64
>    line 3296: 70
>    line 3295: 73
>    line 3325: 75
>    line 3329: 76
>    line 3328: 78
>    line 3334: 81
>    line 3332: 83
>    line 3341: 85
>    line 3339: 86
>    line 3336: 88
>    line 3356: 91
>    line 3355: 95
>    line 3356: 100
>    line 3360: 103
>    line 3365: 108
>    line 3368: 113
>    line 3356: 118
>    line 3355: 121
>    line 3376: 123
>    line 3374: 124
>    line 3371: 126
>    line 3391: 129
>    line 3390: 133
>    line 3391: 138
>    line 3392: 141
>    line 3396: 142
>    line 3398: 144
>    line 3395: 146
>    line 3401: 152
>    line 3391: 157
>    line 3390: 160
>    line 3387: 162
>    line 3378: 165
>    line 3380: 167
>    line 3383: 168
>    line 3379: 171
>    line 3404: 174
>    line 3408: 175
>    line 3407: 177
>    line 3413: 180
>    line 3411: 182
>    line 3352: 184
>    line 3343: 187
>    line 3345: 189
>    line 3348: 190
>    line 3344: 193
>    line 3416: 196
>    line 3423: 197
>    line 3428: 206
>    line 3429: 207
>    line 3427: 213
>    line 3419: 216
>    line 3438: 219
>    line 3436: 220
>    line 3433: 222
>    line 3452: 225
>    line 3450: 227
>    line 3455: 229
>    line 3454: 233
>    line 3455: 238
>    line 3459: 241
>    line 3464: 246
>    line 3467: 251
>    line 3470: 256
>    line 3472: 260
>    line 3471: 262
>    line 3474: 263
>    line 3478: 269
>    line 3481: 274
>    line 3483: 278
>    line 3482: 280
>    line 3485: 281
>    line 3455: 287
>    line 3454: 290
>    line 3488: 292
>    line 3492: 293
>    line 3491: 295
>    line 3447: 298
>    line 3440: 301
>    line 3442: 303
>    line 3443: 304
>    line 3441: 307
>    line 3496: 310
>    line 3503: 311
>    line 3508: 320
>    line 3509: 321
>    line 3507: 327
>    line 3499: 330
>    line 3518: 333
>    line 3516: 334
>    line 3513: 336
>    line 3532: 339
>    line 3530: 341
>    line 3535: 343
>    line 3534: 347
>    line 3535: 352
>    line 3539: 355
>    line 3544: 360
>    line 3547: 365
>    line 3550: 370
>    line 3552: 374
>    line 3551: 376
>    line 3554: 377
>    line 3558: 383
>    line 3561: 388
>    line 3563: 392
>    line 3562: 394
>    line 3565: 395
>    line 3535: 401
>    line 3534: 404
>    line 3568: 406
>    line 3572: 407
>    line 3571: 409
>    line 3527: 412
>    line 3520: 415
>    line 3522: 417
>    line 3523: 418
>    line 3521: 421
>    line 3578: 424
>    line 3576: 426
>    line 3588: 428
>    line 3586: 429
>    line 3583: 431
>    line 3607: 434
>    line 3605: 435
>    line 3602: 437
>    line 3623: 440
>    line 3625: 444
>    line 3624: 446
>    line 3628: 447
>    line 3627: 449
>    line 3621: 450
>    line 3634: 452
>    line 3631: 454
>    line 3638: 456
>    line 3637: 460
>    line 3638: 465
>    line 3640: 468
>    line 3643: 473
>    line 3646: 478
>    line 3649: 483
>    line 3652: 488
>    line 3655: 493
>    line 3658: 495
>    line 3662: 501
>    line 3638: 506
>    line 3637: 509
>    line 3667: 511
>    line 3670: 513
>    line 3676: 516
>    line 3674: 518
>    line 3682: 524
>    line 3681: 528
>    line 3682: 533
>    line 3683: 536
>    line 3686: 538
>    line 3688: 541
>    line 3692: 547
>    line 3695: 552
>    line 3698: 554
>    line 3700: 557
>    line 3682: 563
>    line 3681: 566
>    line 3665: 568
>    line 3707: 571
>    line 3710: 573
>    line 3716: 576
>    line 3714: 578
>    line 3722: 584
>    line 3721: 588
>    line 3722: 593
>    line 3723: 596
>    line 3726: 598
>    line 3722: 604
>    line 3721: 607
>    line 3705: 609
>    line 3733: 612
>    line 3736: 614
>    line 3742: 617
>    line 3740: 619
>    line 3748: 625
>    line 3747: 629
>    line 3748: 634
>    line 3749: 637
>    line 3752: 639
>    line 3748: 645
>    line 3747: 648
>    line 3731: 650
>    line 3759: 653
>    line 3762: 655
>    line 3768: 658
>    line 3766: 660
>    line 3774: 666
>    line 3773: 670
>    line 3774: 675
>    line 3775: 678
>    line 3778: 680
>    line 3774: 686
>    line 3773: 689
>    line 3757: 691
>    line 3785: 694
>    line 3788: 696
>    line 3794: 699
>    line 3792: 701
>    line 3803: 707
>    line 3806: 709
>    line 3812: 712
>    line 3810: 714
>    line 3821: 720
>    line 3824: 722
>    line 3830: 725
>    line 3828: 727
>    line 3839: 733
>    line 3844: 736
>    line 3843: 738
>    line 3848: 741
>    line 3852: 742
>    line 3851: 744
>    line 3618: 747
>    line 3609: 750
>    line 3611: 752
>    line 3614: 753
>    line 3610: 756
>    line 3599: 759
>    line 3590: 762
>    line 3592: 764
>    line 3595: 765
>    line 3591: 768
>    line 3857: 771
>    line 3862: 772
>    line 3860: 774
>    line 3866: 777
>    line 3869: 778
>    line 3872: 781
>    line 3875: 782
>    line 3270: 785
>    line 3879: 788
>    line 3886: 789
>    line 3891: 792
>    line 3893: 801
>    line 3895: 805
>    line 3897: 810
>    line 3896: 814
>    line 3890: 817
>    line 3264: 820
> 
> Method void setDest(int, int, int)
>    0 aload_0
>    1 getfield #94 <Field board.Position destinations[]>
>    4 iload_1
>    5 new #54 <Class board.Position>
>    8 dup
>    9 iload_2
>   10 iload_3
>   11 invokespecial #77 <Method board.Position(int,int)>
>   14 aastore
>   15 return
> 
> Line numbers for method void setDest(int, int, int)
>    line 1748: 0
>    line 1750: 4
>    line 1753: 5
>    line 1756: 9
>    line 1758: 10
>    line 1753: 11
>    line 1749: 14
>    line 1736: 15
> 
> Method void setDest(int, board.Position)
>    0 aload_0
>    1 getfield #94 <Field board.Position destinations[]>
>    4 iload_1
>    5 aload_2
>    6 aastore
>    7 return
> 
> Line numbers for method void setDest(int, board.Position)
>    line 1726: 0
>    line 1728: 4
>    line 1731: 5
>    line 1727: 6
>    line 1717: 7
> 
> Method void setField(int, int, board.Field)
>    0 aload_0
>    1 getfield #88 <Field board.Field board[][]>
>    4 iload_1
>    5 aaload
>    6 iload_2
>    7 aload_3
>    8 aastore
>    9 return
> 
> Line numbers for method void setField(int, int, board.Field)
>    line 2053: 0
>    line 2055: 4
>    line 2054: 5
>    line 2058: 6
>    line 2061: 7
>    line 2057: 8
>    line 2041: 9
> 
> Method void setNDest(int)
>    0 aload_0
>    1 iload_1
>    2 putfield #112 <Field int n_dest>
>    5 aload_0
>    6 aload_0
>    7 getfield #112 <Field int n_dest>
>   10 anewarray class #54 <Class board.Position>
>   13 putfield #94 <Field board.Position destinations[]>
>   16 iconst_0
>   17 istore_2
>   18 goto 37
>   21 aload_0
>   22 getfield #94 <Field board.Position destinations[]>
>   25 iload_2
>   26 new #54 <Class board.Position>
>   29 dup
>   30 invokespecial #72 <Method board.Position()>
>   33 aastore
>   34 iinc 2 1
>   37 iload_2
>   38 aload_0
>   39 getfield #112 <Field int n_dest>
>   42 if_icmplt 21
>   45 return
> 
> Line numbers for method void setNDest(int)
>    line 1657: 0
>    line 1661: 1
>    line 1658: 2
>    line 1663: 5
>    line 1668: 6
>    line 1669: 7
>    line 1665: 10
>    line 1663: 13
>    line 1678: 16
>    line 1676: 17
>    line 1673: 18
>    line 1688: 21
>    line 1690: 25
>    line 1693: 26
>    line 1689: 33
>    line 1685: 34
>    line 1680: 37
>    line 1682: 38
>    line 1681: 42
>    line 1651: 45
> 
> Method void setNStartPoints(int)
>    0 aload_0
>    1 iload_1
>    2 putfield #113 <Field int n_startpoints_>
>    5 aload_0
>    6 iload_1
>    7 anewarray class #54 <Class board.Position>
>   10 putfield #129 <Field board.Position startpoints_[]>
>   13 return
> 
> Line numbers for method void setNStartPoints(int)
>    line 1770: 0
>    line 1772: 1
>    line 1770: 2
>    line 1774: 5
>    line 1779: 6
>    line 1776: 7
>    line 1774: 10
>    line 1764: 13
> 
> Method void setStartPoint(int, board.Position)
>    0 aload_0
>    1 getfield #129 <Field board.Position startpoints_[]>
>    4 iload_1
>    5 aload_2
>    6 aastore
>    7 return
> 
> Line numbers for method void setStartPoint(int, board.Position)
>    line 1819: 0
>    line 1821: 4
>    line 1824: 5
>    line 1820: 6
>    line 1810: 7
> 
> Method int spinToInt(java.lang.String)
>    0 iconst_0
>    1 istore_2
>    2 goto 22
>    5 aload_1
>    6 aload_0
>    7 iload_2
>    8 invokevirtual #110 <Method java.lang.String intToSpin(int)>
>   11 invokevirtual #95 <Method boolean equals(java.lang.Object)>
>   14 ifeq 19
>   17 iload_2
>   18 ireturn
>   19 iinc 2 1
>   22 iload_2
>   23 iconst_3
>   24 if_icmplt 5
>   27 getstatic #117 <Field java.io.PrintStream out>
>   30 ldc #16 <String "Error in spinToInt">
>   32 invokevirtual #119 <Method void println(java.lang.String)>
>   35 iconst_0
>   36 ireturn
> 
> Line numbers for method int spinToInt(java.lang.String)
>    line 1469: 0
>    line 1467: 1
>    line 1464: 2
>    line 1481: 5
>    line 1486: 6
>    line 1487: 7
>    line 1486: 8
>    line 1484: 11
>    line 1492: 17
>    line 1491: 18
>    line 1475: 19
>    line 1471: 22
>    line 1473: 23
>    line 1472: 24
>    line 1496: 27
>    line 1501: 30
>    line 1500: 32
>    line 1505: 35
>    line 1504: 36
> 
> Method java.lang.String toString()
>    0 ldc #1 <String "">
>    2 astore_1
>    3 iconst_0
>    4 istore_2
>    5 goto 102
>    8 new #68 <Class java.lang.StringBuffer>
>   11 dup
>   12 aload_1
>   13 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>   16 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>   19 iload_2
>   20 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>   23 ldc #8 <String ": ">
>   25 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>   28 invokevirtual #131 <Method java.lang.String toString()>
>   31 astore_1
>   32 iconst_0
>   33 istore_3
>   34 goto 71
>   37 new #68 <Class java.lang.StringBuffer>
>   40 dup
>   41 aload_1
>   42 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>   45 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>   48 aload_0
>   49 getfield #88 <Field board.Field board[][]>
>   52 iload_3
>   53 aaload
>   54 iload_2
>   55 aaload
>   56 invokevirtual #86 <Method java.lang.StringBuffer append(java.lang.Object)>
>   59 ldc #4 <String " ">
>   61 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>   64 invokevirtual #131 <Method java.lang.String toString()>
>   67 astore_1
>   68 iinc 3 1
>   71 iload_3
>   72 aload_0
>   73 getfield #133 <Field int width>
>   76 if_icmplt 37
>   79 new #68 <Class java.lang.StringBuffer>
>   82 dup
>   83 aload_1
>   84 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>   87 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>   90 ldc #3 <String "
> ">
>   92 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>   95 invokevirtual #131 <Method java.lang.String toString()>
>   98 astore_1
>   99 iinc 2 1
>  102 iload_2
>  103 aload_0
>  104 getfield #107 <Field int height>
>  107 if_icmplt 8
>  110 iconst_0
>  111 istore_3
>  112 goto 211
>  115 new #68 <Class java.lang.StringBuffer>
>  118 dup
>  119 aload_1
>  120 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>  123 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  126 ldc #9 <String "Dest ">
>  128 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  131 invokevirtual #131 <Method java.lang.String toString()>
>  134 astore_1
>  135 new #68 <Class java.lang.StringBuffer>
>  138 dup
>  139 aload_1
>  140 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>  143 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  146 iload_3
>  147 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  150 invokevirtual #131 <Method java.lang.String toString()>
>  153 astore_1
>  154 new #68 <Class java.lang.StringBuffer>
>  157 dup
>  158 aload_1
>  159 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>  162 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  165 ldc #4 <String " ">
>  167 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  170 aload_0
>  171 getfield #94 <Field board.Position destinations[]>
>  174 iload_3
>  175 aaload
>  176 getfield #134 <Field int x>
>  179 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  182 ldc #4 <String " ">
>  184 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  187 aload_0
>  188 getfield #94 <Field board.Position destinations[]>
>  191 iload_3
>  192 aaload
>  193 getfield #135 <Field int y>
>  196 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  199 ldc #3 <String "
> ">
>  201 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  204 invokevirtual #131 <Method java.lang.String toString()>
>  207 astore_1
>  208 iinc 3 1
>  211 iload_3
>  212 aload_0
>  213 getfield #112 <Field int n_dest>
>  216 if_icmplt 115
>  219 iconst_0
>  220 istore 4
>  222 goto 324
>  225 new #68 <Class java.lang.StringBuffer>
>  228 dup
>  229 aload_1
>  230 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>  233 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  236 ldc #20 <String "Start ">
>  238 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  241 invokevirtual #131 <Method java.lang.String toString()>
>  244 astore_1
>  245 new #68 <Class java.lang.StringBuffer>
>  248 dup
>  249 aload_1
>  250 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>  253 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  256 iload 4
>  258 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  261 invokevirtual #131 <Method java.lang.String toString()>
>  264 astore_1
>  265 new #68 <Class java.lang.StringBuffer>
>  268 dup
>  269 aload_1
>  270 invokestatic #132 <Method java.lang.String valueOf(java.lang.Object)>
>  273 invokespecial #83 <Method java.lang.StringBuffer(java.lang.String)>
>  276 ldc #4 <String " ">
>  278 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  281 aload_0
>  282 getfield #129 <Field board.Position startpoints_[]>
>  285 iload 4
>  287 aaload
>  288 getfield #134 <Field int x>
>  291 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  294 ldc #4 <String " ">
>  296 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  299 aload_0
>  300 getfield #129 <Field board.Position startpoints_[]>
>  303 iload 4
>  305 aaload
>  306 getfield #135 <Field int y>
>  309 invokevirtual #85 <Method java.lang.StringBuffer append(int)>
>  312 ldc #3 <String "
> ">
>  314 invokevirtual #87 <Method java.lang.StringBuffer append(java.lang.String)>
>  317 invokevirtual #131 <Method java.lang.String toString()>
>  320 astore_1
>  321 iinc 4 1
>  324 iload 4
>  326 aload_0
>  327 getfield #113 <Field int n_startpoints_>
>  330 if_icmplt 225
>  333 aload_1
>  334 areturn
> 
> Line numbers for method java.lang.String toString()
>    line 1836: 0
>    line 1834: 2
>    line 1843: 3
>    line 1841: 4
>    line 1838: 5
>    line 1854: 8
>    line 1853: 12
>    line 1854: 16
>    line 1855: 19
>    line 1857: 23
>    line 1854: 28
>    line 1853: 31
>    line 1864: 32
>    line 1862: 33
>    line 1859: 34
>    line 1875: 37
>    line 1874: 41
>    line 1875: 45
>    line 1876: 48
>    line 1878: 52
>    line 1877: 53
>    line 1881: 54
>    line 1880: 55
>    line 1884: 59
>    line 1875: 64
>    line 1874: 67
>    line 1871: 68
>    line 1866: 71
>    line 1868: 72
>    line 1867: 76
>    line 1888: 79
>    line 1887: 83
>    line 1888: 87
>    line 1889: 90
>    line 1888: 95
>    line 1887: 98
>    line 1850: 99
>    line 1845: 102
>    line 1847: 103
>    line 1846: 107
>    line 1897: 110
>    line 1895: 111
>    line 1892: 112
>    line 1908: 115
>    line 1907: 119
>    line 1908: 123
>    line 1909: 126
>    line 1908: 131
>    line 1907: 134
>    line 1912: 135
>    line 1911: 139
>    line 1912: 143
>    line 1913: 146
>    line 1912: 150
>    line 1911: 153
>    line 1916: 154
>    line 1915: 158
>    line 1916: 162
>    line 1917: 165
>    line 1919: 170
>    line 1921: 174
>    line 1920: 175
>    line 1923: 176
>    line 1926: 182
>    line 1928: 187
>    line 1930: 191
>    line 1929: 192
>    line 1932: 193
>    line 1935: 199
>    line 1916: 204
>    line 1915: 207
>    line 1904: 208
>    line 1899: 211
>    line 1901: 212
>    line 1900: 216
>    line 1943: 219
>    line 1941: 220
>    line 1938: 222
>    line 1954: 225
>    line 1953: 229
>    line 1954: 233
>    line 1955: 236
>    line 1954: 241
>    line 1953: 244
>    line 1958: 245
>    line 1957: 249
>    line 1958: 253
>    line 1959: 256
>    line 1958: 261
>    line 1957: 264
>    line 1962: 265
>    line 1961: 269
>    line 1962: 273
>    line 1963: 276
>    line 1965: 281
>    line 1967: 285
>    line 1966: 287
>    line 1969: 288
>    line 1972: 294
>    line 1974: 299
>    line 1976: 303
>    line 1975: 305
>    line 1978: 306
>    line 1981: 312
>    line 1962: 317
>    line 1961: 320
>    line 1950: 321
>    line 1945: 324
>    line 1947: 326
>    line 1946: 330
>    line 1985: 333
>    line 1984: 334

/* Soot - a J*va Optimization Framework
 * Copyright (C) 1997-1999 Raja Vallee-Rai
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

/*
 * Modified by the Sable Research Group and others 1997-1999.  
 * See the 'credits' file distributed with Soot for the complete list of
 * contributors.  (Soot is distributed at http://www.sable.mcgill.ca/soot)
 */

/* Reference Version: $SootVersion: 1.2.5.dev.5 $ */

package soot.jimple.toolkits.base;

import soot.*;
import soot.jimple.*;
import soot.toolkits.scalar.*;
import soot.toolkits.graph.*;
import soot.util.*;
import java.util.*;

public class Aggregator extends BodyTransformer
{
    private static Aggregator instance = new Aggregator();
    private Aggregator() {}

    public static Aggregator v() { return instance; }
    
    public static int nodeCount = 0;
    public static int aggrCount = 0;

    public String getDeclaredOptions() 
    { return super.getDeclaredOptions() + " only-stack-locals"; }

    /** Traverse the statements in the given body, looking for
      *  aggregation possibilities; that is, given a def d and a use u,
      *  d has no other uses, u has no other defs, collapse d and u. 
      * 
      * option: only-stack-locals; if this is true, only aggregate variables
                        starting with $ */
    protected void internalTransform(Body b, String phaseName, Map options)
    {
        StmtBody body = (StmtBody)b;
        boolean onlyStackVars = Options.getBoolean(options, "only-stack-locals"); 

        int aggregateCount = 1;

        if(Main.isProfilingOptimization)
            Main.aggregationTimer.start();
         boolean changed = false;

        Map boxToZone = new HashMap(body.getUnits().size() * 2 + 1, 0.7f);

        // Determine the zone of every box
        {
            Zonation zonation = new Zonation(body);
            
            Iterator unitIt = body.getUnits().iterator();
            
            while(unitIt.hasNext())
            {
                Unit u = (Unit) unitIt.next();
                Zone zone = (Zone) zonation.getZoneOf(u);
                
                Iterator boxIt = u.getUseBoxes().iterator();
                while(boxIt.hasNext())
                {
                    ValueBox box = (ValueBox) boxIt.next();                    
                    boxToZone.put(box, zone);
                }   
                boxIt = u.getDefBoxes().iterator();
                while(boxIt.hasNext())
                {
                    ValueBox box = (ValueBox) boxIt.next();                    
                    boxToZone.put(box, zone);
                }   
            }
        }        
        
                     
        do {
            if(Main.isVerbose)
                System.out.println("[" + body.getMethod().getName() + "] Aggregating iteration " + aggregateCount + "...");
        
            // body.printTo(new java.io.PrintWriter(System.out, true));
            
            changed = internalAggregate(body, boxToZone, onlyStackVars);
            
            aggregateCount++;
        } while(changed);
        
        if(Main.isProfilingOptimization)
            Main.aggregationTimer.end();
            
    }
  
  private static boolean internalAggregate(StmtBody body, Map boxToZone, boolean onlyStackVars)
    {
      Iterator stmtIt;
      LocalUses localUses;
      LocalDefs localDefs;
      CompleteUnitGraph graph;
      boolean hadAggregation = false;
      Chain units = body.getUnits();
      
      graph = new CompleteUnitGraph(body);
      localDefs = new SimpleLocalDefs(graph);
      localUses = new SimpleLocalUses(graph, localDefs);
          
      stmtIt = (new PseudoTopologicalOrderer()).newList(graph).iterator();
      
      while (stmtIt.hasNext())
        {
          Stmt s = (Stmt)(stmtIt.next());
              
          if (!(s instanceof AssignStmt))
            continue;
          
          Value lhs = ((AssignStmt)s).getLeftOp();
          if (!(lhs instanceof Local))
            continue;
    
          if(onlyStackVars && !((Local) lhs).getName().startsWith("$"))
            continue;
            
          List lu = localUses.getUsesOf((AssignStmt)s);
          if (lu.size() != 1)
            continue;
            
          UnitValueBoxPair usepair = (UnitValueBoxPair)lu.get(0);
          Unit use = usepair.unit;
          ValueBox useBox = usepair.valueBox;
              
          List ld = localDefs.getDefsOfAt((Local)lhs, use);
          if (ld.size() != 1)
            continue;
   
          // Check to make sure aggregation pair in the same zone
            if(boxToZone.get(((AssignStmt) s).getRightOpBox()) != boxToZone.get(usepair.valueBox))
            {
                continue;
            }  
             
          /* we need to check the path between def and use */
          /* to see if there are any intervening re-defs of RHS */
          /* in fact, we should check that this path is unique. */
          /* if the RHS uses only locals, then we know what
             to do; if RHS has a method invocation f(a, b,
             c) or field access, we must ban field writes, other method
             calls and (as usual) writes to a, b, c. */
          
          boolean cantAggr = false;
          boolean propagatingInvokeExpr = false;
          boolean propagatingFieldRef = false;
          boolean propagatingArrayRef = false;
          ArrayList fieldRefList = new ArrayList();
      
          Value rhs = ((AssignStmt)s).getRightOp();
          LinkedList localsUsed = new LinkedList();
          for (Iterator useIt = (s.getUseBoxes()).iterator();
               useIt.hasNext(); )
            {
              Value v = ((ValueBox)(useIt.next())).getValue();
                if (v instanceof Local)
                    localsUsed.add(v);
                else if (v instanceof InvokeExpr)
                    propagatingInvokeExpr = true;
                else if(v instanceof ArrayRef)
                    propagatingArrayRef = true;
                else if(v instanceof FieldRef)
                {
                    propagatingFieldRef = true;
                    fieldRefList.add(v);
                }
            }
          
          // look for a path from s to use in graph.
          // only look in an extended basic block, though.

          List path = graph.getExtendedBasicBlockPathBetween(s, use);
      
          if (path == null)
            continue;

          Iterator pathIt = path.iterator();

          // skip s.
          if (pathIt.hasNext())
            pathIt.next();

          while (pathIt.hasNext() && !cantAggr)
          {
              Stmt between = (Stmt)(pathIt.next());
          
              if(between != use)    
              {
                // Check for killing definitions
                
                for (Iterator it = between.getDefBoxes().iterator();
                       it.hasNext(); )
                  {
                      Value v = ((ValueBox)(it.next())).getValue();
                      if (localsUsed.contains(v))
                      { 
                            cantAggr = true; 
                            break; 
                      }
                      
                      if (propagatingInvokeExpr || propagatingFieldRef || propagatingArrayRef)
                      {
                          if (v instanceof FieldRef)
                          {
                              if(propagatingInvokeExpr)
                              {
                                  cantAggr = true; 
                                  break;
                              }
                              else if(propagatingFieldRef)
                              {
                                  // Can't aggregate a field access if passing a definition of a field 
                                  // with the same name, because they might be aliased

                                  Iterator frIt = fieldRefList.iterator();
                                  while (frIt.hasNext())
                                  {
                                      FieldRef fieldRef = (FieldRef) frIt.next();
                                      if(((FieldRef) v).getField() == fieldRef.getField())
                                      {
                                          cantAggr = true;
                                          break;
                                      } 
                                  }
                              } 
                           }
                           else if(v instanceof ArrayRef)
                           {
                                if(propagatingInvokeExpr)
                                {   
                                    // Cannot aggregate an invoke expr past an array write
                                    cantAggr = true;
                                    break;
                                }
                                else if(propagatingArrayRef)
                                {
                                    // cannot aggregate an array read past a write
                                    // this is somewhat conservative
                                    // (if types differ they may not be aliased)
                                    
                                    cantAggr = true;
                                    break;
                                }
                           }
                      }
                  }
                  
                  // Make sure not propagating past a {enter,exit}Monitor
                    if(propagatingInvokeExpr && between instanceof MonitorStmt)
                        cantAggr = true;
              }  
                            
              // Check for intervening side effects due to method calls
                if(propagatingInvokeExpr || propagatingFieldRef || propagatingArrayRef)
                    {
                      for( Iterator boxIt = (between.getUseBoxes()).iterator(); boxIt.hasNext(); ) {
                          final ValueBox box = (ValueBox) boxIt.next();
                          
                          if(between == use && box == useBox)
                          {
                                // Reached use point, stop looking for
                                // side effects
                                break;
                          }
                          
                          Value v = box.getValue();
                          
                            if (v instanceof InvokeExpr || 
                                (propagatingInvokeExpr && (v instanceof FieldRef || v instanceof ArrayRef)))
                            {
                                cantAggr = true;
                                break;
                            }
                            
                        }
                    }
            }

          // we give up: can't aggregate.
          if (cantAggr)
          {
            continue;
          }
          /* assuming that the d-u chains are correct, */
          /* we need not check the actual contents of ld */
          
          Value aggregatee = ((AssignStmt)s).getRightOp();
          
          if (usepair.valueBox.canContainValue(aggregatee))
            {
              boolean wasSimpleCopy = isSimpleCopy( usepair.unit );
              usepair.valueBox.setValue(aggregatee);
              units.remove(s);
              hadAggregation = true;
              aggrCount++;
              // clean up the tags. If s was not a simple copy, the new statement should get
              // the tags of s.
              // OK, this fix was wrong. The condition should not be
              // "If s was not a simple copy", but rather "If usepair.unit
              // was a simple copy". This way, when there's a load of a constant
              // followed by an invoke, the invoke gets the tags.
              if( wasSimpleCopy ) {
                  usepair.unit.removeAllTags();
                  usepair.unit.addAllTagsOf( s );
              }
            }
          else
            {/*
            if(Main.isVerbose)
            {
                System.out.println("[debug] failed aggregation");
                  System.out.println("[debug] tried to put "+aggregatee+
                                 " into "+usepair.stmt + 
                                 ": in particular, "+usepair.valueBox);
                  System.out.println("[debug] aggregatee instanceof Expr: "
                                 +(aggregatee instanceof Expr));
            }*/
            }
        }
      return hadAggregation;
    }
  private static boolean isSimpleCopy( Unit u ) {
      if( !(u instanceof DefinitionStmt) ) return false;
      DefinitionStmt defstmt = (DefinitionStmt) u;
      if( !( defstmt.getRightOp() instanceof Local ) ) return false;
      if( !( defstmt.getLeftOp() instanceof Local ) ) return false;
      return true;
  }
        
}