Lecture. Advanced Reflection: MetaLinks

Marcus Denker
Marcus DenkerResearch Scientist at INRIA
Advanced Re
fl
ection:
MetaLinks
Marcus Denker, Inria
http://marcusdenker.de
Lecture at VUB Brussels, March 31, 2022
What we know…
• Smalltalk is re
fl
ective

• Classes, Methods, Stack-Frames… are Objects

• Re
fl
ective API on all Objects
Re
fl
ection in Smalltalk
• Re
fl
ection is based on the Metaclass model, thus it is
inherently structural

• Behavioral Re
fl
ection limited to:

• Method lookup on failure (#doesNotUndersand:)

• Rei
fi
ed stack (thisContext)
Can we do better?
• A more
fi
ne-grained re
fl
ective mechanism seems to be
missing

• Let’s look again at a Method in the Inspector
Inspector on a Method
The AST
• AST = Abstract Syntax Tree

• Tree Representation of the Method

• Produced by the Parser (part of the Compiler)

• Used by all tools (refactoring, syntax-highlighting,…)
Smalltalk compiler parse: 'test ^(1+2)'
AST
• RBMethodNode Root

• RBVariableNode Variable (read and write)

• RBAssignmentNode Assignment

• RBMessageNode A Message (most of them)

• RBReturnNode Return
Inspect a simple AST
• A very simple Example
Smalltalk compiler parse: 'test ^(1+2)'
AST: Navigation
• To make it easy to
fi
nd and enumerate nodes, there are
some helper methods

• CompiledMethod has: #sendNodes,
#variableNodes, #assignmentNodes
• Every AST node has #nodesDo: and #allChildren
AST: Visitor
• RBProgramNodeVisitor: Visitor Pattern for the AST

• Make subclass, override visit… methods

• Let’s see it in action: Count Message sends
Demo: Visitor
Repeat:The AST
• AST = Abstract Syntax Tree

• Tree Representation of the Method

• Produced by the Parser (part of the Compiler)

• Used by all tools (refactoring, syntax-highlighting,…)
Smalltalk compiler parse: 'test ^(1+2)'
The Compiler
• Smalltalk compiler -> Compiler Facade 

• Classes de
fi
ne the compiler to use

• You can override method #compiler

• Behind: Compiler Chain
The Compiler
Source AST
Annotated
AST
IR
Annotated
AST
Bytecode
RBParser OCSemanticAnalyzer
OCASTTranslator/
IRBuilder
IRBytecodeGenerator
AST Integration
• Originally just internal to the compiler

• Pharo: 

• send #ast to a method to get the AST

• Cached for persistency.
(Point>>#x) ast == (Point>>#x) ast
—> true
AST Integration
• We can navigate from execution to AST

• Example:
[ 1 + 2 ] sourceNode ==
thisContext method sourceNode blockNodes first
Compiler: Extensible
• All parts can be subclassed

• Compiler instance can be setup to use the subclass for
any part (parser, name analysis, translator…)

• enable for a class only by implementing #compiler on the
class side
Compiler Plugins
• The AST can be easily transformed

• We added a Plugin architecture to the Compiler

• enable for a class only by implementing:
compiler

	 ^super compiler addPlugin: MyPlugin
The Compiler
Source AST
Annotated
AST
IR
Annotated
AST
Bytecode
RBParser OCSemanticAnalyzer
OCASTTranslator/
IRBuilder
IRBytecodeGenerator
Plugin
Source AST
Annotated
AST
IR
Annotated
AST
Bytecode
RBParser OCSemanticAnalyzer
OCASTTranslator/
IRBuilder
IRBytecodeGenerator
OCCompilerASTPlugin
Annotated
AST
Plugin: Example
• We get all ifTrue: sends

• replace them with true
DemoPlugin>>transform
transform
| sends |
sends := ast sendNodes.
sends := sends select: [ :each | each selector = #ifTrue: ].
sends do: [:each | each replaceWith:
(RBLiteralNode value: true)].
^ast
Back to the topic…
• A more
fi
ne-grained re
fl
ective mechanism seems to be
missing

• Can’t we do something with the AST?
Wouldn’t it be nice..
• With the AST, wouldn’t it be nice if we could use this
structure for Behavioural Re
fl
ection?

• If we could somehow attach a “arrow to the code” that
points to a meta-object
test
^( 1 + 2 )
meta-object
for this Send
We have all pieces…
• We have the AST for each method

• It is quite simple

• We have a compiler in the system

• So this should be possible…
The MetaLink
• MetaLink points to metaObject

• De
fi
nes a selector to call

• And a control attribute: #before, #after, #instead

• Installed on a AST node:
link := MetaLink new
metaObject: Halt;
selector: #once;
control: #before.
(Number>>#sin) ast link: link
The MetaLink
• Can be installed on any AST Node

• Methods will be re-compiled on the
fl
y just before next
execution

• Link installation is very fast

• Changing a method removes all links from this method

• Managing link re-installation has to be done by the user
MetaLink: MetaObject
• MetaObject can be any object

• Even a Block: [Transcript show ‘hello’]
• Install on any Node with #link:

• de-install a link with #uninstall
MetaLink: Selector
• MetaLink de
fi
nes a message send to the MetaObject

• #selector de
fi
nes which one

• Default is #value

• Yes, a selector with arguments is supported 

• We can pass information to the meta-object
MetaLink: Argument
• The arguments de
fi
ne which arguments to pass

• We support a number of rei
fi
cations
Rei
fi
cations
• Rei
fi
cations de
fi
ne data to be passed as arguments

• Reify —> Make something into an object that is not one
normally

• Example: “All arguments of this message”
Rei
fi
cations: examples
• All nodes: #object #context #class #node
#link
• Sends: #arguments #receiver #selector
• Method: #arguments #selector 

• Variable: #value

They are de
fi
ned as subclasses of class RFRei
fi
cation
Rei
fi
cations as MetaObject
• We support some special metaObjects:

• #node The AST Node we are installed on

• #object self at runtime

• #class The class the links is installed in
MetaLink: Condition
• We can specify a condition for the MetaLink

• Link is active if the condition evaluates to true
• We can pass rei
fi
cations as arguments
link := MetaLink new
metaObject: Halt;
selector: #once;
condition: [:object | object == 5] arguments: #(object).
(Number>>#sin) ast link: link.
MetaLink: control
• We can specify when to call the meta-object

• We support #before, #after and #instead
• The instead is very simple: last one wins
Example: Log
• We want to just print something to the Transcript
link := MetaLink new
metaObject: [Transcript show: 'Reached Here'].
(Number>>#sin) ast link: link
Recursion Problem
• Before we see more examples: There is a problem

• Imagine we put a MetaLink on some method deep in the
System (e.g new, +, do: ).

• Our Meta-Object might use exactly that method, too
Endless Loop!!
Recursion Problem
• Solution: Meta-Level

• We encode the a level in the execution of the system

• Every Link Activation increases the level

• A meta-link is just active for one level. (e.g. 0)
link := MetaLink new
metaObject: [ Object new ];
level: 0.
(Behavior>>#new) ast link: link.
Example: Log
• Better use #level: 0

• Nevertheless: be careful! If you add this to method called
often it can be very slow.
link := MetaLink new
metaObject: [Transcript show: 'Reached Here’];
level: 0.
Example: Counter
• In the Browser you can add a “counter” to the AST

• See class ExecutionCounter
install
link := MetaLink new
metaObject: self;
selector: #increase.
node link: link.
Example: Breakpoint
• “Add Breakpoint” in AST (Suggestions) Menu

• See class Breakpoint

• Break Once 

• Conditional Break breakLink
^ MetaLink new
metaObject: Break;
selector: #break;
options: options
Example: WatchPoint
• Watchpoint: Record Value at a point in the AST

• Example: Watch event in WorldMorph>>#mouseDown:
Click on background
-> value recorded
Example: WatchPoint
• Implementation: class Watchpoint, method install

• example of a #after link with a condition
link := MetaLink new
metaObject: self;
selector: #addValue:;
arguments: #(value);
control: #after;
condition: [ recording ].
Example: Code Coverage
• Small Demo.

• Start with CoverageDemo new open
Example: Code Coverage
• Example of a MetaLink with a #node MetaObject

• Meta-Object is the node that the link is installed on
link := MetaLink new
metaObject: #node;
selector: #tagExecuted.
Interesting Properties
• Cross Cutting

• One Link can be installed multiple times

• Over multiple methods and even Classes

• And across operations (e.g., Send and Assignment) as
long as all rei
fi
cations requested are compatible

• Fully Dynamic: Links can be added and removed at runtime

• Even by the meta-object of another meta-link!
Example: Accept for Test
• Imagine we want to edit a method that is called often by
the System.

• How do we test it?

• It would be nice if we could “Accept for Test”
Example: Accept for Test
• Menu in the browser: AST menu shows for all nodes.
SycSourceCodeCommand subclass: #SycAcceptForTest
instanceVariableNames: 'source'
classVariableNames: ''
package: 'SystemCommands-SourceCodeCommands'
defaultMenuItemName
^'Accept for Test'
readParametersFromContext: aSourceCodeContext
super readParametersFromContext: aSourceCodeContext.
source := aSourceCodeContext tool pendingText
• We implement our code in the #execute method
Example: Accept for Test
• How we know that we are in a test?
CurrentExecutionEnvironment value isTest
• We can compile the current text bu
ff
er
newMethod := method methodClass compiler
source: source;
options: #(+ optionParseErrors);
compile.
Example: Accept for Test
• Add this code to the beginning of the method:
[:aContext :args |
CurrentExecutionEnvironment value isTest ifTrue: [
aContext return: (newMethod
valueWithReceiver: aContext
receiver
arguments: args) ]]
• Let’s do that with a MetaLink!
Example: Accept for Test
execute
| newMethod metaLink |
newMethod := method methodClass compiler
source: source;
options: #(+ optionParseErrors);
compile.
"the link executes the method we just created and returns"
metaLink := MetaLink new
metaObject: [ :aContext :args |
CurrentExecutionEnvironment value isTest
ifTrue: [ aContext return: (newMethod
valueWithReceiver: aContext receiver
arguments: args) ] ];
selector: #value:value:;
arguments: #(context arguments).
self method ast link: metaLink
What did we see?
• ASTs and AST Visitors

• Compiler and Compiler Plugins

• MetaLinks 

• Recursion Problem

• Examples: Counter, Breakpoint, Coverage

• Accept for Test
Limitations
• #instead needs more work (e.g to support conditions)

• Keep in mind: next metaLink taken into account for next
method activation 

• Take care with long running loops!
Help Wanted
• We are always interested in improvements!

• Pharo 10 will be released soon! 

• Pull Requests Welcome!
Questions?
1 of 54

Recommended

Lecture: "Advanced Reflection: MetaLinks" by
Lecture: "Advanced Reflection: MetaLinks"Lecture: "Advanced Reflection: MetaLinks"
Lecture: "Advanced Reflection: MetaLinks"Marcus Denker
11 views54 slides
VUB Brussels Lecture 2019: Advanced Reflection: MetaLinks by
VUB Brussels Lecture 2019: Advanced Reflection: MetaLinksVUB Brussels Lecture 2019: Advanced Reflection: MetaLinks
VUB Brussels Lecture 2019: Advanced Reflection: MetaLinksMarcus Denker
213 views52 slides
Lecture: Advanced Reflection. MetaLinks by
Lecture: Advanced Reflection. MetaLinksLecture: Advanced Reflection. MetaLinks
Lecture: Advanced Reflection. MetaLinksMarcus Denker
1.4K views47 slides
Lecture: MetaLinks by
Lecture: MetaLinksLecture: MetaLinks
Lecture: MetaLinksMarcus Denker
4.1K views37 slides
Reflection in Pharo5 by
Reflection in Pharo5Reflection in Pharo5
Reflection in Pharo5Marcus Denker
3.2K views48 slides
Behavioral Reflection in Pharo by
Behavioral Reflection in PharoBehavioral Reflection in Pharo
Behavioral Reflection in PharoESUG
308 views48 slides

More Related Content

Similar to Lecture. Advanced Reflection: MetaLinks

Reflection in Pharo: Beyond Smalltak by
Reflection in Pharo: Beyond SmalltakReflection in Pharo: Beyond Smalltak
Reflection in Pharo: Beyond SmalltakMarcus Denker
746 views56 slides
Behavioral Reflection by
Behavioral ReflectionBehavioral Reflection
Behavioral ReflectionMarcus Denker
1.9K views32 slides
First Class Variables as AST Annotations by
 First Class Variables as AST Annotations First Class Variables as AST Annotations
First Class Variables as AST AnnotationsESUG
59 views42 slides
First Class Variables as AST Annotations by
First Class Variables as AST AnnotationsFirst Class Variables as AST Annotations
First Class Variables as AST AnnotationsMarcus Denker
5 views42 slides
DjangoCon 2010 Scaling Disqus by
DjangoCon 2010 Scaling DisqusDjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling Disquszeeg
32.6K views56 slides
Variables in Pharo by
Variables in PharoVariables in Pharo
Variables in PharoMarcus Denker
87 views45 slides

Similar to Lecture. Advanced Reflection: MetaLinks(20)

Reflection in Pharo: Beyond Smalltak by Marcus Denker
Reflection in Pharo: Beyond SmalltakReflection in Pharo: Beyond Smalltak
Reflection in Pharo: Beyond Smalltak
Marcus Denker746 views
Behavioral Reflection by Marcus Denker
Behavioral ReflectionBehavioral Reflection
Behavioral Reflection
Marcus Denker1.9K views
First Class Variables as AST Annotations by ESUG
 First Class Variables as AST Annotations First Class Variables as AST Annotations
First Class Variables as AST Annotations
ESUG59 views
First Class Variables as AST Annotations by Marcus Denker
First Class Variables as AST AnnotationsFirst Class Variables as AST Annotations
First Class Variables as AST Annotations
Marcus Denker5 views
DjangoCon 2010 Scaling Disqus by zeeg
DjangoCon 2010 Scaling DisqusDjangoCon 2010 Scaling Disqus
DjangoCon 2010 Scaling Disqus
zeeg32.6K views
Runtime Bytecode Transformation for Smalltalk by ESUG
Runtime Bytecode Transformation for SmalltalkRuntime Bytecode Transformation for Smalltalk
Runtime Bytecode Transformation for Smalltalk
ESUG390 views
Runtime Bytecode Transformation for Smalltalk by Marcus Denker
Runtime Bytecode Transformation for SmalltalkRuntime Bytecode Transformation for Smalltalk
Runtime Bytecode Transformation for Smalltalk
Marcus Denker410 views
Data weave (MuleSoft) by Nandu List5
Data weave (MuleSoft)Data weave (MuleSoft)
Data weave (MuleSoft)
Nandu List52.1K views
The hardest part of microservices: your data by Christian Posta
The hardest part of microservices: your dataThe hardest part of microservices: your data
The hardest part of microservices: your data
Christian Posta21.4K views
TypeScript: Basic Features and Compilation Guide by Nascenia IT
TypeScript: Basic Features and Compilation GuideTypeScript: Basic Features and Compilation Guide
TypeScript: Basic Features and Compilation Guide
Nascenia IT398 views
DDD, CQRS and testing with ASP.Net MVC by Andy Butland
DDD, CQRS and testing with ASP.Net MVCDDD, CQRS and testing with ASP.Net MVC
DDD, CQRS and testing with ASP.Net MVC
Andy Butland7.7K views
Spring Day | Spring and Scala | Eberhard Wolff by JAX London
Spring Day | Spring and Scala | Eberhard WolffSpring Day | Spring and Scala | Eberhard Wolff
Spring Day | Spring and Scala | Eberhard Wolff
JAX London1.5K views
MWLUG 2015 - AD114 Take Your XPages Development to the Next Level by balassaitis
MWLUG 2015 - AD114 Take Your XPages Development to the Next LevelMWLUG 2015 - AD114 Take Your XPages Development to the Next Level
MWLUG 2015 - AD114 Take Your XPages Development to the Next Level
balassaitis2.6K views
Charles Sharp: Java 8 Streams by jessitron
Charles Sharp: Java 8 StreamsCharles Sharp: Java 8 Streams
Charles Sharp: Java 8 Streams
jessitron2K views
Can't Dance The Lambda by Togakangaroo
Can't Dance The LambdaCan't Dance The Lambda
Can't Dance The Lambda
Togakangaroo1.2K views

More from Marcus Denker

Soil And Pharo by
Soil And PharoSoil And Pharo
Soil And PharoMarcus Denker
47 views12 slides
ConstantBlocks in Pharo11 by
ConstantBlocks in Pharo11ConstantBlocks in Pharo11
ConstantBlocks in Pharo11Marcus Denker
50 views26 slides
Demo: Improved DoIt by
Demo: Improved DoItDemo: Improved DoIt
Demo: Improved DoItMarcus Denker
4 views3 slides
Supporting Pharo / Getting Pharo Support by
Supporting Pharo / Getting Pharo SupportSupporting Pharo / Getting Pharo Support
Supporting Pharo / Getting Pharo SupportMarcus Denker
8 views19 slides
thisContext in the Debugger by
thisContext in the DebuggerthisContext in the Debugger
thisContext in the DebuggerMarcus Denker
413 views7 slides
Improving code completion for Pharo by
Improving code completion for PharoImproving code completion for Pharo
Improving code completion for PharoMarcus Denker
292 views19 slides

More from Marcus Denker(20)

Supporting Pharo / Getting Pharo Support by Marcus Denker
Supporting Pharo / Getting Pharo SupportSupporting Pharo / Getting Pharo Support
Supporting Pharo / Getting Pharo Support
Marcus Denker8 views
thisContext in the Debugger by Marcus Denker
thisContext in the DebuggerthisContext in the Debugger
thisContext in the Debugger
Marcus Denker413 views
Improving code completion for Pharo by Marcus Denker
Improving code completion for PharoImproving code completion for Pharo
Improving code completion for Pharo
Marcus Denker292 views
Open-Source: An Infinite Game by Marcus Denker
Open-Source: An Infinite GameOpen-Source: An Infinite Game
Open-Source: An Infinite Game
Marcus Denker1.2K views
PharoTechTalk: Contributing to Pharo by Marcus Denker
PharoTechTalk: Contributing to PharoPharoTechTalk: Contributing to Pharo
PharoTechTalk: Contributing to Pharo
Marcus Denker684 views
Feedback Loops in Practice by Marcus Denker
Feedback Loops in PracticeFeedback Loops in Practice
Feedback Loops in Practice
Marcus Denker860 views
Perfection & Feedback Loops or: why worse is better by Marcus Denker
Perfection & Feedback Loops or: why worse is betterPerfection & Feedback Loops or: why worse is better
Perfection & Feedback Loops or: why worse is better
Marcus Denker7.5K views
Dynamically Composing Collection Operations through Collection Promises by Marcus Denker
Dynamically Composing Collection Operations through Collection PromisesDynamically Composing Collection Operations through Collection Promises
Dynamically Composing Collection Operations through Collection Promises
Marcus Denker727 views
How to Contribute to Pharo by Marcus Denker
How to Contribute to PharoHow to Contribute to Pharo
How to Contribute to Pharo
Marcus Denker1.3K views
Pharo Status (from PharoDays 2015) by Marcus Denker
Pharo Status (from PharoDays 2015)Pharo Status (from PharoDays 2015)
Pharo Status (from PharoDays 2015)
Marcus Denker1.3K views
Pharo Status Fosdem 2015 by Marcus Denker
Pharo Status Fosdem 2015Pharo Status Fosdem 2015
Pharo Status Fosdem 2015
Marcus Denker6.9K views
Pharo Status ESUG 2014 by Marcus Denker
Pharo Status ESUG 2014Pharo Status ESUG 2014
Pharo Status ESUG 2014
Marcus Denker1.2K views

Recently uploaded

DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti... by
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...ShapeBlue
98 views29 slides
Network Source of Truth and Infrastructure as Code revisited by
Network Source of Truth and Infrastructure as Code revisitedNetwork Source of Truth and Infrastructure as Code revisited
Network Source of Truth and Infrastructure as Code revisitedNetwork Automation Forum
52 views45 slides
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue by
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlueElevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlueShapeBlue
179 views7 slides
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue by
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlueShapeBlue
103 views23 slides
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava... by
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...ShapeBlue
101 views17 slides
Ransomware is Knocking your Door_Final.pdf by
Ransomware is Knocking your Door_Final.pdfRansomware is Knocking your Door_Final.pdf
Ransomware is Knocking your Door_Final.pdfSecurity Bootcamp
90 views46 slides

Recently uploaded(20)

DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti... by ShapeBlue
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...
ShapeBlue98 views
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue by ShapeBlue
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlueElevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue
Elevating Privacy and Security in CloudStack - Boris Stoyanov - ShapeBlue
ShapeBlue179 views
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue by ShapeBlue
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue
2FA and OAuth2 in CloudStack - Andrija Panić - ShapeBlue
ShapeBlue103 views
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava... by ShapeBlue
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...
ShapeBlue101 views
KVM Security Groups Under the Hood - Wido den Hollander - Your.Online by ShapeBlue
KVM Security Groups Under the Hood - Wido den Hollander - Your.OnlineKVM Security Groups Under the Hood - Wido den Hollander - Your.Online
KVM Security Groups Under the Hood - Wido den Hollander - Your.Online
ShapeBlue181 views
The Role of Patterns in the Era of Large Language Models by Yunyao Li
The Role of Patterns in the Era of Large Language ModelsThe Role of Patterns in the Era of Large Language Models
The Role of Patterns in the Era of Large Language Models
Yunyao Li80 views
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit... by ShapeBlue
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...
ShapeBlue117 views
GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N... by James Anderson
GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N...GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N...
GDG Cloud Southlake 28 Brad Taylor and Shawn Augenstein Old Problems in the N...
James Anderson156 views
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas... by Bernd Ruecker
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...
Bernd Ruecker50 views
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ... by ShapeBlue
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
ShapeBlue85 views
Backroll, News and Demo - Pierre Charton, Matthias Dhellin, Ousmane Diarra - ... by ShapeBlue
Backroll, News and Demo - Pierre Charton, Matthias Dhellin, Ousmane Diarra - ...Backroll, News and Demo - Pierre Charton, Matthias Dhellin, Ousmane Diarra - ...
Backroll, News and Demo - Pierre Charton, Matthias Dhellin, Ousmane Diarra - ...
ShapeBlue146 views
Digital Personal Data Protection (DPDP) Practical Approach For CISOs by Priyanka Aash
Digital Personal Data Protection (DPDP) Practical Approach For CISOsDigital Personal Data Protection (DPDP) Practical Approach For CISOs
Digital Personal Data Protection (DPDP) Practical Approach For CISOs
Priyanka Aash153 views
Extending KVM Host HA for Non-NFS Storage - Alex Ivanov - StorPool by ShapeBlue
Extending KVM Host HA for Non-NFS Storage -  Alex Ivanov - StorPoolExtending KVM Host HA for Non-NFS Storage -  Alex Ivanov - StorPool
Extending KVM Host HA for Non-NFS Storage - Alex Ivanov - StorPool
ShapeBlue84 views
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue by ShapeBlue
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlueVNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue
VNF Integration and Support in CloudStack - Wei Zhou - ShapeBlue
ShapeBlue163 views
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLive by Network Automation Forum
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLiveAutomating a World-Class Technology Conference; Behind the Scenes of CiscoLive
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLive
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P... by ShapeBlue
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...
ShapeBlue154 views
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda... by ShapeBlue
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...
ShapeBlue120 views

Lecture. Advanced Reflection: MetaLinks

  • 1. Advanced Re fl ection: MetaLinks Marcus Denker, Inria http://marcusdenker.de Lecture at VUB Brussels, March 31, 2022
  • 2. What we know… • Smalltalk is re fl ective • Classes, Methods, Stack-Frames… are Objects • Re fl ective API on all Objects
  • 3. Re fl ection in Smalltalk • Re fl ection is based on the Metaclass model, thus it is inherently structural • Behavioral Re fl ection limited to: • Method lookup on failure (#doesNotUndersand:) • Rei fi ed stack (thisContext)
  • 4. Can we do better? • A more fi ne-grained re fl ective mechanism seems to be missing • Let’s look again at a Method in the Inspector
  • 5. Inspector on a Method
  • 6. The AST • AST = Abstract Syntax Tree • Tree Representation of the Method • Produced by the Parser (part of the Compiler) • Used by all tools (refactoring, syntax-highlighting,…) Smalltalk compiler parse: 'test ^(1+2)'
  • 7. AST • RBMethodNode Root • RBVariableNode Variable (read and write) • RBAssignmentNode Assignment • RBMessageNode A Message (most of them) • RBReturnNode Return
  • 8. Inspect a simple AST • A very simple Example Smalltalk compiler parse: 'test ^(1+2)'
  • 9. AST: Navigation • To make it easy to fi nd and enumerate nodes, there are some helper methods • CompiledMethod has: #sendNodes, #variableNodes, #assignmentNodes • Every AST node has #nodesDo: and #allChildren
  • 10. AST: Visitor • RBProgramNodeVisitor: Visitor Pattern for the AST • Make subclass, override visit… methods • Let’s see it in action: Count Message sends
  • 12. Repeat:The AST • AST = Abstract Syntax Tree • Tree Representation of the Method • Produced by the Parser (part of the Compiler) • Used by all tools (refactoring, syntax-highlighting,…) Smalltalk compiler parse: 'test ^(1+2)'
  • 13. The Compiler • Smalltalk compiler -> Compiler Facade • Classes de fi ne the compiler to use • You can override method #compiler • Behind: Compiler Chain
  • 14. The Compiler Source AST Annotated AST IR Annotated AST Bytecode RBParser OCSemanticAnalyzer OCASTTranslator/ IRBuilder IRBytecodeGenerator
  • 15. AST Integration • Originally just internal to the compiler • Pharo: • send #ast to a method to get the AST • Cached for persistency. (Point>>#x) ast == (Point>>#x) ast —> true
  • 16. AST Integration • We can navigate from execution to AST • Example: [ 1 + 2 ] sourceNode == thisContext method sourceNode blockNodes first
  • 17. Compiler: Extensible • All parts can be subclassed • Compiler instance can be setup to use the subclass for any part (parser, name analysis, translator…) • enable for a class only by implementing #compiler on the class side
  • 18. Compiler Plugins • The AST can be easily transformed • We added a Plugin architecture to the Compiler • enable for a class only by implementing: compiler ^super compiler addPlugin: MyPlugin
  • 19. The Compiler Source AST Annotated AST IR Annotated AST Bytecode RBParser OCSemanticAnalyzer OCASTTranslator/ IRBuilder IRBytecodeGenerator
  • 21. Plugin: Example • We get all ifTrue: sends • replace them with true DemoPlugin>>transform transform | sends | sends := ast sendNodes. sends := sends select: [ :each | each selector = #ifTrue: ]. sends do: [:each | each replaceWith: (RBLiteralNode value: true)]. ^ast
  • 22. Back to the topic… • A more fi ne-grained re fl ective mechanism seems to be missing • Can’t we do something with the AST?
  • 23. Wouldn’t it be nice.. • With the AST, wouldn’t it be nice if we could use this structure for Behavioural Re fl ection? • If we could somehow attach a “arrow to the code” that points to a meta-object test ^( 1 + 2 ) meta-object for this Send
  • 24. We have all pieces… • We have the AST for each method • It is quite simple • We have a compiler in the system • So this should be possible…
  • 25. The MetaLink • MetaLink points to metaObject • De fi nes a selector to call • And a control attribute: #before, #after, #instead • Installed on a AST node: link := MetaLink new metaObject: Halt; selector: #once; control: #before. (Number>>#sin) ast link: link
  • 26. The MetaLink • Can be installed on any AST Node • Methods will be re-compiled on the fl y just before next execution • Link installation is very fast • Changing a method removes all links from this method • Managing link re-installation has to be done by the user
  • 27. MetaLink: MetaObject • MetaObject can be any object • Even a Block: [Transcript show ‘hello’] • Install on any Node with #link: • de-install a link with #uninstall
  • 28. MetaLink: Selector • MetaLink de fi nes a message send to the MetaObject • #selector de fi nes which one • Default is #value • Yes, a selector with arguments is supported • We can pass information to the meta-object
  • 29. MetaLink: Argument • The arguments de fi ne which arguments to pass • We support a number of rei fi cations
  • 30. Rei fi cations • Rei fi cations de fi ne data to be passed as arguments • Reify —> Make something into an object that is not one normally • Example: “All arguments of this message”
  • 31. Rei fi cations: examples • All nodes: #object #context #class #node #link • Sends: #arguments #receiver #selector • Method: #arguments #selector • Variable: #value
 They are de fi ned as subclasses of class RFRei fi cation
  • 32. Rei fi cations as MetaObject • We support some special metaObjects: • #node The AST Node we are installed on • #object self at runtime • #class The class the links is installed in
  • 33. MetaLink: Condition • We can specify a condition for the MetaLink • Link is active if the condition evaluates to true • We can pass rei fi cations as arguments link := MetaLink new metaObject: Halt; selector: #once; condition: [:object | object == 5] arguments: #(object). (Number>>#sin) ast link: link.
  • 34. MetaLink: control • We can specify when to call the meta-object • We support #before, #after and #instead • The instead is very simple: last one wins
  • 35. Example: Log • We want to just print something to the Transcript link := MetaLink new metaObject: [Transcript show: 'Reached Here']. (Number>>#sin) ast link: link
  • 36. Recursion Problem • Before we see more examples: There is a problem • Imagine we put a MetaLink on some method deep in the System (e.g new, +, do: ). • Our Meta-Object might use exactly that method, too Endless Loop!!
  • 37. Recursion Problem • Solution: Meta-Level • We encode the a level in the execution of the system • Every Link Activation increases the level • A meta-link is just active for one level. (e.g. 0) link := MetaLink new metaObject: [ Object new ]; level: 0. (Behavior>>#new) ast link: link.
  • 38. Example: Log • Better use #level: 0 • Nevertheless: be careful! If you add this to method called often it can be very slow. link := MetaLink new metaObject: [Transcript show: 'Reached Here’]; level: 0.
  • 39. Example: Counter • In the Browser you can add a “counter” to the AST • See class ExecutionCounter install link := MetaLink new metaObject: self; selector: #increase. node link: link.
  • 40. Example: Breakpoint • “Add Breakpoint” in AST (Suggestions) Menu • See class Breakpoint • Break Once • Conditional Break breakLink ^ MetaLink new metaObject: Break; selector: #break; options: options
  • 41. Example: WatchPoint • Watchpoint: Record Value at a point in the AST • Example: Watch event in WorldMorph>>#mouseDown: Click on background -> value recorded
  • 42. Example: WatchPoint • Implementation: class Watchpoint, method install • example of a #after link with a condition link := MetaLink new metaObject: self; selector: #addValue:; arguments: #(value); control: #after; condition: [ recording ].
  • 43. Example: Code Coverage • Small Demo. • Start with CoverageDemo new open
  • 44. Example: Code Coverage • Example of a MetaLink with a #node MetaObject • Meta-Object is the node that the link is installed on link := MetaLink new metaObject: #node; selector: #tagExecuted.
  • 45. Interesting Properties • Cross Cutting • One Link can be installed multiple times • Over multiple methods and even Classes • And across operations (e.g., Send and Assignment) as long as all rei fi cations requested are compatible • Fully Dynamic: Links can be added and removed at runtime • Even by the meta-object of another meta-link!
  • 46. Example: Accept for Test • Imagine we want to edit a method that is called often by the System. • How do we test it? • It would be nice if we could “Accept for Test”
  • 47. Example: Accept for Test • Menu in the browser: AST menu shows for all nodes. SycSourceCodeCommand subclass: #SycAcceptForTest instanceVariableNames: 'source' classVariableNames: '' package: 'SystemCommands-SourceCodeCommands' defaultMenuItemName ^'Accept for Test' readParametersFromContext: aSourceCodeContext super readParametersFromContext: aSourceCodeContext. source := aSourceCodeContext tool pendingText • We implement our code in the #execute method
  • 48. Example: Accept for Test • How we know that we are in a test? CurrentExecutionEnvironment value isTest • We can compile the current text bu ff er newMethod := method methodClass compiler source: source; options: #(+ optionParseErrors); compile.
  • 49. Example: Accept for Test • Add this code to the beginning of the method: [:aContext :args | CurrentExecutionEnvironment value isTest ifTrue: [ aContext return: (newMethod valueWithReceiver: aContext receiver arguments: args) ]] • Let’s do that with a MetaLink!
  • 50. Example: Accept for Test execute | newMethod metaLink | newMethod := method methodClass compiler source: source; options: #(+ optionParseErrors); compile. "the link executes the method we just created and returns" metaLink := MetaLink new metaObject: [ :aContext :args | CurrentExecutionEnvironment value isTest ifTrue: [ aContext return: (newMethod valueWithReceiver: aContext receiver arguments: args) ] ]; selector: #value:value:; arguments: #(context arguments). self method ast link: metaLink
  • 51. What did we see? • ASTs and AST Visitors • Compiler and Compiler Plugins • MetaLinks • Recursion Problem • Examples: Counter, Breakpoint, Coverage • Accept for Test
  • 52. Limitations • #instead needs more work (e.g to support conditions) • Keep in mind: next metaLink taken into account for next method activation • Take care with long running loops!
  • 53. Help Wanted • We are always interested in improvements! • Pharo 10 will be released soon! • Pull Requests Welcome!