129 @Override
130 public MethodVisitor visitMethod(final int methodAccess, final String methodName,
131 final String methodDesc, final String signature, final String[] exceptions) {
132
133 final boolean isConstructor = INIT.equals(methodName);
134 final boolean isStaticInit = CLINIT.equals(methodName);
135
136 if (isStaticInit) {
137 staticInitFound = true;
138 }
139
140 final MethodGenerator delegateMV = new MethodGenerator(super.visitMethod(methodAccess, methodName, methodDesc,
141 signature, exceptions), methodAccess, methodName, methodDesc);
142
143 return new MethodVisitor(Opcodes.ASM4, delegateMV) {
144 @Override
145 public void visitInsn(final int opcode) {
146 // call $clinit$ just before return from <clinit>
147 if (isStaticInit && opcode == RETURN) {
148 super.visitMethodInsn(INVOKESTATIC, scriptClassInfo.getJavaName(),
149 $CLINIT$, DEFAULT_INIT_DESC);
150 }
151 super.visitInsn(opcode);
152 }
153
154 @Override
155 public void visitMethodInsn(final int opcode, final String owner, final String name, final String desc) {
156 if (isConstructor && opcode == INVOKESPECIAL &&
157 INIT.equals(name) && SCRIPTOBJECT_TYPE.equals(owner)) {
158 super.visitMethodInsn(opcode, owner, name, desc);
159
160 if (memberCount > 0) {
161 // initialize @Property fields if needed
162 for (final MemberInfo memInfo : scriptClassInfo.getMembers()) {
163 if (memInfo.isInstanceProperty() && !memInfo.getInitClass().isEmpty()) {
164 final String clazz = memInfo.getInitClass();
165 super.visitVarInsn(ALOAD, 0);
166 super.visitTypeInsn(NEW, clazz);
167 super.visitInsn(DUP);
168 super.visitMethodInsn(INVOKESPECIAL, clazz,
169 INIT, DEFAULT_INIT_DESC);
170 super.visitFieldInsn(PUTFIELD, scriptClassInfo.getJavaName(),
171 memInfo.getJavaName(), memInfo.getJavaDesc());
172 }
173
174 if (memInfo.isInstanceFunction()) {
175 super.visitVarInsn(ALOAD, 0);
176 ClassGenerator.newFunction(delegateMV, scriptClassInfo.getJavaName(), memInfo, scriptClassInfo.findSpecializations(memInfo.getJavaName()));
177 super.visitFieldInsn(PUTFIELD, scriptClassInfo.getJavaName(),
178 memInfo.getJavaName(), OBJECT_DESC);
179 }
180 }
181 }
182 } else {
183 super.visitMethodInsn(opcode, owner, name, desc);
184 }
185 }
186
187 @Override
188 public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
189 if (ScriptClassInfo.annotations.containsKey(desc)) {
190 // ignore script method annotations
191 return null;
192 }
193 return super.visitAnnotation(desc, visible);
194 }
195 };
196 }
197
198 @Override
199 public void visitEnd() {
200 emitFields();
201 emitStaticInitializer();
202 emitGettersSetters();
203 super.visitEnd();
|
129 @Override
130 public MethodVisitor visitMethod(final int methodAccess, final String methodName,
131 final String methodDesc, final String signature, final String[] exceptions) {
132
133 final boolean isConstructor = INIT.equals(methodName);
134 final boolean isStaticInit = CLINIT.equals(methodName);
135
136 if (isStaticInit) {
137 staticInitFound = true;
138 }
139
140 final MethodGenerator delegateMV = new MethodGenerator(super.visitMethod(methodAccess, methodName, methodDesc,
141 signature, exceptions), methodAccess, methodName, methodDesc);
142
143 return new MethodVisitor(Opcodes.ASM4, delegateMV) {
144 @Override
145 public void visitInsn(final int opcode) {
146 // call $clinit$ just before return from <clinit>
147 if (isStaticInit && opcode == RETURN) {
148 super.visitMethodInsn(INVOKESTATIC, scriptClassInfo.getJavaName(),
149 $CLINIT$, DEFAULT_INIT_DESC, false);
150 }
151 super.visitInsn(opcode);
152 }
153
154 @Override
155 public void visitMethodInsn(final int opcode, final String owner, final String name, final String desc, final boolean itf) {
156 if (isConstructor && opcode == INVOKESPECIAL &&
157 INIT.equals(name) && SCRIPTOBJECT_TYPE.equals(owner)) {
158 super.visitMethodInsn(opcode, owner, name, desc, false);
159
160 if (memberCount > 0) {
161 // initialize @Property fields if needed
162 for (final MemberInfo memInfo : scriptClassInfo.getMembers()) {
163 if (memInfo.isInstanceProperty() && !memInfo.getInitClass().isEmpty()) {
164 final String clazz = memInfo.getInitClass();
165 super.visitVarInsn(ALOAD, 0);
166 super.visitTypeInsn(NEW, clazz);
167 super.visitInsn(DUP);
168 super.visitMethodInsn(INVOKESPECIAL, clazz,
169 INIT, DEFAULT_INIT_DESC, false);
170 super.visitFieldInsn(PUTFIELD, scriptClassInfo.getJavaName(),
171 memInfo.getJavaName(), memInfo.getJavaDesc());
172 }
173
174 if (memInfo.isInstanceFunction()) {
175 super.visitVarInsn(ALOAD, 0);
176 ClassGenerator.newFunction(delegateMV, scriptClassInfo.getJavaName(), memInfo, scriptClassInfo.findSpecializations(memInfo.getJavaName()));
177 super.visitFieldInsn(PUTFIELD, scriptClassInfo.getJavaName(),
178 memInfo.getJavaName(), OBJECT_DESC);
179 }
180 }
181 }
182 } else {
183 super.visitMethodInsn(opcode, owner, name, desc, itf);
184 }
185 }
186
187 @Override
188 public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
189 if (ScriptClassInfo.annotations.containsKey(desc)) {
190 // ignore script method annotations
191 return null;
192 }
193 return super.visitAnnotation(desc, visible);
194 }
195 };
196 }
197
198 @Override
199 public void visitEnd() {
200 emitFields();
201 emitStaticInitializer();
202 emitGettersSetters();
203 super.visitEnd();
|