@@ -23,8 +23,6 @@ module String = Misc.Stdlib.String
23
23
type error =
24
24
| Invalid_character of char * string
25
25
| Bad_compilation_unit_name of string
26
- | Child_of_instance of { child_name : string }
27
- | Packed_instance of { name : string }
28
26
29
27
exception Error of error
30
28
@@ -172,56 +170,46 @@ end = struct
172
170
end
173
171
174
172
module T0 : sig
175
- type descr = private
176
- { name : Name .t ;
177
- for_pack_prefix : Prefix .t ;
178
- arguments : (Name .t * t ) list
179
- }
180
-
181
- and t
173
+ type t
182
174
183
- val descr : t -> descr
175
+ val for_pack_prefix_and_name : t -> Prefix .t * Name .t
184
176
185
177
val name : t -> Name .t
186
178
187
179
val for_pack_prefix : t -> Prefix .t
188
180
189
- val arguments : t -> (Name. t * t ) list
190
-
191
- val create_full : Prefix. t -> Name. t -> (Name. t * t ) list -> t
181
+ val create : Prefix .t -> Name .t -> t
192
182
end = struct
193
- (* As with [Name.t], changing [descr ] or [t] requires bumping magic
183
+ (* As with [Name.t], changing [with_prefix ] or [t] requires bumping magic
194
184
numbers. *)
195
- type descr =
185
+ type with_prefix =
196
186
{ name : Name .t ;
197
- for_pack_prefix : Prefix .t ;
198
- arguments : (Name .t * t ) list
187
+ for_pack_prefix : Prefix .t
199
188
}
200
189
201
- (* type t = Simple of Name.t [@@unboxed] | Full of descr *)
202
- and t = Obj. t
190
+ (* type t = Without_prefix of Name.t [@@unboxed] | With_prefix of
191
+ with_prefix *)
192
+ type t = Obj .t
203
193
204
194
(* Some manual inlining is done here to ensure good performance under
205
195
Closure. *)
206
196
207
- let descr t =
197
+ let for_pack_prefix_and_name t =
208
198
let tag = Obj. tag t in
209
199
assert (tag = 0 || tag = Obj. string_tag);
210
200
if tag <> 0
211
- then
212
- { name = Sys. opaque_identity (Obj. obj t : Name.t );
213
- for_pack_prefix = Prefix. empty;
214
- arguments = []
215
- }
216
- else Sys. opaque_identity (Obj. obj t : descr )
201
+ then Prefix. empty, Sys. opaque_identity (Obj. obj t : Name.t )
202
+ else
203
+ let with_prefix = Sys. opaque_identity (Obj. obj t : with_prefix ) in
204
+ with_prefix.for_pack_prefix, with_prefix.name
217
205
218
206
let name t =
219
207
let tag = Obj. tag t in
220
208
assert (tag = 0 || tag = Obj. string_tag);
221
209
if tag <> 0
222
210
then Sys. opaque_identity (Obj. obj t : Name.t )
223
211
else
224
- let with_prefix = Sys. opaque_identity (Obj. obj t : descr ) in
212
+ let with_prefix = Sys. opaque_identity (Obj. obj t : with_prefix ) in
225
213
with_prefix.name
226
214
227
215
let for_pack_prefix t =
@@ -230,55 +218,26 @@ end = struct
230
218
if tag <> 0
231
219
then Prefix. empty
232
220
else
233
- let descr = Sys. opaque_identity (Obj. obj t : descr ) in
234
- descr.for_pack_prefix
235
-
236
- let arguments t =
237
- let tag = Obj. tag t in
238
- assert (tag = 0 || tag = Obj. string_tag);
239
- if tag <> 0
240
- then []
241
- else
242
- let descr = Sys. opaque_identity (Obj. obj t : descr ) in
243
- descr.arguments
221
+ let with_prefix = Sys. opaque_identity (Obj. obj t : with_prefix ) in
222
+ with_prefix.for_pack_prefix
244
223
245
- let create_full for_pack_prefix name arguments =
224
+ let create for_pack_prefix name =
246
225
let empty_prefix = Prefix. is_empty for_pack_prefix in
247
- let empty_arguments = match arguments with [] -> true | _ -> false in
248
226
let () =
249
227
if not empty_prefix
250
228
then (
251
- let () =
252
- if not empty_arguments
253
- then
254
- (* CR-someday lmaurer: [for_pack_prefix] and [arguments] would make
255
- for better output but it doesn't seem worth moving both [error]
256
- and [print] to before this point *)
257
- raise (Error (Packed_instance { name = name |> Name. to_string }))
258
- in
259
229
Name. check_as_path_component name;
260
230
ListLabels. iter ~f: Name. check_as_path_component
261
231
(for_pack_prefix |> Prefix. to_list))
262
232
in
263
- let arguments =
264
- ListLabels. sort
265
- ~cmp: (fun (p1 , _v1 ) (p2 , _v2 ) -> Name. compare p1 p2)
266
- arguments
267
- in
268
- if empty_prefix && empty_arguments
233
+ if empty_prefix
269
234
then Sys. opaque_identity (Obj. repr name)
270
- else Sys. opaque_identity (Obj. repr { for_pack_prefix; name; arguments })
235
+ else Sys. opaque_identity (Obj. repr { for_pack_prefix; name })
271
236
end
272
237
273
238
include T0
274
239
275
- let create prefix name = create_full prefix name []
276
-
277
240
let create_child parent name_ =
278
- if not (Prefix. is_empty (for_pack_prefix parent))
279
- then
280
- (* CR-someday lmaurer: Same as for [create_full] *)
281
- raise (Error (Child_of_instance { child_name = name_ |> Name. to_string }));
282
241
let prefix =
283
242
(for_pack_prefix parent |> Prefix. to_list) @ [name parent] |> Prefix. of_list
284
243
in
@@ -294,10 +253,6 @@ let of_string str =
294
253
Prefix. empty, Name. of_string str
295
254
| Some _ -> Misc. fatal_errorf " [of_string] does not parse qualified names"
296
255
in
297
- let () =
298
- if String. contains str '['
299
- then Misc. fatal_error " [of_string] does not parse instances"
300
- in
301
256
create for_pack_prefix name
302
257
303
258
let dummy = create Prefix. empty (Name. of_string " *none*" )
@@ -313,67 +268,30 @@ let is_packed t = not (Prefix.is_empty (for_pack_prefix t))
313
268
include Identifiable. Make (struct
314
269
type nonrec t = t
315
270
316
- let rec compare t1 t2 =
271
+ let compare t1 t2 =
317
272
if t1 == t2
318
273
then 0
319
274
else
320
- let { for_pack_prefix = for_pack_prefix1;
321
- name = name1;
322
- arguments = args1
323
- } =
324
- descr t1
325
- in
326
- let { for_pack_prefix = for_pack_prefix2;
327
- name = name2;
328
- arguments = args2
329
- } =
330
- descr t2
331
- in
275
+ let for_pack_prefix1, name1 = for_pack_prefix_and_name t1 in
276
+ let for_pack_prefix2, name2 = for_pack_prefix_and_name t2 in
332
277
let c = Name. compare name1 name2 in
333
- if c <> 0
334
- then c
335
- else
336
- let c = Prefix. compare for_pack_prefix1 for_pack_prefix2 in
337
- if c <> 0 then c else List. compare compare_args args1 args2
338
-
339
- and compare_args (param1 , value1 ) (param2 , value2 ) =
340
- let c = Name. compare param1 param2 in
341
- if c <> 0 then c else compare value1 value2
278
+ if c <> 0 then c else Prefix. compare for_pack_prefix1 for_pack_prefix2
342
279
343
280
let equal x y = if x == y then true else compare x y = 0
344
281
345
- let rec print fmt t =
346
- let { for_pack_prefix; name; arguments } = descr t in
347
- let () =
348
- if Prefix. is_empty for_pack_prefix
349
- then Format. fprintf fmt " %a" Name. print name
350
- else
351
- Format. fprintf fmt " %a.%a" Prefix. print for_pack_prefix Name. print name
352
- in
353
- ListLabels. iter ~f: (print_arg fmt) arguments
354
-
355
- and print_arg fmt (param , value ) =
356
- Format. fprintf fmt " [%a:%a]" Name. print param print value
282
+ let print fmt t =
283
+ let for_pack_prefix, name = for_pack_prefix_and_name t in
284
+ if Prefix. is_empty for_pack_prefix
285
+ then Format. fprintf fmt " %a" Name. print name
286
+ else Format. fprintf fmt " %a.%a" Prefix. print for_pack_prefix Name. print name
357
287
358
288
let output = output_of_print print
359
289
360
- let rec hash t =
361
- let { for_pack_prefix; name; arguments } = descr t in
362
- Hashtbl. hash
363
- ( Name. hash name,
364
- Prefix. hash for_pack_prefix,
365
- ListLabels. map ~f: hash_arg arguments )
366
-
367
- and hash_arg (param , value ) = Hashtbl. hash (param, hash value)
290
+ let hash t =
291
+ let for_pack_prefix, name = for_pack_prefix_and_name t in
292
+ Hashtbl. hash (Name. hash name, Prefix. hash for_pack_prefix)
368
293
end )
369
294
370
- let is_instance t = match arguments t with [] -> false | _ :: _ -> true
371
-
372
- let create_instance t args =
373
- if is_instance t
374
- then Misc. fatal_errorf " @[<hov 1>Already an instance:@ %a@]" print t;
375
- create_full (for_pack_prefix t) (name t) args
376
-
377
295
let full_path t = Prefix. to_list (for_pack_prefix t) @ [name t]
378
296
379
297
let is_parent t ~child =
0 commit comments