public void generate() { addInterfaceIfNeeded(); if (!(inspectNoArgConstr(_ce.methods()))) { _context.addNoArgConstructor(_ce); } MemberRef[] declaredFields = _context.collectDeclaredFields(_ce); generateSelf_get(declaredFields); generateSelf_set(declaredFields); }
private void generateSelfGetMethodCase(MethodBuilder builder, int labelIdx, MemberRef field) { Class wrapper = null; if (field.type().isPrimitive()) { wrapper = PrimitiveUtil.wrapper(field.type()); } builder.aload(1); builder.ldc(field.name()); builder.invokeVirtual( Type.STRING, BloatJ2MEContext.EQUALS_METHODNAME, new Type[] {Type.OBJECT}, Type.BOOLEAN); builder.ifeq(labelIdx + 1); if (wrapper != null) { builder.newRef(wrapper); builder.dup(); } builder.aload(0); builder.getfield(field); if (wrapper != null) { builder.invokeSpecial( _context.getType(wrapper), BloatJ2MEContext.INIT_METHODNAME, new Type[] {field.type()}, Type.VOID); } builder.areturn(); builder.label(labelIdx + 1); }
private void generateSelfSetFieldCase(MethodBuilder builder, int labelIdx, MemberRef field) { Type fieldType = field.type(); Class wrapper = PrimitiveUtil.wrapper(fieldType); builder.aload(1); builder.ldc(field.name()); builder.invokeVirtual( Type.STRING, BloatJ2MEContext.EQUALS_METHODNAME, new Type[] {Type.OBJECT}, Type.BOOLEAN); builder.ifeq(labelIdx + 1); builder.aload(0); builder.aload(2); if (wrapper != null) { builder.checkcast(wrapper); builder.invokeVirtual( _context.getType(wrapper), PrimitiveUtil.conversionFunctionName(wrapper), new Type[0], fieldType); } else { builder.checkcast(fieldType); } builder.putfield(field); builder.returnInstruction(); builder.label(labelIdx + 1); }
// TODO: Shouldn't this information be passed in by the calling class? // (It should know which classes it instruments anyway.) private boolean instrumentedType(Type type) { String typeName = _context.normalizeClassName(type.className()); System.err.println(typeName); return !(typeName.startsWith("java.") || typeName.startsWith("javax.") || typeName.startsWith("sun.")); }