[squeak-dev] The Inbox: Compiler-mt.454.mcz

commits at source.squeak.org commits at source.squeak.org
Wed Jan 27 09:31:47 UTC 2021


A new version of Compiler was added to project The Inbox:
http://source.squeak.org/inbox/Compiler-mt.454.mcz

==================== Summary ====================

Name: Compiler-mt.454
Author: mt
Time: 27 January 2021, 10:31:47.057422 am
UUID: 6e01e1e3-e3b2-41a4-9749-37f1dab71fba
Ancestors: Compiler-eem.453

Adds <noContextSwitch> pragma, which maps to <primitive: 123>. For this, allow parser extensions to be non-keyword (i.e. unary) pragmas. Might have a tiny performance impact when parsing methods with lots of non-keyword pragmas.

=============== Diff against Compiler-eem.453 ===============

Item was added:
+ ----- Method: Parser>>noContextSwitch (in category 'pragmas - code evaluation') -----
+ noContextSwitch
+ 	"By adding this pragma to a method, it will not be preempt the current process on method activation if a higher-priority process is runnable. Any numbered primitive without side effects will do here."
+ 	<pragmaParser>
+ 
+ 	"Note that primitive 123 once was primitiveValueUninteruptibly but is no longer in use."	
+ 	self addPragma: (Pragma keyword: #primitive: arguments: #(123)).
+ 
+ 	self advance.
+ 	^ true!

Item was changed:
  ----- Method: Parser>>pragmaStatement (in category 'pragmas') -----
  pragmaStatement
  	"Parse a pragma statement. The leading '<' has already been consumed. The 'here' token is the first one in the pragma. Use that token to dispatch to a custom pragma-parsing method if one can be found with a selector that matches it.
  	
  	Note that custom pragma parsers need to fulfill two requirements:
  		- method selector must match the current token as simple getter,
  				e.g., <apicall: ...> matches #apicall or <primitive: ...> matches #primitive
  		- method must have pragma <pragmaParser> to be called."
  	
  	"0) Early exit"
  	(hereType = #keyword or: [ hereType = #word or: [ hereType = #binary ] ])
  		ifFalse: [  ^ self expected: 'pragma declaration' ].
  
+ 	"1) Avoid interning new symbols for made-up pragmas such as #my for <my: 1 pragma: 2>."
+ 	(Symbol lookup: (here last == $: ifTrue: [here allButLast] ifFalse: [here])) ifNotNil: [:parserSelector |
+ 		Parser methodDict at: parserSelector ifPresent: [:parserMethod |
+ 			"2) Only call methods that claim to be a custom pragma parser via <pragmaParser>."
+ 			(parserMethod hasPragma: #pragmaParser)
+ 				ifTrue: [^ self executeMethod: parserMethod]]].
- 	"1) Do not consider one-word pragmas such as <primitive> and <foobar>. Only keyword pragmas."
- 	here last == $: ifTrue: [
- 		"2) Avoid interning new symbols for made-up pragmas such as #my for <my: 1 pragma: 2>."
- 		(Symbol lookup: here allButLast) ifNotNil: [:parserSelector |
- 			Parser methodDict at: parserSelector ifPresent: [:parserMethod |
- 				"3) Only call methods that claim to be a custom pragma parser via <pragmaParser>."
- 				(parserMethod hasPragma: #pragmaParser)
- 					ifTrue: [^ self executeMethod: parserMethod]]]].
  
  	"X) No custom pragma parser found. Use the default one."
  	^ self pragmaStatementKeywords!



More information about the Squeak-dev mailing list