@Override
	protected void doExecute() {
        
        /* if method is non satic*/
        if(!Modifier.isStatic(getModifiers())){
            Instructions instructions = getInstructions();
            LOG.print("put reference to stack");
            callObjReference.loadToStack(block);
            argumentsToStack();
            if(callObjReference.getResultType().isInterface()){
            	LOG.print("invoke interface method : " + name);
                instructions.invokeInterface(callObjReference.getResultType().getType(), this.name, getReturnType(), methodMeta.getParameterAsmTypes(), true);
            }else{
                LOG.print("invoke class method : " + name);
                if(callObjReference instanceof IVariable){
                	 VarMeta ve = ((IVariable)callObjReference).getMeta();
                	 if(ve.getName().equals(ASConstants.SUPER)){
                         instructions.invokeSuperMethod(callObjReference.getResultType().getType(), this.name, getReturnType(), methodMeta.getParameterAsmTypes());
                     }else {
                         instructions.invokeVirtual(callObjReference.getResultType().getType(), this.name, getReturnType(), methodMeta.getParameterAsmTypes());
                     }
                }else{
                	instructions.invokeVirtual(callObjReference.getResultType().getType(), this.name, getReturnType(), methodMeta.getParameterAsmTypes());
                }
            }
            if(!isSaveReference()){
                if(!getReturnType().equals(Type.VOID_TYPE)){
                    instructions.pop();
                }
            }
        }
	}