[Pkg] The Trunk: Compiler-ar.143.mcz

commits at source.squeak.org commits at source.squeak.org
Tue May 25 03:42:56 UTC 2010


Andreas Raab uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-ar.143.mcz

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

Name: Compiler-ar.143
Author: ar
Time: 24 May 2010, 8:42:36.032 pm
UUID: af1d9aa9-96ff-9e4f-9df9-94e11682c0b4
Ancestors: Compiler-ar.142

Verify the number of arguments in FFI calls.

=============== Diff against Compiler-ar.142 ===============

Item was changed:
  ----- Method: Parser>>externalFunctionDeclaration (in category 'primitives') -----
  externalFunctionDeclaration
  	"Parse the function declaration for a call to an external library."
  	| descriptorClass callType retType externalName args argType module |
  	descriptorClass := Smalltalk at: #ExternalFunction ifAbsent:[nil].
  	descriptorClass == nil ifTrue:[^false].
  	callType := descriptorClass callingConventionFor: here.
  	callType == nil ifTrue:[^false].
  	"Parse return type"
  	self advance.
  	retType := self externalType: descriptorClass.
  	retType == nil ifTrue:[^self expected:'return type'].
  	"Parse function name or index"
  	externalName := here.
  	(self match: #string) 
  		ifTrue:[externalName := externalName asSymbol]
  		ifFalse:[(self match:#number) ifFalse:[^self expected:'function name or index']].
  	(self matchToken: #'(') ifFalse:[^self expected:'argument list'].
  	args := WriteStream on: Array new.
  	[here == #')'] whileFalse:[
  		argType := self externalType: descriptorClass.
  		argType == nil ifTrue:[^self expected:'argument'].
  		argType isVoid & argType isPointerType not ifFalse:[args nextPut: argType].
  	].
+ 	(args position = self properties selector numArgs) ifFalse:[
+ 		^self expected: 'Matching number of arguments'
+ 	].
  	(self matchToken:#')') ifFalse:[^self expected:')'].
  	(self matchToken: 'module:') ifTrue:[
  		module := here.
  		(self match: #string) ifFalse:[^self expected: 'String'].
  		module := module asSymbol].
  	Smalltalk at: #ExternalLibraryFunction ifPresent:[:xfn| | fn |
  		fn := xfn name: externalName 
  				module: module 
  				callType: callType
  				returnType: retType
  				argumentTypes: args contents.
  		self allocateLiteral: fn.
  	].
  	self addPragma: (Pragma keyword: #primitive: arguments: #(120)).
  	^true!



More information about the Packages mailing list