183 @Override
184 public Boolean visitFunction(FunctionTree funcTree, JType jt) {
185 if (super.visitFunction(funcTree, jt)) {
186 assert (jt instanceof JType.Function);
187 JType.Function fn = (JType.Function)jt;
188 log.print(Level.FINE, () -> "Add method: " + fn.getSignature(false));
189 emitStaticForwarder(funcTree.name(), fn.getDescriptor(), fn.getSignature(false), fn.isVarArgs);
190 fn.visitInner(cw);
191 return true;
192 } else {
193 return false;
194 }
195 }
196
197 @Override
198 public Boolean visitMacro(MacroTree macroTree, JType jt) {
199 if (super.visitMacro(macroTree, jt)) {
200 String name = macroTree.name();
201 MacroParser.Macro macro = macroTree.macro().get();
202 log.print(Level.FINE, () -> "Adding macro " + name);
203 addConstant(name, macro.type(), macro.value());
204 return true;
205 } else {
206 return false;
207 }
208 }
209
210 private void addConstant(String name, JType type, Object value) {
211 Object constantValue = makeConstantValue(type, value);
212 FieldVisitor fv = cw.visitField(ACC_PUBLIC | ACC_STATIC | ACC_FINAL, name, type.getDescriptor(),
213 type.getSignature(false), constantValue);
214 fv.visitEnd();
215 if (constantValue == null) {
216 constantInitializers.add(mv -> {
217 // load library interface (static) field
218 String desc = type.getDescriptor();
219 mv.visitFieldInsn(GETSTATIC, getClassName(),
220 STATICS_LIBRARY_FIELD_NAME, headerClassNameDesc);
221 mv.visitMethodInsn(INVOKEINTERFACE, headerClassName, name, "()" + desc, true);
222 mv.visitFieldInsn(PUTSTATIC, getClassName(), name, desc);
223 });
|
183 @Override
184 public Boolean visitFunction(FunctionTree funcTree, JType jt) {
185 if (super.visitFunction(funcTree, jt)) {
186 assert (jt instanceof JType.Function);
187 JType.Function fn = (JType.Function)jt;
188 log.print(Level.FINE, () -> "Add method: " + fn.getSignature(false));
189 emitStaticForwarder(funcTree.name(), fn.getDescriptor(), fn.getSignature(false), fn.isVarArgs);
190 fn.visitInner(cw);
191 return true;
192 } else {
193 return false;
194 }
195 }
196
197 @Override
198 public Boolean visitMacro(MacroTree macroTree, JType jt) {
199 if (super.visitMacro(macroTree, jt)) {
200 String name = macroTree.name();
201 MacroParser.Macro macro = macroTree.macro().get();
202 log.print(Level.FINE, () -> "Adding macro " + name);
203 addConstant(Utils.toMacroName(name), macro.type(), macro.value());
204 return true;
205 } else {
206 return false;
207 }
208 }
209
210 private void addConstant(String name, JType type, Object value) {
211 Object constantValue = makeConstantValue(type, value);
212 FieldVisitor fv = cw.visitField(ACC_PUBLIC | ACC_STATIC | ACC_FINAL, name, type.getDescriptor(),
213 type.getSignature(false), constantValue);
214 fv.visitEnd();
215 if (constantValue == null) {
216 constantInitializers.add(mv -> {
217 // load library interface (static) field
218 String desc = type.getDescriptor();
219 mv.visitFieldInsn(GETSTATIC, getClassName(),
220 STATICS_LIBRARY_FIELD_NAME, headerClassNameDesc);
221 mv.visitMethodInsn(INVOKEINTERFACE, headerClassName, name, "()" + desc, true);
222 mv.visitFieldInsn(PUTSTATIC, getClassName(), name, desc);
223 });
|