Skip to content

Commit a779c27

Browse files
committed
---
yaml --- r: 1942 b: refs/heads/master c: 3945ace h: refs/heads/master v: v3
1 parent f55e5b1 commit a779c27

File tree

4 files changed

+112
-41
lines changed

4 files changed

+112
-41
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 6a60cb1e0cf4bdc37e78c0560e6fed0743a9c271
2+
refs/heads/master: 3945ace520ff93e6edc03c75141cfaff3fbb832c

trunk/src/comp/front/creader.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -275,8 +275,7 @@ impure fn resolve_path(vec[ast.ident] path, vec[u8] data) -> resolve_result {
275275
ebml.move_to_parent(ebml_r);
276276
auto nm = _str.unsafe_from_bytes(name_data);
277277
name_opt = some[ast.ident](nm);
278-
} else if (inner_tag.id ==
279-
metadata.tag_items_def_id) {
278+
} else if (inner_tag.id == metadata.tag_def_id) {
280279
ebml.move_to_first_child(ebml_r);
281280
auto did_data = ebml.read_data(ebml_r);
282281
ebml.move_to_parent(ebml_r);
@@ -336,13 +335,12 @@ impure fn move_to_item(&ebml.reader ebml_r, int item_id) {
336335

337336
while (ebml.bytes_left(ebml_r) > 0u) {
338337
auto inner_ebml_tag = ebml.peek(ebml_r);
339-
if (inner_ebml_tag.id == metadata.tag_items_item) {
338+
if (inner_ebml_tag.id == metadata.tag_items_data_item) {
340339
ebml.move_to_first_child(ebml_r);
341340

342341
while (ebml.bytes_left(ebml_r) > 0u) {
343342
auto innermost_ebml_tag = ebml.peek(ebml_r);
344-
if (innermost_ebml_tag.id ==
345-
metadata.tag_items_def_id) {
343+
if (innermost_ebml_tag.id == metadata.tag_def_id) {
346344
ebml.move_to_first_child(ebml_r);
347345
auto did_data = ebml.read_data(ebml_r);
348346
ebml.move_to_parent(ebml_r);
@@ -408,7 +406,7 @@ impure fn get_item_kind(&ebml.reader ebml_r) -> u8 {
408406
ret data.(0);
409407
}
410408
auto f = converter;
411-
ret get_item_generic[u8](ebml_r, metadata.tag_items_kind, f);
409+
ret get_item_generic[u8](ebml_r, metadata.tag_items_data_item_kind, f);
412410
}
413411

414412
impure fn get_item_symbol(&ebml.reader ebml_r) -> str {
@@ -418,7 +416,7 @@ impure fn get_item_symbol(&ebml.reader ebml_r) -> str {
418416
ret _str.unsafe_from_bytes(data);
419417
}
420418
auto f = converter;
421-
ret get_item_generic[str](ebml_r, metadata.tag_items_symbol, f);
419+
ret get_item_generic[str](ebml_r, metadata.tag_items_data_item_symbol, f);
422420
}
423421

424422
// FIXME: This is a *terrible* botch.
@@ -430,7 +428,8 @@ impure fn impure_parse_def_id(vec[u8] data) -> ast.def_id {
430428

431429
impure fn get_variant_tag_id(&ebml.reader ebml_r) -> ast.def_id {
432430
auto f = impure_parse_def_id;
433-
ret get_item_generic[ast.def_id](ebml_r, metadata.tag_items_tag_id, f);
431+
ret get_item_generic[ast.def_id](ebml_r,
432+
metadata.tag_items_data_item_tag_id, f);
434433
}
435434

436435
impure fn get_item_type(&ebml.reader ebml_r, int this_cnum) -> @ty.t {
@@ -448,15 +447,15 @@ impure fn get_item_type(&ebml.reader ebml_r, int this_cnum) -> @ty.t {
448447
ret parse_ty_str(s, bind parse_external_def_id(this_cnum, _));
449448
}
450449
auto f = bind converter(this_cnum, _);
451-
ret get_item_generic[@ty.t](ebml_r, metadata.tag_items_type, f);
450+
ret get_item_generic[@ty.t](ebml_r, metadata.tag_items_data_item_type, f);
452451
}
453452

454453
impure fn get_item_ty_params(&ebml.reader ebml_r, int this_cnum)
455454
-> vec[ast.def_id] {
456455
let vec[ast.def_id] tps = vec();
457456
while (ebml.bytes_left(ebml_r) > 0u) {
458457
auto ebml_tag = ebml.peek(ebml_r);
459-
if (ebml_tag.id == metadata.tag_items_ty_param) {
458+
if (ebml_tag.id == metadata.tag_items_data_item_ty_param) {
460459
ebml.move_to_first_child(ebml_r);
461460

462461
auto data = ebml.read_data(ebml_r);

trunk/src/comp/middle/metadata.rs

Lines changed: 100 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import std._str;
2+
import std._uint;
23
import std._vec;
34
import std.ebml;
45
import std.io;
@@ -22,15 +23,23 @@ const uint tag_paths_name = 0x03u;
2223
const uint tag_paths_item = 0x04u;
2324
const uint tag_paths_mod = 0x05u;
2425

25-
const uint tag_items_item = 0x06u;
26-
const uint tag_items_def_id = 0x07u;
27-
const uint tag_items_kind = 0x08u;
28-
const uint tag_items_ty_param = 0x09u;
29-
const uint tag_items_type = 0x0au;
30-
const uint tag_items_symbol = 0x0bu;
31-
const uint tag_items_variant = 0x0cu;
32-
const uint tag_items_tag_id = 0x0du;
33-
const uint tag_items_obj_type_id = 0x0eu;
26+
const uint tag_def_id = 0x06u;
27+
28+
const uint tag_items_data = 0x07u;
29+
const uint tag_items_data_item = 0x08u;
30+
const uint tag_items_data_item_kind = 0x09u;
31+
const uint tag_items_data_item_ty_param = 0x0au;
32+
const uint tag_items_data_item_type = 0x0bu;
33+
const uint tag_items_data_item_symbol = 0x0cu;
34+
const uint tag_items_data_item_variant = 0x0du;
35+
const uint tag_items_data_item_tag_id = 0x0eu;
36+
const uint tag_items_data_item_obj_type_id = 0x0fu;
37+
38+
const uint tag_items_index = 0x10u;
39+
const uint tag_items_index_buckets = 0x11u;
40+
const uint tag_items_index_buckets_bucket = 0x12u;
41+
const uint tag_items_index_buckets_bucket_elt = 0x13u;
42+
const uint tag_items_index_table = 0x14u;
3443

3544
// Type encoding
3645

@@ -161,7 +170,7 @@ fn encode_name(&ebml.writer ebml_w, str name) {
161170
}
162171

163172
fn encode_def_id(&ebml.writer ebml_w, &ast.def_id id) {
164-
ebml.start_tag(ebml_w, tag_items_def_id);
173+
ebml.start_tag(ebml_w, tag_def_id);
165174
ebml_w.writer.write(_str.bytes(def_to_str(id)));
166175
ebml.end_tag(ebml_w);
167176
}
@@ -259,7 +268,7 @@ fn encode_item_paths(&ebml.writer ebml_w, @ast.crate crate) {
259268
// Item info table encoding
260269

261270
fn encode_kind(&ebml.writer ebml_w, u8 c) {
262-
ebml.start_tag(ebml_w, tag_items_kind);
271+
ebml.start_tag(ebml_w, tag_items_data_item_kind);
263272
ebml_w.writer.write(vec(c));
264273
ebml.end_tag(ebml_w);
265274
}
@@ -271,40 +280,40 @@ fn def_to_str(ast.def_id did) -> str {
271280
// TODO: We need to encode the "crate numbers" somewhere for diamond imports.
272281
fn encode_type_params(&ebml.writer ebml_w, vec[ast.ty_param] tps) {
273282
for (ast.ty_param tp in tps) {
274-
ebml.start_tag(ebml_w, tag_items_ty_param);
283+
ebml.start_tag(ebml_w, tag_items_data_item_ty_param);
275284
ebml_w.writer.write(_str.bytes(def_to_str(tp.id)));
276285
ebml.end_tag(ebml_w);
277286
}
278287
}
279288

280289
fn encode_type(&ebml.writer ebml_w, @ty.t typ) {
281-
ebml.start_tag(ebml_w, tag_items_type);
290+
ebml.start_tag(ebml_w, tag_items_data_item_type);
282291
auto f = def_to_str;
283292
ebml_w.writer.write(_str.bytes(ty_str(typ, f)));
284293
ebml.end_tag(ebml_w);
285294
}
286295

287296
fn encode_symbol(@trans.crate_ctxt cx, &ebml.writer ebml_w, ast.def_id did) {
288-
ebml.start_tag(ebml_w, tag_items_symbol);
297+
ebml.start_tag(ebml_w, tag_items_data_item_symbol);
289298
ebml_w.writer.write(_str.bytes(cx.item_symbols.get(did)));
290299
ebml.end_tag(ebml_w);
291300
}
292301

293302
fn encode_discriminant(@trans.crate_ctxt cx, &ebml.writer ebml_w,
294303
ast.def_id did) {
295-
ebml.start_tag(ebml_w, tag_items_symbol);
304+
ebml.start_tag(ebml_w, tag_items_data_item_symbol);
296305
ebml_w.writer.write(_str.bytes(cx.discrim_symbols.get(did)));
297306
ebml.end_tag(ebml_w);
298307
}
299308

300309
fn encode_tag_id(&ebml.writer ebml_w, &ast.def_id id) {
301-
ebml.start_tag(ebml_w, tag_items_tag_id);
310+
ebml.start_tag(ebml_w, tag_items_data_item_tag_id);
302311
ebml_w.writer.write(_str.bytes(def_to_str(id)));
303312
ebml.end_tag(ebml_w);
304313
}
305314

306315
fn encode_obj_type_id(&ebml.writer ebml_w, &ast.def_id id) {
307-
ebml.start_tag(ebml_w, tag_items_obj_type_id);
316+
ebml.start_tag(ebml_w, tag_items_data_item_obj_type_id);
308317
ebml_w.writer.write(_str.bytes(def_to_str(id)));
309318
ebml.end_tag(ebml_w);
310319
}
@@ -313,7 +322,7 @@ fn encode_obj_type_id(&ebml.writer ebml_w, &ast.def_id id) {
313322
fn encode_tag_variant_info(@trans.crate_ctxt cx, &ebml.writer ebml_w,
314323
ast.def_id did, vec[ast.variant] variants) {
315324
for (ast.variant variant in variants) {
316-
ebml.start_tag(ebml_w, tag_items_item);
325+
ebml.start_tag(ebml_w, tag_items_data_item);
317326
encode_def_id(ebml_w, variant.node.id);
318327
encode_kind(ebml_w, 'v' as u8);
319328
encode_tag_id(ebml_w, did);
@@ -330,15 +339,15 @@ fn encode_info_for_item(@trans.crate_ctxt cx, &ebml.writer ebml_w,
330339
@ast.item item) {
331340
alt (item.node) {
332341
case (ast.item_const(_, _, _, ?did, ?ann)) {
333-
ebml.start_tag(ebml_w, tag_items_item);
342+
ebml.start_tag(ebml_w, tag_items_data_item);
334343
encode_def_id(ebml_w, did);
335344
encode_kind(ebml_w, 'c' as u8);
336345
encode_type(ebml_w, trans.node_ann_type(cx, ann));
337346
encode_symbol(cx, ebml_w, did);
338347
ebml.end_tag(ebml_w);
339348
}
340349
case (ast.item_fn(_, _, ?tps, ?did, ?ann)) {
341-
ebml.start_tag(ebml_w, tag_items_item);
350+
ebml.start_tag(ebml_w, tag_items_data_item);
342351
encode_def_id(ebml_w, did);
343352
encode_kind(ebml_w, 'f' as u8);
344353
encode_type_params(ebml_w, tps);
@@ -347,27 +356,27 @@ fn encode_info_for_item(@trans.crate_ctxt cx, &ebml.writer ebml_w,
347356
ebml.end_tag(ebml_w);
348357
}
349358
case (ast.item_mod(_, _, ?did)) {
350-
ebml.start_tag(ebml_w, tag_items_item);
359+
ebml.start_tag(ebml_w, tag_items_data_item);
351360
encode_def_id(ebml_w, did);
352361
encode_kind(ebml_w, 'm' as u8);
353362
ebml.end_tag(ebml_w);
354363
}
355364
case (ast.item_native_mod(_, _, ?did)) {
356-
ebml.start_tag(ebml_w, tag_items_item);
365+
ebml.start_tag(ebml_w, tag_items_data_item);
357366
encode_def_id(ebml_w, did);
358367
encode_kind(ebml_w, 'n' as u8);
359368
ebml.end_tag(ebml_w);
360369
}
361370
case (ast.item_ty(?id, _, ?tps, ?did, ?ann)) {
362-
ebml.start_tag(ebml_w, tag_items_item);
371+
ebml.start_tag(ebml_w, tag_items_data_item);
363372
encode_def_id(ebml_w, did);
364373
encode_kind(ebml_w, 'y' as u8);
365374
encode_type_params(ebml_w, tps);
366375
encode_type(ebml_w, trans.node_ann_type(cx, ann));
367376
ebml.end_tag(ebml_w);
368377
}
369378
case (ast.item_tag(?id, ?variants, ?tps, ?did)) {
370-
ebml.start_tag(ebml_w, tag_items_item);
379+
ebml.start_tag(ebml_w, tag_items_data_item);
371380
encode_def_id(ebml_w, did);
372381
encode_kind(ebml_w, 't' as u8);
373382
encode_type_params(ebml_w, tps);
@@ -376,7 +385,7 @@ fn encode_info_for_item(@trans.crate_ctxt cx, &ebml.writer ebml_w,
376385
encode_tag_variant_info(cx, ebml_w, did, variants);
377386
}
378387
case (ast.item_obj(?id, _, ?tps, ?odid, ?ann)) {
379-
ebml.start_tag(ebml_w, tag_items_item);
388+
ebml.start_tag(ebml_w, tag_items_data_item);
380389
encode_def_id(ebml_w, odid.ctor);
381390
encode_kind(ebml_w, 'o' as u8);
382391
encode_type_params(ebml_w, tps);
@@ -385,7 +394,7 @@ fn encode_info_for_item(@trans.crate_ctxt cx, &ebml.writer ebml_w,
385394
encode_symbol(cx, ebml_w, odid.ctor);
386395
ebml.end_tag(ebml_w);
387396

388-
ebml.start_tag(ebml_w, tag_items_item);
397+
ebml.start_tag(ebml_w, tag_items_data_item);
389398
encode_def_id(ebml_w, odid.ty);
390399
encode_kind(ebml_w, 'y' as u8);
391400
encode_type_params(ebml_w, tps);
@@ -397,7 +406,7 @@ fn encode_info_for_item(@trans.crate_ctxt cx, &ebml.writer ebml_w,
397406

398407
fn encode_info_for_native_item(@trans.crate_ctxt cx, &ebml.writer ebml_w,
399408
@ast.native_item nitem) {
400-
ebml.start_tag(ebml_w, tag_items_item);
409+
ebml.start_tag(ebml_w, tag_items_data_item);
401410
alt (nitem.node) {
402411
case (ast.native_item_ty(_, ?did)) {
403412
encode_def_id(ebml_w, did);
@@ -413,26 +422,87 @@ fn encode_info_for_native_item(@trans.crate_ctxt cx, &ebml.writer ebml_w,
413422
ebml.end_tag(ebml_w);
414423
}
415424

416-
fn encode_info_for_items(@trans.crate_ctxt cx, &ebml.writer ebml_w) {
425+
fn encode_info_for_items(@trans.crate_ctxt cx, &ebml.writer ebml_w)
426+
-> vec[tup(ast.def_id, uint)] {
427+
let vec[tup(ast.def_id, uint)] index = vec();
428+
417429
ebml.start_tag(ebml_w, tag_items);
418430
for each (@tup(ast.def_id, @ast.item) kvp in cx.items.items()) {
431+
index += vec(tup(kvp._0, ebml_w.writer.tell()));
419432
encode_info_for_item(cx, ebml_w, kvp._1);
420433
}
421434
for each (@tup(ast.def_id, @ast.native_item) kvp in
422435
cx.native_items.items()) {
436+
index += vec(tup(kvp._0, ebml_w.writer.tell()));
423437
encode_info_for_native_item(cx, ebml_w, kvp._1);
424438
}
425439
ebml.end_tag(ebml_w);
440+
441+
ret index;
442+
}
443+
444+
445+
// Definition ID indexing
446+
447+
fn create_index(vec[tup(ast.def_id, uint)] index)
448+
-> vec[vec[tup(ast.def_id, uint)]] {
449+
let vec[vec[tup(ast.def_id, uint)]] buckets = vec();
450+
for each (uint i in _uint.range(0u, 256u)) {
451+
let vec[tup(ast.def_id, uint)] bucket = vec();
452+
buckets += vec(bucket);
453+
}
454+
455+
for (tup(ast.def_id, uint) elt in index) {
456+
auto h = common.hash_def(elt._0);
457+
buckets.(h % 256u) += vec(elt);
458+
}
459+
460+
ret buckets;
461+
}
462+
463+
impure fn encode_index(&ebml.writer ebml_w,
464+
vec[tup(ast.def_id, uint)] index) {
465+
auto writer = io.new_writer_(ebml_w.writer);
466+
467+
auto buckets = create_index(index);
468+
469+
ebml.start_tag(ebml_w, tag_items_index);
470+
471+
let vec[uint] bucket_locs = vec();
472+
ebml.start_tag(ebml_w, tag_items_index_buckets);
473+
for (vec[tup(ast.def_id, uint)] bucket in buckets) {
474+
bucket_locs += vec(ebml_w.writer.tell());
475+
476+
ebml.start_tag(ebml_w, tag_items_index_buckets_bucket);
477+
for (tup(ast.def_id, uint) elt in bucket) {
478+
ebml.start_tag(ebml_w, tag_items_index_buckets_bucket_elt);
479+
writer.write_be_uint(elt._1, 4u);
480+
writer.write_str(def_to_str(elt._0));
481+
ebml.end_tag(ebml_w);
482+
}
483+
ebml.end_tag(ebml_w);
484+
}
485+
ebml.end_tag(ebml_w);
486+
487+
ebml.start_tag(ebml_w, tag_items_index_table);
488+
for (uint pos in bucket_locs) {
489+
writer.write_be_uint(pos, 4u);
490+
}
491+
ebml.end_tag(ebml_w);
492+
493+
ebml.end_tag(ebml_w);
426494
}
427495

428496

429-
fn encode_metadata(@trans.crate_ctxt cx, @ast.crate crate) -> ValueRef {
497+
impure fn encode_metadata(@trans.crate_ctxt cx, @ast.crate crate)
498+
-> ValueRef {
430499
auto string_w = io.string_writer();
431500
auto buf_w = string_w.get_writer().get_buf_writer();
432501
auto ebml_w = ebml.create_writer(buf_w);
433502

434503
encode_item_paths(ebml_w, crate);
435-
encode_info_for_items(cx, ebml_w);
504+
auto index = encode_info_for_items(cx, ebml_w);
505+
encode_index(ebml_w, index);
436506

437507
ret C_postr(string_w.get_str());
438508
}

trunk/src/comp/rustc.rc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ auth front.creader.get_type = impure;
4848
auth front.creader.get_symbol = impure;
4949
auth front.creader.impure_no_op = impure;
5050
auth middle.metadata = unsafe;
51+
auth middle.metadata.encode_index = impure;
52+
auth middle.metadata.encode_metadata = impure;
5153
auth middle.trans = unsafe;
5254
auth middle.trans.copy_any_self_to_alloca = impure;
5355
auth middle.trans.copy_args_to_allocas = impure;

0 commit comments

Comments
 (0)