Parser.st
changeset 2051 91c2cbbfcacd
parent 2050 a85b9094d002
child 2052 8460eb468d03
--- 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!