| ITlabel
| ITdynamic
| ITunsafe
+ | ITstdcallconv
+ | ITccallconv
| ITinterface -- interface keywords
| IT__export
( "label", ITlabel ),
( "dynamic", ITdynamic ),
( "unsafe", ITunsafe ),
+ ( "stdcall", ITstdcallconv),
+ ( "ccall", ITccallconv),
("_ccall_", ITccall (False, False, False)),
("_ccall_GC_", ITccall (False, False, True)),
("_casm_", ITccall (False, True, False)),
, mkRecConstrOrUpdate -- HsExp -> [HsFieldUpdate] -> P HsExp
, groupBindings
+
+ , mkExtName -- Maybe ExtName -> RdrName -> ExtName
, checkPrec -- String -> P String
- , checkCallConv -- FAST_STRING -> P CallConv
, checkContext -- HsType -> P HsContext
, checkInstType -- HsType -> P HsType
, checkAssertion -- HsType -> P HsAsst
-- pseudo-keywords, in var and tyvar forms (all :: RdrName)
, as_var_RDR, hiding_var_RDR, qualified_var_RDR, forall_var_RDR
, export_var_RDR, label_var_RDR, dynamic_var_RDR, unsafe_var_RDR
+ , stdcall_var_RDR, ccall_var_RDR
, as_tyvar_RDR, hiding_tyvar_RDR, qualified_tyvar_RDR
, export_tyvar_RDR, label_tyvar_RDR, dynamic_tyvar_RDR
- , unsafe_tyvar_RDR
+ , unsafe_tyvar_RDR, stdcall_tyvar_RDR, ccall_tyvar_RDR
, minus_RDR, pling_RDR, dot_RDR
import RdrName
import CallConv
import PrelMods ( pRELUDE_Name, mkUbxTupNameStr, mkTupNameStr )
-import OccName ( dataName, tcName, varName, tvName, setOccNameSpace )
+import OccName ( dataName, tcName, varName, tvName, setOccNameSpace, occNameFS )
import CmdLineOpts ( opt_NoImplicitPrelude )
import StringBuffer ( lexemeToString )
import FastString ( unpackFS )
mkRecConstrOrUpdate _ _
= parseError "Empty record update"
+-- supplying the ext_name in a foreign decl is optional ; if it
+-- isn't there, the Haskell name is assumed. Note that no transformation
+-- of the Haskell name is then performed, so if you foreign export (++),
+-- it's external name will be "++". Too bad.
+mkExtName :: Maybe ExtName -> RdrName -> ExtName
+mkExtName Nothing rdrNm = ExtName (occNameFS (rdrNameOcc rdrNm)) Nothing
+mkExtName (Just x) _ = x
+
-----------------------------------------------------------------------------
-- group function bindings into equation groups
labelName = SLIT("label")
dynamicName = SLIT("dynamic")
unsafeName = SLIT("unsafe")
+stdcallName = SLIT("stdcall")
+ccallName = SLIT("ccall")
as_var_RDR = mkSrcUnqual varName asName
hiding_var_RDR = mkSrcUnqual varName hidingName
label_var_RDR = mkSrcUnqual varName labelName
dynamic_var_RDR = mkSrcUnqual varName dynamicName
unsafe_var_RDR = mkSrcUnqual varName unsafeName
+stdcall_var_RDR = mkSrcUnqual varName stdcallName
+ccall_var_RDR = mkSrcUnqual varName ccallName
as_tyvar_RDR = mkSrcUnqual tvName asName
hiding_tyvar_RDR = mkSrcUnqual tvName hidingName
label_tyvar_RDR = mkSrcUnqual tvName labelName
dynamic_tyvar_RDR = mkSrcUnqual tvName dynamicName
unsafe_tyvar_RDR = mkSrcUnqual tvName unsafeName
+stdcall_tyvar_RDR = mkSrcUnqual tvName stdcallName
+ccall_tyvar_RDR = mkSrcUnqual tvName ccallName
minus_RDR = mkSrcUnqual varName SLIT("-")
pling_RDR = mkSrcUnqual varName SLIT("!")
{-
-----------------------------------------------------------------------------
-<<<<<<< Parser.y
-$Id: Parser.y,v 1.13 1999/07/27 09:25:49 simonmar Exp $
-=======
-$Id: Parser.y,v 1.13 1999/07/27 09:25:49 simonmar Exp $
->>>>>>> 1.10
+$Id: Parser.y,v 1.14 1999/09/01 14:08:19 sof Exp $
Haskell grammar.
'label' { ITlabel }
'dynamic' { ITdynamic }
'unsafe' { ITunsafe }
+ 'stdcall' { ITstdcallconv }
+ 'ccall' { ITccallconv }
'_ccall_' { ITccall (False, False, False) }
'_ccall_GC_' { ITccall (False, False, True) }
'_casm_' { ITccall (False, True, False) }
| srcloc 'foreign' 'import' callconv ext_name
unsafe_flag varid_no_unsafe '::' sigtype
- { RdrHsDecl (ForD (ForeignDecl $7 (FoImport $6) $9 $5 $4 $1)) }
+ { RdrHsDecl (ForD (ForeignDecl $7 (FoImport $6) $9 (mkExtName $5 $7) $4 $1)) }
| srcloc 'foreign' 'export' callconv ext_name varid '::' sigtype
- { RdrHsDecl (ForD (ForeignDecl $6 FoExport $8 $5 $4 $1)) }
+ { RdrHsDecl (ForD (ForeignDecl $6 FoExport $8 (mkExtName $5 $6) $4 $1)) }
| srcloc 'foreign' 'label' ext_name varid '::' sigtype
- { RdrHsDecl (ForD (ForeignDecl $5 FoLabel $7 $4
+ { RdrHsDecl (ForD (ForeignDecl $5 FoLabel $7 (mkExtName $4 $5)
defaultCallConv $1)) }
| decl { $1 }
-- Foreign import/export
callconv :: { Int }
- : VARID {% checkCallConv $1 }
+ : 'stdcall' { stdCallConv }
+ | 'ccall' { cCallConv }
| {- empty -} { defaultCallConv }
unsafe_flag :: { Bool }
: 'unsafe' { True }
| {- empty -} { False }
-ext_name :: { ExtName }
- : 'dynamic' { Dynamic }
- | STRING { ExtName $1 Nothing }
- | STRING STRING { ExtName $2 (Just $1) }
+ext_name :: { Maybe ExtName }
+ : 'dynamic' { Just Dynamic }
+ | STRING { Just (ExtName $1 Nothing) }
+ | STRING STRING { Just (ExtName $2 (Just $1)) }
+ | {- empty -} { Nothing }
-----------------------------------------------------------------------------
-- Types
| 'label' { label_var_RDR }
| 'dynamic' { dynamic_var_RDR }
| 'unsafe' { unsafe_var_RDR }
+ | 'stdcall' { stdcall_var_RDR }
+ | 'ccall' { ccall_var_RDR }
varid_no_unsafe :: { RdrName }
: VARID { mkSrcUnqual varName $1 }
| 'export' { export_var_RDR }
| 'label' { label_var_RDR }
| 'dynamic' { dynamic_var_RDR }
+ | 'stdcall' { stdcall_var_RDR }
+ | 'ccall' { ccall_var_RDR }
-----------------------------------------------------------------------------
-- ConIds
| 'as' { as_tyvar_RDR }
| 'qualified' { qualified_tyvar_RDR }
| 'hiding' { hiding_tyvar_RDR }
- | 'export' { export_var_RDR }
- | 'label' { label_var_RDR }
- | 'dynamic' { dynamic_var_RDR }
- | 'unsafe' { unsafe_var_RDR }
+ | 'export' { export_tyvar_RDR }
+ | 'label' { label_tyvar_RDR }
+ | 'dynamic' { dynamic_tyvar_RDR }
+ | 'unsafe' { unsafe_tyvar_RDR }
+ | 'stdcall' { stdcall_tyvar_RDR }
+ | 'ccall' { ccall_tyvar_RDR }
-- NOTE: no 'forall'
-----------------------------------------------------------------------------