@@ -282,90 +282,91 @@ type link_meta = rec(str name,
282
282
283
283
fn build_link_meta( & session:: session sess, & ast:: crate c,
284
284
& str output , sha1 sha) -> link_meta {
285
- auto meta_info = crate_link_metas ( c) ;
286
285
287
- auto name = crate_meta_name ( sess, c, output) ;
288
- auto vers = crate_meta_vers ( sess, c) ;
289
- auto extras_hash = crate_meta_extras_hash ( sha, c) ;
290
-
291
- ret rec ( name = name, vers = vers, extras_hash = extras_hash) ;
292
- }
293
-
294
- type link_metas = rec ( option:: t[ str] name ,
295
- option:: t[ str] vers ,
296
- vec[ @ast:: meta_item] cmh_items ) ;
297
-
298
- fn crate_link_metas ( & ast:: crate c) -> link_metas {
299
- let option:: t[ str] name = none;
300
- let option:: t[ str] vers = none;
301
- let vec[ @ast:: meta_item] cmh_items = [ ] ;
302
- for ( @ast:: meta_item meta in
303
- attr:: find_linkage_metas( c. node. attrs) ) {
304
- alt ( meta. node ) {
305
- case ( ast:: meta_name_value ( "name" , ?v) ) {
306
- // FIXME: Should probably warn about duplicate name items
307
- name = some ( v) ;
308
- }
309
- case ( ast:: meta_name_value ( "value" , ?v) ) {
310
- // FIXME: Should probably warn about duplicate value items
311
- vers = some ( v) ;
312
- }
313
- case ( _) {
314
- cmh_items += [ meta] ;
286
+ type provided_metas = rec ( option:: t[ str] name ,
287
+ option:: t[ str] vers ,
288
+ vec[ @ast:: meta_item] cmh_items ) ;
289
+
290
+ fn provided_link_metas ( & ast:: crate c) -> provided_metas {
291
+ let option:: t[ str] name = none;
292
+ let option:: t[ str] vers = none;
293
+ let vec[ @ast:: meta_item] cmh_items = [ ] ;
294
+ for ( @ast:: meta_item meta in
295
+ attr:: find_linkage_metas( c. node. attrs) ) {
296
+ alt ( meta. node ) {
297
+ case ( ast:: meta_name_value ( "name" , ?v) ) {
298
+ // FIXME: Should probably warn about duplicate name items
299
+ name = some ( v) ;
300
+ }
301
+ case ( ast:: meta_name_value ( "value" , ?v) ) {
302
+ // FIXME: Should probably warn about duplicate value items
303
+ vers = some ( v) ;
304
+ }
305
+ case ( _) {
306
+ cmh_items += [ meta] ;
307
+ }
315
308
}
316
309
}
310
+ ret rec( name = name,
311
+ vers = vers,
312
+ cmh_items = cmh_items) ;
317
313
}
318
- ret rec( name = name,
319
- vers = vers,
320
- cmh_items = cmh_items) ;
321
- }
322
314
323
- // This calculates CMH as defined above
324
- fn crate_meta_extras_hash( sha1 sha, & ast:: crate crate) -> str {
325
- fn len_and_str ( & str s) -> str { ret #fmt( "%u_%s" , str:: byte_len ( s) , s) ; }
315
+ // This calculates CMH as defined above
316
+ fn crate_meta_extras_hash( sha1 sha, & ast:: crate crate,
317
+ & provided_metas metas) -> str {
318
+ fn len_and_str ( & str s) -> str {
319
+ ret #fmt( "%u_%s" , str:: byte_len ( s) , s) ;
320
+ }
326
321
327
- auto cmh_items = {
328
- auto cmh_items = crate_link_metas ( crate ) . cmh_items ;
329
- attr:: sort_meta_items ( cmh_items)
330
- } ;
331
-
332
- sha. reset ( ) ;
333
- for ( @ast:: meta_item m_ in cmh_items) {
334
- auto m = m_;
335
- alt ( m. node) {
336
- case ( ast:: meta_name_value( ?key, ?value) ) {
337
- sha. input_str( len_and_str( key) ) ;
338
- sha. input_str( len_and_str( value) ) ;
339
- }
340
- case ( ast:: meta_word( ?name) ) {
341
- sha. input_str( len_and_str( name) ) ;
342
- }
343
- case ( ast:: meta_list( _, _) ) {
344
- fail "unimplemented meta_item variant" ;
322
+ auto cmh_items = attr:: sort_meta_items ( metas. cmh_items ) ;
323
+
324
+ sha. reset ( ) ;
325
+ for ( @ast:: meta_item m_ in cmh_items) {
326
+ auto m = m_;
327
+ alt ( m. node) {
328
+ case ( ast:: meta_name_value( ?key, ?value) ) {
329
+ sha. input_str( len_and_str( key) ) ;
330
+ sha. input_str( len_and_str( value) ) ;
331
+ }
332
+ case ( ast:: meta_word( ?name) ) {
333
+ sha. input_str( len_and_str( name) ) ;
334
+ }
335
+ case ( ast:: meta_list( _, _) ) {
336
+ fail "unimplemented meta_item variant" ;
337
+ }
345
338
}
346
339
}
340
+ ret truncated_sha1_result( sha) ;
347
341
}
348
- ret truncated_sha1_result( sha) ;
349
- }
350
342
351
- fn crate_meta_name( & session:: session sess, & ast:: crate crate,
352
- & str output) -> str {
353
- ret alt ( crate_link_metas ( crate ) . name) {
354
- case ( some( ?v) ) { v }
355
- case ( none) {
356
- auto os = str:: split( fs:: basename( output) , '.' as u8 ) ;
357
- assert ( vec:: len( os) >= 2 u) ;
358
- vec:: pop( os) ;
359
- str:: connect( os, "." )
360
- }
361
- } ;
362
- }
343
+ fn crate_meta_name( & session:: session sess, & ast:: crate crate,
344
+ & str output, & provided_metas metas ) -> str {
345
+ ret alt ( metas . name) {
346
+ case ( some( ?v) ) { v }
347
+ case ( none) {
348
+ auto os = str:: split( fs:: basename( output) , '.' as u8 ) ;
349
+ assert ( vec:: len( os) >= 2 u) ;
350
+ vec:: pop( os) ;
351
+ str:: connect( os, "." )
352
+ }
353
+ } ;
354
+ }
363
355
364
- fn crate_meta_vers( & session:: session sess, & ast:: crate crate) -> str {
365
- ret alt ( crate_link_metas( crate ) . vers) {
366
- case ( some( ?v) ) { v }
367
- case ( none) { "0.0" }
368
- } ;
356
+ fn crate_meta_vers( & session:: session sess, & ast:: crate crate,
357
+ & provided_metas metas) -> str {
358
+ ret alt ( metas. vers) {
359
+ case ( some( ?v) ) { v }
360
+ case ( none) { "0.0" }
361
+ } ;
362
+ }
363
+
364
+ auto provided_metas = provided_link_metas( c) ;
365
+ auto name = crate_meta_name( sess, c, output, provided_metas) ;
366
+ auto vers = crate_meta_vers( sess, c, provided_metas) ;
367
+ auto extras_hash = crate_meta_extras_hash( sha, c, provided_metas) ;
368
+
369
+ ret rec( name = name, vers = vers, extras_hash = extras_hash) ;
369
370
}
370
371
371
372
fn truncated_sha1_result( sha1 sha) -> str {
@@ -374,8 +375,7 @@ fn truncated_sha1_result(sha1 sha) -> str {
374
375
375
376
376
377
// This calculates STH for a symbol, as defined above
377
- fn symbol_hash( ty:: ctxt tcx, sha1 sha, & ty:: t t, str crate_meta_name,
378
- str crate_meta_extras_hash) -> str {
378
+ fn symbol_hash( ty:: ctxt tcx, sha1 sha, & ty:: t t, & link_meta link_meta) -> str {
379
379
// NB: do *not* use abbrevs here as we want the symbol names
380
380
// to be independent of one another in the crate.
381
381
@@ -384,9 +384,10 @@ fn symbol_hash(ty::ctxt tcx, sha1 sha, &ty::t t, str crate_meta_name,
384
384
tcx=tcx,
385
385
abbrevs=metadata:: tyencode:: ac_no_abbrevs) ;
386
386
sha. reset( ) ;
387
- sha. input_str( crate_meta_name ) ;
387
+ sha. input_str( link_meta . name ) ;
388
388
sha. input_str( "-" ) ;
389
- sha. input_str( crate_meta_name) ;
389
+ // FIXME: This wants to be link_meta.meta_hash
390
+ sha. input_str( link_meta. name) ;
390
391
sha. input_str( "-" ) ;
391
392
sha. input_str( metadata:: tyencode:: ty_str( cx, t) ) ;
392
393
auto hash = truncated_sha1_result( sha) ;
@@ -402,8 +403,7 @@ fn get_symbol_hash(&@crate_ctxt ccx, &ty::t t) -> str {
402
403
case ( none) {
403
404
hash =
404
405
symbol_hash( ccx. tcx, ccx. sha, t,
405
- ccx. link_meta. name,
406
- ccx. link_meta. extras_hash) ;
406
+ ccx. link_meta) ;
407
407
ccx. type_sha1s. insert( t, hash) ;
408
408
}
409
409
}
0 commit comments