summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/urweb/urweb.h3
-rw-r--r--src/c/urweb.c30
-rw-r--r--src/cjr_print.sml29
-rw-r--r--tests/longConst.ur12
-rw-r--r--tests/longConst.urp2
5 files changed, 62 insertions, 14 deletions
diff --git a/include/urweb/urweb.h b/include/urweb/urweb.h
index 7320eb12..21c8bc88 100644
--- a/include/urweb/urweb.h
+++ b/include/urweb/urweb.h
@@ -360,4 +360,7 @@ uw_Basis_string uw_Basis_atom(uw_context, uw_Basis_string);
uw_Basis_string uw_Basis_css_url(uw_context, uw_Basis_string);
uw_Basis_string uw_Basis_property(uw_context, uw_Basis_string);
+void uw_begin_initializing(uw_context);
+void uw_end_initializing(uw_context);
+
#endif
diff --git a/src/c/urweb.c b/src/c/urweb.c
index 802a1620..d0b6987c 100644
--- a/src/c/urweb.c
+++ b/src/c/urweb.c
@@ -465,6 +465,8 @@ struct uw_context {
unsigned nextId;
+ int amInitializing;
+
char error_message[ERROR_BUF_LEN];
};
@@ -536,6 +538,8 @@ uw_context uw_init(int id, void *logger_data, uw_logger log_debug) {
ctx->nextId = 0;
+ ctx->amInitializing = 0;
+
return ctx;
}
@@ -613,6 +617,7 @@ void uw_reset_keep_error_message(uw_context ctx) {
ctx->script_header = "";
ctx->queryString = NULL;
ctx->nextId = 0;
+ ctx->amInitializing = 0;
}
void uw_reset_keep_request(uw_context ctx) {
@@ -1204,14 +1209,31 @@ void uw_set_heap_front(uw_context ctx, char *fr) {
ctx->heap.front = fr;
}
+void uw_begin_initializing(uw_context ctx) {
+ ctx->amInitializing = 1;
+}
+
+void uw_end_initializing(uw_context ctx) {
+ ctx->amInitializing = 0;
+}
+
void *uw_malloc(uw_context ctx, size_t len) {
void *result;
- uw_check_heap(ctx, len);
+ if (ctx->amInitializing) {
+ result = malloc(len);
- result = ctx->heap.front;
- ctx->heap.front += len;
- return result;
+ if (result)
+ return result;
+ else
+ uw_error(ctx, FATAL, "uw_malloc: malloc() returns 0");
+ } else {
+ uw_check_heap(ctx, len);
+
+ result = ctx->heap.front;
+ ctx->heap.front += len;
+ return result;
+ }
}
void uw_begin_region(uw_context ctx) {
diff --git a/src/cjr_print.sml b/src/cjr_print.sml
index 5c087fe0..c7be5526 100644
--- a/src/cjr_print.sml
+++ b/src/cjr_print.sml
@@ -2320,6 +2320,8 @@ fun p_fun isRec env (fx, n, args, ran, e) =
string "}"]
end
+val global_initializers : Print.PD.pp_desc list ref = ref []
+
fun p_decl env (dAll as (d, _) : decl) =
case d of
DStruct (n, xts) =>
@@ -2414,14 +2416,15 @@ fun p_decl env (dAll as (d, _) : decl) =
| DDatatypeForward _ => box []
| DVal (x, n, t, e) =>
- box [p_typ env t,
- space,
- string ("__uwn_" ^ ident x ^ "_" ^ Int.toString n),
- space,
- string "=",
- space,
- p_exp env e,
- string ";"]
+ (global_initializers := box [string ("__uwn_" ^ ident x ^ "_" ^ Int.toString n),
+ space,
+ string "=",
+ space,
+ p_exp env e,
+ string ";"] :: !global_initializers;
+ box [p_typ env t,
+ space,
+ string ("__uwn_" ^ ident x ^ "_" ^ Int.toString n ^ ";")])
| DFun vi => p_fun false env vi
| DFunRec vis =>
let
@@ -2565,7 +2568,8 @@ fun p_file env (ds, ps) =
unurlifies := IS.empty;
urlifies := IS.empty;
urlifiesL := IS.empty;
- self := NONE)
+ self := NONE;
+ global_initializers := [])
val (pds, env) = ListUtil.foldlMap (fn (d, env) =>
let
@@ -3474,7 +3478,12 @@ fun p_file env (ds, ps) =
newline,
string "static void uw_initializer(uw_context ctx) {",
newline,
- box [p_list_sep (box []) (fn (x1, x2, e) => box [string "({",
+ box [string "uw_begin_initializing(ctx);",
+ newline,
+ p_list_sep newline (fn x => x) (rev (!global_initializers)),
+ string "uw_end_initializing(ctx);",
+ newline,
+ p_list_sep (box []) (fn (x1, x2, e) => box [string "({",
newline,
string "uw_unit __uwr_",
string x1,
diff --git a/tests/longConst.ur b/tests/longConst.ur
new file mode 100644
index 00000000..d81e2ad9
--- /dev/null
+++ b/tests/longConst.ur
@@ -0,0 +1,12 @@
+val ls = 1 :: 2 :: 3 :: 4 :: 5 :: 6
+ :: 1 :: 2 :: 3 :: 4 :: 5 :: 6
+ :: 1 :: 2 :: 3 :: 4 :: 5 :: 6
+ :: 1 :: 2 :: 3 :: 4 :: 5 :: 6
+ :: 1 :: 2 :: 3 :: 4 :: 5 :: 6
+ :: 1 :: 2 :: 3 :: 4 :: 5 :: 6
+ :: []
+
+fun main () : transaction page = return <xml><body>
+ {List.mapX txt ls}<br/>
+ {List.mapX txt ls}
+</body></xml>
diff --git a/tests/longConst.urp b/tests/longConst.urp
new file mode 100644
index 00000000..0710a6fa
--- /dev/null
+++ b/tests/longConst.urp
@@ -0,0 +1,2 @@
+$/list
+longConst