Mercurial > lasercutter
comparison src/clojure/asm/commons/StaticInitMerger.java @ 10:ef7dbbd6452c
added clojure source goodness
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 21 Aug 2010 06:25:44 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
9:35cf337adfcf | 10:ef7dbbd6452c |
---|---|
1 /*** | |
2 * ASM: a very small and fast Java bytecode manipulation framework | |
3 * Copyright (c) 2000-2005 INRIA, France Telecom | |
4 * All rights reserved. | |
5 * | |
6 * Redistribution and use in source and binary forms, with or without | |
7 * modification, are permitted provided that the following conditions | |
8 * are met: | |
9 * 1. Redistributions of source code must retain the above copyright | |
10 * notice, this list of conditions and the following disclaimer. | |
11 * 2. Redistributions in binary form must reproduce the above copyright | |
12 * notice, this list of conditions and the following disclaimer in the | |
13 * documentation and/or other materials provided with the distribution. | |
14 * 3. Neither the name of the copyright holders nor the names of its | |
15 * contributors may be used to endorse or promote products derived from | |
16 * this software without specific prior written permission. | |
17 * | |
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | |
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF | |
28 * THE POSSIBILITY OF SUCH DAMAGE. | |
29 */ | |
30 package clojure.asm.commons; | |
31 | |
32 import clojure.asm.ClassAdapter; | |
33 import clojure.asm.ClassVisitor; | |
34 import clojure.asm.MethodVisitor; | |
35 import clojure.asm.Opcodes; | |
36 | |
37 /** | |
38 * A {@link ClassAdapter} that merges clinit methods into a single one. | |
39 * | |
40 * @author Eric Bruneton | |
41 */ | |
42 public class StaticInitMerger extends ClassAdapter{ | |
43 | |
44 private String name; | |
45 | |
46 private MethodVisitor clinit; | |
47 | |
48 private String prefix; | |
49 | |
50 private int counter; | |
51 | |
52 public StaticInitMerger(final String prefix, final ClassVisitor cv){ | |
53 super(cv); | |
54 this.prefix = prefix; | |
55 } | |
56 | |
57 public void visit( | |
58 final int version, | |
59 final int access, | |
60 final String name, | |
61 final String signature, | |
62 final String superName, | |
63 final String[] interfaces){ | |
64 cv.visit(version, access, name, signature, superName, interfaces); | |
65 this.name = name; | |
66 } | |
67 | |
68 public MethodVisitor visitMethod( | |
69 final int access, | |
70 final String name, | |
71 final String desc, | |
72 final String signature, | |
73 final String[] exceptions){ | |
74 MethodVisitor mv; | |
75 if(name.equals("<clinit>")) | |
76 { | |
77 int a = Opcodes.ACC_PRIVATE + Opcodes.ACC_STATIC; | |
78 String n = prefix + counter++; | |
79 mv = cv.visitMethod(a, n, desc, signature, exceptions); | |
80 | |
81 if(clinit == null) | |
82 { | |
83 clinit = cv.visitMethod(a, name, desc, null, null); | |
84 } | |
85 clinit.visitMethodInsn(Opcodes.INVOKESTATIC, this.name, n, desc); | |
86 } | |
87 else | |
88 { | |
89 mv = cv.visitMethod(access, name, desc, signature, exceptions); | |
90 } | |
91 return mv; | |
92 } | |
93 | |
94 public void visitEnd(){ | |
95 if(clinit != null) | |
96 { | |
97 clinit.visitInsn(Opcodes.RETURN); | |
98 clinit.visitMaxs(0, 0); | |
99 } | |
100 cv.visitEnd(); | |
101 } | |
102 } |