ShingoFukuyama
2/8/2014 - 2:04 AM

defadvice-to-defsubst.el

(defun baz1 (arg)
  arg)
(defsubst baz2 (arg)
  arg)

;; ----------------------------------------------------------------------

(defsubst foo1 (aaa)
  (baz1 aaa)
  (baz2 aaa))
(foo1 "fff")                        ; => "fff"

;; baz2 isn't found in byte-compiled foo1
(byte-compile 'foo1)
;; => #[(aaa)
;;      "\301!\210\207"
;;      [aaa baz1]
;;      3]

(foo1 "fff")                        ; => "fff"
 
(defadvice foo1 (around bar1 activate)
  (setq ad-return-value (concat (ad-get-arg 0) (ad-get-arg 0))))

(byte-compile 'foo1)
;; => #[(aaa)
;;      "\302	\211P\211)\207"
;;      [ad-return-value aaa nil]
;;      3
;;      #("Advice doc string" 0 17
;;        (ad-advice-info foo1))]

(foo1 "fff")                        ; => "ffffff"

(defun foo2 (arg)
  (foo1 arg))

(foo1 "fff")                       ; => "ffffff"
(foo2 "fff")                       ; => "ffffff"

(byte-compile 'foo2)
;; => #[(arg)
;;      "\303	\211P\211*\207"
;;      [arg aaa ad-return-value nil]
;;      2]

(defadvice foo1 (around bar2 activate)
  (setq ad-return-value (concat (ad-get-arg 0) "zzz")))

;;; foo2 doesn't return "fffzzz" because foo1 is adviced after foo2 bytecompiled
(foo1 "fff")                       ; => "fffzzz"
(foo2 "fff")                       ; => "ffffff"

(byte-compile 'foo2)
;; => #[(arg)
;;      "\303	\211P\211*\207"
;;      [arg aaa ad-return-value nil]
;;      2]

;; Deactivate
(progn
  (ad-disable-advice 'foo1 'around 'bar1)
  (ad-disable-advice 'foo1 'around 'bar2)
  (ad-activate 'foo1))