an advice mechanism for non local flow control
play

An Advice Mechanism for Non-local Flow Control Hidehiko Masuhara - PowerPoint PPT Presentation

Presented at 15th Workshop on Foundations of Aspect-Oriented Languages (FOAL'16) co-located with Modularity'16, March 15, 2016, Mlaga, Spain An Advice Mechanism for Non-local Flow Control Hidehiko Masuhara Kenta Fujita Tomoyuki Aotani Tokyo


  1. Presented at 15th Workshop on Foundations of Aspect-Oriented Languages (FOAL'16) co-located with Modularity'16, March 15, 2016, Málaga, Spain An Advice Mechanism for Non-local Flow Control Hidehiko Masuhara Kenta Fujita Tomoyuki Aotani Tokyo Tech 1

  2. Example Scenarios of Non-local Flow Control InitPlugin in your application:  reads a config. file  downloads a plugin def.  constructs a plugin obj. termination Scenarios: 1. no config file  go without plugins 2. network error  start over InitPlugin retry 3. incompatible plugin  download diff. version backtrack 2

  3. Non-local Flow Control • is a transition of control between 2 join points e.g., termination, retrying, backtracking 3

  4. Non-local Flow Control • is a transition of control between 2 join points e.g., termination, retrying, backtracking 4

  5. "I can write aspects in AspectJ for non-local control flow. Why a new mechanism?" True, but those aspects are not ideal 5

  6. Termination in AspectJ declare an exception class aspect TerminateLoading { up to where static class NoConfigError extends Error {} it terminates Plugin around(): call(* *.loadPlugin(File)) { try { return proceed(); } catch ( NoConfigError e) { return null; } pointcut to throw an exception } detect a failure upon failure catch exception before(File f) : call(* *.readFile(File)) && args(f) && if(!f.exists()) { throw new NoConfigError (); } } 6

  7. Termination in AspectJ Problems • 2 pieces of advice aspect TerminateLoading { static class NoConfigError extends Error {} for 1 concern • Use of exceptions Plugin around(): call(* *.loadPlugin(File)) { try { return proceed(); } for pairing catch ( NoConfigError e) { return null; } } before(File f) : call(* *.readFile(File)) && args(f) && if(!f.exists()) { throw new NoConfigError (); } } 7

  8. Problem: 2 pieces of advice • clumsy use information • difficult to pass information there for recovery create fields in an aspect TerminateLoading { exception class static class NoConfigError extends Error {} Plugin around(): call(* *.loadPlugin(File)) { try { return proceed(); } retrieve information catch (NoConfigError e) { return null; } } before(File f) : call(* *.readFile(File)) && args(f) && if(!f.exists()) { throw new NoConfigError(); store information } } 8

  9. Problem: use of exceptions • indirect • requires a unique exception class for each pair of flow control  otherwise, it can return to a cause accidental when b happens catching a c b d c c t t return to c when d happens 9

  10. Generic Termination Aspect in AspectJ abstract aspect Termination { class MyException extends Error { ExceptionHandling throwingAspect; Object recorded; MyException(ExceptionHandling throwingAspect, Object recorded) { this.throwingAspect = throwingAspect; this.recorded = recorded; } boolean matches(ExceptionHandling catchingAspect) { return this.throwingAspect == catchingAspect; } } abstract pointcut entry(); abstract pointcut bad(); abstract Object recordInformation(JoinPoint jp); abstract Object recovery(Object recorded); Object around() : entry() { try { return proceed(); } catch (MyException e) { if (e.matches(this)) { return recovery(this.recorded); } else { throw(e); } } } before(): bad() && cflow(entry()) { throw new MyException(this, recordInformation(thisJoinPoint)); } } 10

  11. Proposal: Chop&Graft specify • Use pointcut to return by using pct: specify the extent "chop point" of cancellation retry • Provide pseudo functions for graft resuming/retrying advice runs computations cancel computation 11

  12. Chop&Graft by Example: chop Plugin around(File f): chop (call(* *.loadPlugin(File))) && call(* *.readFile(File)) && args(f) && if(!f.exists()) { return null; } • is a pointcut taking a sub-pointcut (cf. cflow) • terminates computation up to the matching jp  Advice body = a recovery process 12

  13. Chop&Graft by Example: retry Plugin around(File f): chop(call(* *.loadPlugin(File))) && call(* *.readFile(File)) && args(f) && if(!f.exists()) { return retry() ; } • is a pseudo-function (cf. proceed) • restarts the computation at the chop point • can take alternative parameters 13

  14. Chop&Graft by Example: graft inserts Plugin around(File f): chop(call(* *.loadPlugin(File))) computation && call(* *.readFile(File)) && args(f) && if(!f.exists()) { Plugin p = graft (DefaultCnf); p.setVerbose(false); return p; } graft • is a pseudo-function (cf. proceed) • restarts the cancelled computation up to chop point  Advice can perform computation after graft 14

  15. Chop&Graft by Example: backtracking Plugin around(String s): chop(call(* *.loadPlugin(File))) && call(* URL.append(String)) && args(_s) { Plugin p = graft (proceed(s)); if (p.isValid()) return p; return graft (proceed(".old")); } graft • Graft can be called more than once = going back to the middle of computation 15

  16. Implementations 1. By using delimited continuations [Felleisen'88, Danvy'90] • At chop point: (reset (proceed)) • At advice point: (shift (lambda (graft) body))) Need multi-prompts for pairing implemented on AspectScheme + Racket 2. By using threads • Limitation: can call graft at most once • (for now) hand-compiling strategy 16

  17. Implementation with threads (graft is called) advice at P1 run advice body advice advice at P2 proceed in another thread thread end of graft = start/run advice resume the Body advice body graft( v ) GRAFT( v ) return v return v' graft = GRAFT_END( v' ) return v' resume the return v" original thread ADVICE_TERM( v" ) return v"

  18. Implementation with threads (graft is not called) advice at P1 advice at P2 advice proceed thread end of advice body = start/run throwing an exception advice Body return v ADVICE_TERM( v ) throw new NoGraft( v ) return v' catching at chop point 18

  19. Related work • Aspects for exception handling [Lippert'00, Colyer'04, Filho'06, Taveira'09, Rebêlo'10] : --- only one side of catching/throwing • EJFlow [Cacho'08] --- more precise exception catching • Loop, closure, region jps/pointcuts [Harbulot'06, Bodden'11, Akai'09] --- for "local" flow control • Delimited continuations [Felleisen'88, Danvy'90] --- for non-local flow control; low-level and based on names 19

  20. Final Remarks • Proposed Chop&Graft mechanism Pointcuts are powerful abstraction to express remote points of control • Future work: precise semantics; full implementation; empirical studies 20

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend