summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>1997-03-05 14:38:24 +0000
committerXavier Leroy <xavier.leroy@inria.fr>1997-03-05 14:38:24 +0000
commit47e3d97f993f5132acc2a4059eae18196480c6a2 (patch)
treea26eaf7e3015ad7fc24280eb894eec55e55cdd31
parente4ff50278e13a6f62bdfa0e1dd7303c10a43d711 (diff)
lexing.ml: refill_buffer rendu reentrant.
weak.ml: utiliser Obj.size au lieu de Array.length pour determiner la taille. git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@1323 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r--stdlib/lexing.ml24
-rw-r--r--stdlib/weak.ml6
2 files changed, 13 insertions, 17 deletions
diff --git a/stdlib/lexing.ml b/stdlib/lexing.ml
index b1c57db20..810022e27 100644
--- a/stdlib/lexing.ml
+++ b/stdlib/lexing.ml
@@ -33,15 +33,13 @@ type lex_tables =
external engine: lex_tables -> int -> lexbuf -> int = "lex_engine"
-let lex_aux_buffer = String.create 1024
-
-let lex_refill read_fun lexbuf =
+let lex_refill read_fun aux_buffer lexbuf =
let read =
- read_fun lex_aux_buffer 1024 in
+ read_fun aux_buffer (String.length aux_buffer) in
let n =
if read > 0
then read
- else (String.unsafe_set lex_aux_buffer 0 '\000'; 1) in
+ else (String.unsafe_set aux_buffer 0 '\000'; 1) in
if lexbuf.lex_start_pos < n then begin
let oldlen = lexbuf.lex_buffer_len in
let newlen = oldlen * 2 in
@@ -57,7 +55,7 @@ let lex_refill read_fun lexbuf =
String.unsafe_blit lexbuf.lex_buffer n
lexbuf.lex_buffer 0
(lexbuf.lex_buffer_len - n);
- String.unsafe_blit lex_aux_buffer 0
+ String.unsafe_blit aux_buffer 0
lexbuf.lex_buffer (lexbuf.lex_buffer_len - n)
n;
lexbuf.lex_abs_pos <- lexbuf.lex_abs_pos + n;
@@ -66,13 +64,13 @@ let lex_refill read_fun lexbuf =
lexbuf.lex_last_pos <- lexbuf.lex_last_pos - n
let from_function f =
- { refill_buff = lex_refill f;
- lex_buffer = String.create 2048;
- lex_buffer_len = 2048;
- lex_abs_pos = - 2048;
- lex_start_pos = 2048;
- lex_curr_pos = 2048;
- lex_last_pos = 2048;
+ { refill_buff = lex_refill f (String.create 512);
+ lex_buffer = String.create 1024;
+ lex_buffer_len = 1024;
+ lex_abs_pos = - 1024;
+ lex_start_pos = 1024;
+ lex_curr_pos = 1024;
+ lex_last_pos = 1024;
lex_saved_state = -1;
lex_last_action = 0 }
diff --git a/stdlib/weak.ml b/stdlib/weak.ml
index e7f5245b0..09ecd6029 100644
--- a/stdlib/weak.ml
+++ b/stdlib/weak.ml
@@ -13,13 +13,11 @@
(* Weak array operations *)
-(* WARNING: the following declaration is not type-safe. *)
-
-type 'a t = 'a array;;
+type 'a t
external create: int -> 'a t = "weak_create";;
-let length x = Array.length x - 1;;
+let length x = Obj.size(Obj.repr x) - 1;;
external set : 'a t -> int -> 'a option -> unit = "weak_set";;