private void addNotifyAccess(Code code, FieldMetaData fmd) { // PCHelper.accessingField(this, <absolute-index>); code.aload().setThis(); code.constant().setValue(fmd.getIndex()); code.invokestatic().setMethod(RedefinitionHelper.class, "accessingField", void.class, new Class[] { Object.class, int.class }); }
private void addGetEnhancementContractVersionMethod() { // public int getEnhancementContractVersion() BCMethod method = _pc.declareMethod(PRE + "GetEnhancementContractVersion", int.class, null); method.makePublic(); Code code = method.getCode(true); code.constant().setValue(ENHANCER_VERSION); code.ireturn(); code.calculateMaxStack(); code.calculateMaxLocals(); }
/** * Compare the given field to its Java default, returning the * comparison instruction. The field value will already be on the stack. */ private static JumpInstruction ifDefaultValue(Code code, FieldMetaData fmd) { switch (fmd.getDeclaredTypeCode()) { case JavaTypes.BOOLEAN: case JavaTypes.BYTE: case JavaTypes.CHAR: case JavaTypes.INT: case JavaTypes.SHORT: return code.ifeq(); case JavaTypes.DOUBLE: code.constant().setValue(0D); code.dcmpl(); return code.ifeq(); case JavaTypes.FLOAT: code.constant().setValue(0F); code.fcmpl(); return code.ifeq(); case JavaTypes.LONG: code.constant().setValue(0L); code.lcmp(); return code.ifeq(); default: return code.ifnull(); } }
code.invokespecial().setMethod(getType(_meta. getPCSuperclassMetaData()), PRE + "ClearFields", void.class, null); case JavaTypes.INT: case JavaTypes.SHORT: code.constant().setValue(0); break; case JavaTypes.DOUBLE: code.constant().setValue(0D); break; case JavaTypes.FLOAT: code.constant().setValue(0F); break; case JavaTypes.LONG: code.constant().setValue(0L); break; default: code.constant().setNull(); break; code.calculateMaxStack(); code.calculateMaxLocals();
code.invokevirtual().setMethod(PRE + "Serializing", boolean.class, null); int clear = code.getNextLocalsIndex(); code.invokevirtual().setMethod(ObjectOutputStream.class, "defaultWriteObject", void.class, null); code.vreturn(); toret = code.ifeq(); loadManagedInstance(code, false); code.constant().setNull(); code.invokevirtual().setMethod(PRE + "SetDetachedState", void.class, new Class[]{ Object.class }); toret.setTarget(ret); code.calculateMaxStack(); code.calculateMaxLocals();
code.invokespecial().setMethod(getType(_meta. getPCSuperclassMetaData()), PRE + "ClearFields", void.class, null); case JavaTypes.INT: case JavaTypes.SHORT: code.constant().setValue(0); break; case JavaTypes.DOUBLE: code.constant().setValue(0D); break; case JavaTypes.FLOAT: code.constant().setValue(0F); break; case JavaTypes.LONG: code.constant().setValue(0L); break; default: code.constant().setNull(); break; code.calculateMaxStack(); code.calculateMaxLocals();
private void addNotifyAccess(Code code, FieldMetaData fmd) { // PCHelper.accessingField(this, <absolute-index>); code.aload().setThis(); code.constant().setValue(fmd.getIndex()); code.invokestatic().setMethod(RedefinitionHelper.class, "accessingField", void.class, new Class[] { Object.class, int.class }); }
private void addGetEnhancementContractVersionMethod() { // public int getEnhancementContractVersion() BCMethod method = _pc.declareMethod(PRE + "GetEnhancementContractVersion", int.class, null); method.makePublic(); Code code = method.getCode(true); code.constant().setValue(ENHANCER_VERSION); code.ireturn(); code.calculateMaxStack(); code.calculateMaxLocals(); }
code.invokevirtual().setMethod(PRE + "Serializing", boolean.class, null); int clear = code.getNextLocalsIndex(); code.invokevirtual().setMethod(ObjectOutputStream.class, "defaultWriteObject", void.class, null); code.vreturn(); toret = code.ifeq(); loadManagedInstance(code, false); code.constant().setNull(); code.invokevirtual().setMethod(PRE + "SetDetachedState", void.class, new Class[]{ Object.class }); toret.setTarget(ret); code.calculateMaxStack(); code.calculateMaxLocals();
/** * Compare the given field to its Java default, returning the * comparison instruction. The field value will already be on the stack. */ private static JumpInstruction ifDefaultValue(Code code, FieldMetaData fmd) { switch (fmd.getDeclaredTypeCode()) { case JavaTypes.BOOLEAN: case JavaTypes.BYTE: case JavaTypes.CHAR: case JavaTypes.INT: case JavaTypes.SHORT: return code.ifeq(); case JavaTypes.DOUBLE: code.constant().setValue(0D); code.dcmpl(); return code.ifeq(); case JavaTypes.FLOAT: code.constant().setValue(0F); code.fcmpl(); return code.ifeq(); case JavaTypes.LONG: code.constant().setValue(0L); code.lcmp(); return code.ifeq(); default: return code.ifnull(); } }
/** * Proxy the given setter method to dirty the proxy owner. */ private void proxySetter(BCClass bc, Class type, Method meth) { Class[] params = meth.getParameterTypes(); Class ret = meth.getReturnType(); BCMethod m = bc.declareMethod(meth.getName(), ret, params); m.makePublic(); Code code = m.getCode(true); code.aload().setThis(); code.constant().setValue(true); code.invokestatic().setMethod(Proxies.class, "dirty", void.class, new Class[] { Proxy.class, boolean.class }); code.aload().setThis(); for (int i = 0; i < params.length; i++) code.xload().setParam(i).setType(params[i]); code.invokespecial().setMethod(type, meth.getName(), ret, params); code.xreturn().setType(ret); code.calculateMaxStack(); code.calculateMaxLocals(); }
private void addNotifyAccess(Code code, FieldMetaData fmd) { // PCHelper.accessingField(this, <absolute-index>); code.aload().setThis(); code.constant().setValue(fmd.getIndex()); code.invokestatic().setMethod(RedefinitionHelper.class, "accessingField", void.class, new Class[] { Object.class, int.class }); }
private void addGetEnhancementContractVersionMethod() { // public int getEnhancementContractVersion() BCMethod method = _pc.declareMethod(PRE + "GetEnhancementContractVersion", int.class, null); method.makePublic(); Code code = method.getCode(true); code.constant().setValue(ENHANCER_VERSION); code.ireturn(); code.calculateMaxStack(); code.calculateMaxLocals(); }
code.invokevirtual().setMethod(PRE + "Serializing", boolean.class, null); int clear = code.getNextLocalsIndex(); code.invokevirtual().setMethod(ObjectOutputStream.class, "defaultWriteObject", void.class, null); code.vreturn(); toret = code.ifeq(); loadManagedInstance(code, false); code.constant().setNull(); code.invokevirtual().setMethod(PRE + "SetDetachedState", void.class, new Class[]{ Object.class }); toret.setTarget(ret); code.calculateMaxStack(); code.calculateMaxLocals();
/** * Compare the given field to its Java default, returning the * comparison instruction. The field value will already be on the stack. */ private static JumpInstruction ifDefaultValue(Code code, FieldMetaData fmd) { switch (fmd.getDeclaredTypeCode()) { case JavaTypes.BOOLEAN: case JavaTypes.BYTE: case JavaTypes.CHAR: case JavaTypes.INT: case JavaTypes.SHORT: return code.ifeq(); case JavaTypes.DOUBLE: code.constant().setValue(0D); code.dcmpl(); return code.ifeq(); case JavaTypes.FLOAT: code.constant().setValue(0F); code.fcmpl(); return code.ifeq(); case JavaTypes.LONG: code.constant().setValue(0L); code.lcmp(); return code.ifeq(); default: return code.ifnull(); } }
/** * Proxy the given setter method to dirty the proxy owner. */ private void proxySetter(BCClass bc, Class type, Method meth) { Class[] params = meth.getParameterTypes(); Class ret = meth.getReturnType(); BCMethod m = bc.declareMethod(meth.getName(), ret, params); m.makePublic(); Code code = m.getCode(true); code.aload().setThis(); code.constant().setValue(true); code.invokestatic().setMethod(Proxies.class, "dirty", void.class, new Class[] { Proxy.class, boolean.class }); code.aload().setThis(); for (int i = 0; i < params.length; i++) code.xload().setParam(i).setType(params[i]); code.invokespecial().setMethod(type, meth.getName(), ret, params); code.xreturn().setType(ret); code.calculateMaxStack(); code.calculateMaxLocals(); }
private void addNotifyAccess(Code code, FieldMetaData fmd) { // PCHelper.accessingField(this, <absolute-index>); code.aload().setThis(); code.constant().setValue(fmd.getIndex()); code.invokestatic().setMethod(RedefinitionHelper.class, "accessingField", void.class, new Class[] { Object.class, int.class }); }
/** * Implement getFieldCount/getObjectCount. */ private void addFieldCount(BCClass bc, int[] types, int objectCount) { BCMethod method = bc.declareMethod("getFieldCount", int.class, null); Code code = method.getCode(true); code.constant().setValue(types.length); code.ireturn(); code.calculateMaxLocals(); code.calculateMaxStack(); method = bc.declareMethod("getObjectCount", int.class, null); code = method.getCode(true); code.constant().setValue(objectCount); code.ireturn(); code.calculateMaxLocals(); code.calculateMaxStack(); }
code.invokevirtual().setMethod(PRE + "Serializing", boolean.class, null); int clear = code.getNextLocalsIndex(); code.invokevirtual().setMethod(ObjectOutputStream.class, "defaultWriteObject", void.class, null); code.vreturn(); toret = code.ifeq(); loadManagedInstance(code, false); code.constant().setNull(); code.invokevirtual().setMethod(PRE + "SetDetachedState", void.class, new Class[]{ Object.class }); toret.setTarget(ret); code.calculateMaxStack(); code.calculateMaxLocals();
/** * Compare the given field to its Java default, returning the * comparison instruction. The field value will already be on the stack. */ private static JumpInstruction ifDefaultValue(Code code, FieldMetaData fmd) { switch (fmd.getDeclaredTypeCode()) { case JavaTypes.BOOLEAN: case JavaTypes.BYTE: case JavaTypes.CHAR: case JavaTypes.INT: case JavaTypes.SHORT: return code.ifeq(); case JavaTypes.DOUBLE: code.constant().setValue(0D); code.dcmpl(); return code.ifeq(); case JavaTypes.FLOAT: code.constant().setValue(0F); code.fcmpl(); return code.ifeq(); case JavaTypes.LONG: code.constant().setValue(0L); code.lcmp(); return code.ifeq(); default: return code.ifnull(); } }