summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
authorIan Lynagh <igloo@earth.li>2012-04-27 15:14:47 +0100
committerIan Lynagh <igloo@earth.li>2012-04-27 15:14:47 +0100
commit26d690a3eb753a5eec3e10b42ad4979556f605b3 (patch)
tree728c201cf2b3527117a546a48958f0d98ce3ad11 /rts
parentf18db3bb0ad4b1e319637df5dddaef88d9d07a37 (diff)
parent4ca281829c70331571291ed3dcf813a6028cc904 (diff)
downloadhaskell-26d690a3eb753a5eec3e10b42ad4979556f605b3.tar.gz
Merge branch 'master' of darcs.haskell.org:/srv/darcs//ghc
Diffstat (limited to 'rts')
-rw-r--r--rts/Linker.c1
-rw-r--r--rts/PrimOps.cmm16
-rw-r--r--rts/RtsStartup.c9
3 files changed, 20 insertions, 6 deletions
diff --git a/rts/Linker.c b/rts/Linker.c
index 7a1f550a4b..4fb8e621c4 100644
--- a/rts/Linker.c
+++ b/rts/Linker.c
@@ -294,6 +294,7 @@ typedef struct _RtsSymbolVal {
} RtsSymbolVal;
#define Maybe_Stable_Names SymI_HasProto(stg_mkWeakzh) \
+ SymI_HasProto(stg_mkWeakNoFinalizzerzh) \
SymI_HasProto(stg_mkWeakForeignEnvzh) \
SymI_HasProto(stg_makeStableNamezh) \
SymI_HasProto(stg_finalizzeWeakzh)
diff --git a/rts/PrimOps.cmm b/rts/PrimOps.cmm
index aaedabb951..93ef23a71e 100644
--- a/rts/PrimOps.cmm
+++ b/rts/PrimOps.cmm
@@ -384,14 +384,10 @@ stg_mkWeakzh
{
/* R1 = key
R2 = value
- R3 = finalizer (or NULL)
+ R3 = finalizer (or stg_NO_FINALIZER_closure)
*/
W_ w;
- if (R3 == NULL) {
- R3 = stg_NO_FINALIZER_closure;
- }
-
ALLOC_PRIM( SIZEOF_StgWeak, R1_PTR & R2_PTR & R3_PTR, stg_mkWeakzh );
w = Hp - SIZEOF_StgWeak + WDS(1);
@@ -416,6 +412,16 @@ stg_mkWeakzh
RET_P(w);
}
+stg_mkWeakNoFinalizzerzh
+{
+ /* R1 = key
+ R2 = value
+ */
+ R3 = stg_NO_FINALIZER_closure;
+
+ jump stg_mkWeakzh;
+}
+
stg_mkWeakForeignEnvzh
{
/* R1 = key
diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c
index 4b9f6ba115..307a691352 100644
--- a/rts/RtsStartup.c
+++ b/rts/RtsStartup.c
@@ -141,7 +141,14 @@ hs_init_ghc(int *argc, char **argv[], RtsConfig rts_config)
defaultsHook();
/* Parse the flags, separating the RTS flags from the programs args */
- if (argc != NULL && argv != NULL) {
+ if (argc == NULL || argv == NULL) {
+ // Use a default for argc & argv if either is not supplied
+ int my_argc = 1;
+ char *my_argv[] = { "<unknown>", NULL };
+ setFullProgArgv(my_argc,my_argv);
+ setupRtsFlags(&my_argc, my_argv,
+ rts_config.rts_opts_enabled, rts_config.rts_opts);
+ } else {
setFullProgArgv(*argc,*argv);
setupRtsFlags(argc, *argv,
rts_config.rts_opts_enabled, rts_config.rts_opts);