Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Glasgow Haskell Compiler
GHC
Commits
c8b37bf4
Commit
c8b37bf4
authored
Jan 19, 2008
by
Ian Lynagh
Browse files
Support multiple -e flags
parent
fcb512af
Changes
2
Hide whitespace changes
Inline
Side-by-side
compiler/ghci/InteractiveUI.hs
View file @
c8b37bf4
...
...
@@ -280,8 +280,9 @@ findEditor = do
return
""
#
endif
interactiveUI
::
Session
->
[(
FilePath
,
Maybe
Phase
)]
->
Maybe
String
->
IO
()
interactiveUI
session
srcs
maybe_expr
=
do
interactiveUI
::
Session
->
[(
FilePath
,
Maybe
Phase
)]
->
Maybe
[
String
]
->
IO
()
interactiveUI
session
srcs
maybe_exprs
=
do
-- HACK! If we happen to get into an infinite loop (eg the user
-- types 'let x=x in x' at the prompt), then the thread will block
-- on a blackhole, and become unreachable during GC. The GC will
...
...
@@ -297,7 +298,7 @@ interactiveUI session srcs maybe_expr = do
-- Initialise buffering for the *interpreted* I/O system
initInterpBuffering
session
when
(
isNothing
maybe_expr
)
$
do
when
(
isNothing
maybe_expr
s
)
$
do
-- Only for GHCi (not runghc and ghc -e):
-- Turn buffering off for the compiled program's stdout/stderr
...
...
@@ -328,7 +329,7 @@ interactiveUI session srcs maybe_expr = do
default_editor
<-
findEditor
startGHCi
(
runGHCi
srcs
maybe_expr
)
startGHCi
(
runGHCi
srcs
maybe_expr
s
)
GHCiState
{
progname
=
"<interactive>"
,
args
=
[]
,
prompt
=
"%s> "
,
...
...
@@ -351,8 +352,8 @@ interactiveUI session srcs maybe_expr = do
return
()
runGHCi
::
[(
FilePath
,
Maybe
Phase
)]
->
Maybe
String
->
GHCi
()
runGHCi
paths
maybe_expr
=
do
runGHCi
::
[(
FilePath
,
Maybe
Phase
)]
->
Maybe
[
String
]
->
GHCi
()
runGHCi
paths
maybe_expr
s
=
do
let
read_dot_files
=
not
opt_IgnoreDotGhci
when
(
read_dot_files
)
$
do
...
...
@@ -390,7 +391,7 @@ runGHCi paths maybe_expr = do
when
(
not
(
null
paths
))
$
do
ok
<-
ghciHandle
(
\
e
->
do
showException
e
;
return
Failed
)
$
loadModule
paths
when
(
isJust
maybe_expr
&&
failed
ok
)
$
when
(
isJust
maybe_expr
s
&&
failed
ok
)
$
io
(
exitWith
(
ExitFailure
1
))
-- if verbosity is greater than 0, or we are connected to a
...
...
@@ -399,7 +400,7 @@ runGHCi paths maybe_expr = do
dflags
<-
getDynFlags
let
show_prompt
=
verbosity
dflags
>
0
||
is_tty
case
maybe_expr
of
case
maybe_expr
s
of
Nothing
->
do
#
if
defined
(
mingw32_HOST_OS
)
...
...
@@ -415,9 +416,9 @@ runGHCi paths maybe_expr = do
#
endif
-- enter the interactive loop
interactiveLoop
is_tty
show_prompt
Just
expr
->
do
Just
expr
s
->
do
-- just evaluate the expression we were given
enqueueCommands
[
expr
]
enqueueCommands
expr
s
let
handleEval
(
ExitException
code
)
=
io
(
exitWith
code
)
handleEval
e
=
handler
e
runCommands'
handleEval
(
return
Nothing
)
...
...
compiler/main/Main.hs
View file @
c8b37bf4
...
...
@@ -179,7 +179,7 @@ main =
DoMkDependHS
->
doMkDependHS
session
(
map
fst
srcs
)
StopBefore
p
->
oneShot
dflags
p
srcs
DoInteractive
->
interactiveUI
session
srcs
Nothing
DoEval
expr
->
interactiveUI
session
srcs
(
Just
expr
)
DoEval
expr
s
->
interactiveUI
session
srcs
$
Just
$
reverse
expr
s
dumpFinalStats
dflags
exitWith
ExitSuccess
...
...
@@ -316,7 +316,7 @@ data CmdLineMode
-- StopBefore StopLn is the default
|
DoMake
-- ghc --make
|
DoInteractive
-- ghc --interactive
|
DoEval
String
-- ghc -e
|
DoEval
[
String
]
-- ghc -e
foo -e bar => DoEval ["bar", "foo"]
deriving
(
Show
)
isInteractiveMode
,
isInterpretiveMode
::
CmdLineMode
->
Bool
...
...
@@ -386,7 +386,7 @@ mode_flags =
,
(
"S"
,
PassFlag
(
setMode
(
StopBefore
As
)))
,
(
"-make"
,
PassFlag
(
setMode
DoMake
))
,
(
"-interactive"
,
PassFlag
(
setMode
DoInteractive
))
,
(
"e"
,
HasArg
(
\
s
->
setMode
(
DoEval
s
)
"-e"
))
,
(
"e"
,
HasArg
(
\
s
->
updateMode
(
update
DoEval
s
)
"-e"
))
-- -fno-code says to stop after Hsc but don't generate any code.
,
(
"fno-code"
,
PassFlag
(
\
f
->
do
setMode
(
StopBefore
HCc
)
f
...
...
@@ -395,12 +395,19 @@ mode_flags =
]
setMode
::
CmdLineMode
->
String
->
ModeM
()
setMode
m
flag
=
do
setMode
m
flag
=
updateMode
(
\
_
->
m
)
flag
updateDoEval
::
String
->
CmdLineMode
->
CmdLineMode
updateDoEval
expr
(
DoEval
exprs
)
=
DoEval
(
expr
:
exprs
)
updateDoEval
expr
_
=
DoEval
[
expr
]
updateMode
::
(
CmdLineMode
->
CmdLineMode
)
->
String
->
ModeM
()
updateMode
f
flag
=
do
(
old_mode
,
old_flag
,
flags
)
<-
getCmdLineState
if
notNull
old_flag
&&
flag
/=
old_flag
then
throwDyn
(
UsageError
(
"cannot use `"
++
old_flag
++
"' with `"
++
flag
++
"'"
))
else
putCmdLineState
(
m
,
flag
,
flags
)
else
putCmdLineState
(
f
old_mode
,
flag
,
flags
)
addFlag
::
String
->
ModeM
()
addFlag
s
=
do
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment