--- a/Parser.st Tue Dec 18 10:10:44 2007 +0100
+++ b/Parser.st Wed Dec 19 16:32:30 2007 +0100
@@ -7238,10 +7238,10 @@
"Modified: / 25-10-2006 / 11:28:21 / cg"
!
-generateReturnOfType:aType
+generateReturnOfValue:aValue
|node|
- node := ConstantNode type:nil value:aType.
+ node := ConstantNode type:nil value:aValue.
node lineNumber:tokenLineNr.
tree := ReturnNode new expression:node.
tree lineNumber:tokenLineNr.
@@ -7610,28 +7610,24 @@
"parses visualWorks type/function declarations of the form:
'<c: ...>'"
- |cParser functionOrType |
-
- CParser isNil ifTrue:[
- self generateTrapCodeForUnavailableCParser.
- ^ self.
- ].
- functionOrType := PrimitiveSpecParser new
+ |functionOrTypeOrValue|
+
+ functionOrTypeOrValue := PrimitiveSpecParser new
parseVWTypeOrExternalFunctionDeclarationFrom:aStream
definitionType:definitionType
knownDefinitions:dictionaryOfTypesOrNil
lineNr:lineNr
for: self.
- functionOrType isNil ifTrue:[^ self].
-
- (functionOrType isKindOf:ExternalLibraryFunction) ifTrue:[
- self generateReturnOfType:functionOrType.
+ functionOrTypeOrValue isNil ifTrue:[^ self].
+
+ (functionOrTypeOrValue isKindOf:ExternalLibraryFunction) ifFalse:[
+ self generateReturnOfValue:functionOrTypeOrValue.
^ self
].
- functionOrType owningClass:classToCompileFor.
- self generateCallToExternalFunction:functionOrType lineNr:lineNr.
+ functionOrTypeOrValue owningClass:classToCompileFor.
+ self generateCallToExternalFunction:functionOrTypeOrValue lineNr:lineNr.
"Modified: / 01-08-2006 / 16:21:36 / cg"
!
@@ -8860,13 +8856,36 @@
parseVWTypeOrExternalFunctionDeclarationFrom:aStream definitionType:definitionType knownDefinitions:dictionaryOfTypesOrNil lineNr:lineNr for:aParserOrNil
"parses visualWorks type/function declarations of the form:
- '<c: ...>'"
-
- |cParser returnType functionName argTypes moduleName type
+ '<c: ...>'
+ '<c: #define NAME value>'"
+
+ |cParser moduleName type name
nameAndFunctionOrType functionOrType function |
masterParser := aParserOrNil.
+ self source:aStream.
+ self nextToken.
+ ((tokenType == #Symbol) and:[token = #define]) ifTrue:[
+ self nextToken.
+ (tokenType == #Identifier) ifFalse:[
+ (masterParser ? self) ignorableParseError:'invalid cdecl - identifier expected'.
+ self generateTrapCodeForUnavailableCParser.
+ ^ nil.
+ ].
+ name := token.
+ self nextToken.
+ "/ for now, only allow integer, string or floats.
+ (#(Integer String Float) includes:tokenType) ifTrue:[
+ ^ token
+ ].
+ (masterParser ? self) ignorableParseError:'invalid cdecl - integer, float or string expected'.
+ self generateTrapCodeForUnavailableCParser.
+ ^ nil.
+ ].
+
+ aStream reset.
+
CParser isNil ifTrue:[
self generateTrapCodeForUnavailableCParser.
^ nil.
@@ -8877,7 +8896,7 @@
cParser allowRedefinitions:true.
cParser source:aStream scannerClass:CDeclScanner.
cParser nextToken.
-
+self halt.
cParser tokenType == #struct ifTrue:[
type := cParser type.
] ifFalse:[
@@ -9062,7 +9081,7 @@
!Parser class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.554 2007-12-18 09:10:44 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.555 2007-12-19 15:32:30 cg Exp $'
! !
Parser initialize!