[squeak-dev] The Trunk: ShoutCore-mt.78.mcz

commits at source.squeak.org commits at source.squeak.org
Sun Jun 14 06:03:29 UTC 2020


Marcel Taeumel uploaded a new version of ShoutCore to project The Trunk:
http://source.squeak.org/trunk/ShoutCore-mt.78.mcz

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

Name: ShoutCore-mt.78
Author: mt
Time: 12 June 2020, 5:28:15.527851 pm
UUID: 7decada5-8996-304c-ba9c-a93b00f0cc33
Ancestors: ShoutCore-mt.77

Complements Compiler-mt.436 (inbox).

Adds a (extension) method-based hook to install custom pragma-parsing methods. Use it to move FFI-specific pragma-parsing, i.e. <apicall: ...> and <cdecl: ...>, into FFI packages.

=============== Diff against ShoutCore-mt.77 ===============

Item was removed:
- ----- Method: SHParserST80>>isTokenExternalFunctionCallingConvention (in category 'token testing') -----
- isTokenExternalFunctionCallingConvention
- 	
- 	currentToken ifNil: [ ^false ].
- 	^(Smalltalk classNamed: #ExternalFunction)
- 		ifNil: [ false ]
- 		ifNotNil: [ :descriptorClass |
- 			(descriptorClass callingConventionFor: currentToken) notNil ]!

Item was removed:
- ----- Method: SHParserST80>>parseExternalCall (in category 'parse') -----
- parseExternalCall
- 	[self scanNext.
- 	((Smalltalk at: #ExternalFunction) callingConventionModifierFor: currentToken) notNil]
- 		whileTrue.
- 	self failUnless: currentToken notNil.
- 	self scanPast: #externalCallType.
- 	currentToken = '*' 
- 		ifTrue: [self scanPast: #externalCallTypePointerIndicator].
- 	currentTokenFirst isDigit
- 		ifTrue: [self scanPast: #integer]
- 		ifFalse: 	[
- 			self failUnless: currentTokenFirst == $'.
- 			self parseString].
- 	self failUnless: currentTokenFirst == $(.
- 	self scanPast: #leftParenthesis.
- 	[currentTokenFirst ~= $)] 
- 		whileTrue: [
- 			self failUnless: currentToken notNil.
- 			self scanPast: #externalCallType.
- 			currentToken = '*' 
- 				ifTrue: [self scanPast: #externalCallTypePointerIndicator]].
- 	self scanPast: #rightParenthesis.
- 	currentToken = 'module:' 
- 		ifTrue: [
- 			self scanPast: #module.
- 			self parseStringOrSymbol ].
- 	currentToken = 'error:' ifTrue: [
- 		self scanPast: #primitive. "there's no rangeType for error"
- 		self currentTokenType == #name
- 			ifTrue: [ self parseTemporary: #patternTempVar ]
- 			ifFalse: [ self parseStringOrSymbol ] ].
- 	self failUnless: currentToken = '>'.
- 	self scanPast: #primitiveOrExternalCallEnd!

Item was changed:
+ ----- Method: SHParserST80>>parsePragmaBinary (in category 'parse pragma') -----
- ----- Method: SHParserST80>>parsePragmaBinary (in category 'parse') -----
  parsePragmaBinary
  
  	self scanPast: #pragmaBinary.
  	self currentTokenType == #name
  		ifTrue:[self scanPast: (self resolvePragmaArgument: currentToken)] 
  		ifFalse:[	self parseLiteral: false].
  	self failUnless: currentToken = '>'.
  	self scanPast: #primitiveOrExternalCallEnd!

Item was changed:
+ ----- Method: SHParserST80>>parsePragmaKeyword (in category 'parse pragma') -----
- ----- Method: SHParserST80>>parsePragmaKeyword (in category 'parse') -----
  parsePragmaKeyword
  
  	[self currentTokenType == #keyword]
  		whileTrue:[
  			self scanPast: #pragmaKeyword.
  			self currentTokenType == #name
  				ifTrue:[self scanPast: (self resolvePragmaArgument: currentToken)] 
  				ifFalse:[	self parseLiteral: false]].
  	self failUnless: currentToken = '>'.
  	self scanPast: #primitiveOrExternalCallEnd!

Item was changed:
+ ----- Method: SHParserST80>>parsePragmaSequence (in category 'parse pragma') -----
- ----- Method: SHParserST80>>parsePragmaSequence (in category 'parse') -----
  parsePragmaSequence
+ 
  	[currentToken = '<' ]
+ 		whileTrue: [
- 		whileTrue:[
  			self scanPast: #primitiveOrExternalCallStart.
+ 			self parsePragmaStatement].!
- 			currentToken = 'primitive:' 
- 				ifTrue: [
- 					self addRangeType: #primitive.
- 					self parsePrimitive]
- 				ifFalse:[
- 					self isTokenExternalFunctionCallingConvention 
- 						ifTrue: [
- 							self addRangeType: #externalFunctionCallingConvention.
- 							self parseExternalCall]
- 						ifFalse:[
- 							self currentTokenType
- 								caseOf: {
- 									[ #name ] -> [ 
- 										self scanPast: #pragmaUnary.
- 										self failUnless: currentToken = '>'.
- 										self scanPast: #primitiveOrExternalCallEnd ].
- 									[ #binary ] -> [ self parsePragmaBinary ].
- 									[ #keyword ] -> [ self parsePragmaKeyword ] }
- 								otherwise: [ self fail ": 'Invalid External Function Calling convention'" ] ] ] ]!

Item was added:
+ ----- Method: SHParserST80>>parsePragmaStatement (in category 'parse pragma') -----
+ parsePragmaStatement
+ 
+ 	| parserSelector parserMethod |
+ 	currentToken last == $: ifFalse: [
+ 		"Quick exit to not break one-word pragmas such as <primitive> or <foobar>."
+ 		^ self parsePragmaStatementKeywords].
+ 	
+ 	(self class includesSelector: (parserSelector := currentToken asSimpleGetter)) ifTrue: [
+ 		((parserMethod := self class compiledMethodAt: parserSelector) pragmas
+ 			anySatisfy: [:pragma | pragma keyword == #pragmaParser])
+ 				ifTrue: [^ self executeMethod: parserMethod]].
+ 
+ 	^ self parsePragmaStatementKeywords!

Item was added:
+ ----- Method: SHParserST80>>parsePragmaStatementKeywords (in category 'parse pragma') -----
+ parsePragmaStatementKeywords
+ 			
+ 	self currentTokenType
+ 		caseOf: {
+ 			[ #name ] -> [ 
+ 				self scanPast: #pragmaUnary.
+ 				self failUnless: currentToken = '>'.
+ 				self scanPast: #primitiveOrExternalCallEnd ].
+ 			[ #binary ] -> [ self parsePragmaBinary ].
+ 			[ #keyword ] -> [ self parsePragmaKeyword ] }
+ 		otherwise: [ self fail ": 'Invalid External Function Calling convention'" ]. !

Item was removed:
- ----- Method: SHParserST80>>parsePrimitive (in category 'parse') -----
- parsePrimitive
- 
- 	self scanNext.
- 	currentTokenFirst isDigit
- 		ifTrue: [ self scanPast: #integer ]
- 		ifFalse: [
- 			self parseStringOrSymbol.
- 			currentToken = 'module:' ifTrue: [
- 				self scanPast: #module.
- 				self parseStringOrSymbol ] ].
- 	currentToken = 'error:' ifTrue: [
- 		self scanPast: #primitive. "there's no rangeType for error"
- 		self currentTokenType == #name
- 			ifTrue: [ self parseTemporary: #patternTempVar ]
- 			ifFalse: [ self parseStringOrSymbol ] ].
- 	self failUnless: currentToken = '>'.
- 	self scanPast: #primitiveOrExternalCallEnd!

Item was added:
+ ----- Method: SHParserST80>>primitive (in category 'parse pragma') -----
+ primitive
+ 	"Parse keywords and literals of primitive pragmas differently to emit different range tokens for different UI styling. This hook exists so that packages do not break primitive-pragma parsing by accident. Instead, this method needs to be replaced intentionally."
+ 	<pragmaParser>
+ 
+ 	self addRangeType: #primitive.
+ 
+ 	self scanNext.
+ 	currentTokenFirst isDigit
+ 		ifTrue: [ self scanPast: #integer ]
+ 		ifFalse: [
+ 			self parseStringOrSymbol.
+ 			currentToken = 'module:' ifTrue: [
+ 				self scanPast: #module.
+ 				self parseStringOrSymbol ] ].
+ 	currentToken = 'error:' ifTrue: [
+ 		self scanPast: #primitive. "there's no rangeType for error"
+ 		self currentTokenType == #name
+ 			ifTrue: [ self parseTemporary: #patternTempVar ]
+ 			ifFalse: [ self parseStringOrSymbol ] ].
+ 	self failUnless: currentToken = '>'.
+ 	self scanPast: #primitiveOrExternalCallEnd!



More information about the Squeak-dev mailing list