Skip to content

Commit 331d2d6

Browse files
committed
repr: handle tuple structs sanely
Closes #8919
1 parent cc1f002 commit 331d2d6

File tree

6 files changed

+58
-34
lines changed

6 files changed

+58
-34
lines changed

src/librustc/middle/trans/reflect.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ impl Reflector {
5151
C_int(self.bcx.ccx(), i)
5252
}
5353

54+
pub fn c_bool(&mut self, b: bool) -> ValueRef {
55+
C_bool(b)
56+
}
57+
5458
pub fn c_slice(&mut self, s: @str) -> ValueRef {
5559
// We're careful to not use first class aggregates here because that
5660
// will kick us off fast isel. (Issue #4352.)
@@ -250,14 +254,19 @@ impl Reflector {
250254

251255
ty::ty_struct(did, ref substs) => {
252256
let fields = ty::struct_fields(tcx, did, substs);
257+
let mut named_fields = false;
258+
if !fields.is_empty() {
259+
named_fields = fields[0].ident != special_idents::unnamed_field;
260+
}
253261

254262
let extra = ~[self.c_slice(ty_to_str(tcx, t).to_managed()),
263+
self.c_bool(named_fields),
255264
self.c_uint(fields.len())] + self.c_size_and_align(t);
256265
do self.bracketed("class", extra) |this| {
257266
for (i, field) in fields.iter().enumerate() {
258267
let extra = ~[this.c_uint(i),
259-
this.c_slice(
260-
bcx.ccx().sess.str_of(field.ident))]
268+
this.c_slice(bcx.ccx().sess.str_of(field.ident)),
269+
this.c_bool(named_fields)]
261270
+ this.c_mt(&field.mt);
262271
this.visit("class_field", extra);
263272
}

src/libstd/reflect.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -331,25 +331,28 @@ impl<V:TyVisitor + MovePtr> TyVisitor for MovePtrAdaptor<V> {
331331
true
332332
}
333333

334-
fn visit_enter_class(&mut self, name: &str, n_fields: uint, sz: uint, align: uint) -> bool {
334+
fn visit_enter_class(&mut self, name: &str, named_fields: bool, n_fields: uint, sz: uint,
335+
align: uint) -> bool {
335336
self.align(align);
336-
if ! self.inner.visit_enter_class(name, n_fields, sz, align) {
337+
if ! self.inner.visit_enter_class(name, named_fields, n_fields, sz, align) {
337338
return false;
338339
}
339340
true
340341
}
341342

342-
fn visit_class_field(&mut self, i: uint, name: &str, mtbl: uint, inner: *TyDesc) -> bool {
343+
fn visit_class_field(&mut self, i: uint, name: &str, named: bool, mtbl: uint,
344+
inner: *TyDesc) -> bool {
343345
unsafe { self.align((*inner).align); }
344-
if ! self.inner.visit_class_field(i, name, mtbl, inner) {
346+
if ! self.inner.visit_class_field(i, name, named, mtbl, inner) {
345347
return false;
346348
}
347349
unsafe { self.bump((*inner).size); }
348350
true
349351
}
350352

351-
fn visit_leave_class(&mut self, name: &str, n_fields: uint, sz: uint, align: uint) -> bool {
352-
if ! self.inner.visit_leave_class(name, n_fields, sz, align) {
353+
fn visit_leave_class(&mut self, name: &str, named_fields: bool, n_fields: uint, sz: uint,
354+
align: uint) -> bool {
355+
if ! self.inner.visit_leave_class(name, named_fields, n_fields, sz, align) {
353356
return false;
354357
}
355358
true

src/libstd/repr.rs

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -412,31 +412,40 @@ impl<'self> TyVisitor for ReprVisitor<'self> {
412412
true
413413
}
414414

415-
fn visit_enter_class(&mut self, name: &str, n_fields: uint,
415+
fn visit_enter_class(&mut self, name: &str, named_fields: bool, n_fields: uint,
416416
_sz: uint, _align: uint) -> bool {
417417
self.writer.write(name.as_bytes());
418418
if n_fields != 0 {
419-
self.writer.write(['{' as u8]);
419+
if named_fields {
420+
self.writer.write(['{' as u8]);
421+
} else {
422+
self.writer.write(['(' as u8]);
423+
}
420424
}
421425
true
422426
}
423427

424-
fn visit_class_field(&mut self, i: uint, name: &str,
425-
mtbl: uint, inner: *TyDesc) -> bool {
428+
fn visit_class_field(&mut self, i: uint, name: &str, named: bool,
429+
_mtbl: uint, inner: *TyDesc) -> bool {
426430
if i != 0 {
427431
self.writer.write(", ".as_bytes());
428432
}
429-
self.write_mut_qualifier(mtbl);
430-
self.writer.write(name.as_bytes());
431-
self.writer.write(": ".as_bytes());
433+
if named {
434+
self.writer.write(name.as_bytes());
435+
self.writer.write(": ".as_bytes());
436+
}
432437
self.visit_inner(inner);
433438
true
434439
}
435440

436-
fn visit_leave_class(&mut self, _name: &str, n_fields: uint,
441+
fn visit_leave_class(&mut self, _name: &str, named_fields: bool, n_fields: uint,
437442
_sz: uint, _align: uint) -> bool {
438443
if n_fields != 0 {
439-
self.writer.write(['}' as u8]);
444+
if named_fields {
445+
self.writer.write(['}' as u8]);
446+
} else {
447+
self.writer.write([')' as u8]);
448+
}
440449
}
441450
true
442451
}
@@ -669,4 +678,7 @@ fn test_repr() {
669678

670679
struct Foo;
671680
exact_test(&(~[Foo, Foo]), "~[repr::test_repr::Foo, repr::test_repr::Foo]");
681+
682+
struct Bar(int, int);
683+
exact_test(&(Bar(2, 2)), "repr::test_repr::Bar(2, 2)");
672684
}

src/libstd/unstable/intrinsics.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -220,11 +220,11 @@ pub trait TyVisitor {
220220
fn visit_leave_rec(&mut self, n_fields: uint,
221221
sz: uint, align: uint) -> bool;
222222

223-
fn visit_enter_class(&mut self, name: &str, n_fields: uint,
223+
fn visit_enter_class(&mut self, name: &str, named_fields: bool, n_fields: uint,
224224
sz: uint, align: uint) -> bool;
225-
fn visit_class_field(&mut self, i: uint, name: &str,
225+
fn visit_class_field(&mut self, i: uint, name: &str, named: bool,
226226
mtbl: uint, inner: *TyDesc) -> bool;
227-
fn visit_leave_class(&mut self, name: &str, n_fields: uint,
227+
fn visit_leave_class(&mut self, name: &str, named_fields: bool, n_fields: uint,
228228
sz: uint, align: uint) -> bool;
229229

230230
fn visit_enter_tup(&mut self, n_fields: uint,

src/test/run-pass/reflect-visit-data.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -317,26 +317,26 @@ impl<V:TyVisitor + movable_ptr> TyVisitor for ptr_visit_adaptor<V> {
317317
true
318318
}
319319

320-
fn visit_enter_class(&mut self, name: &str, n_fields: uint, sz: uint, align: uint)
321-
-> bool {
320+
fn visit_enter_class(&mut self, name: &str, named_fields: bool, n_fields: uint, sz: uint,
321+
align: uint) -> bool {
322322
self.align(align);
323-
if ! self.inner.visit_enter_class(name, n_fields, sz, align) {
323+
if ! self.inner.visit_enter_class(name, named_fields, n_fields, sz, align) {
324324
return false;
325325
}
326326
true
327327
}
328328

329-
fn visit_class_field(&mut self, i: uint, name: &str,
329+
fn visit_class_field(&mut self, i: uint, name: &str, named: bool,
330330
mtbl: uint, inner: *TyDesc) -> bool {
331-
if ! self.inner.visit_class_field(i, name, mtbl, inner) {
331+
if ! self.inner.visit_class_field(i, name, named, mtbl, inner) {
332332
return false;
333333
}
334334
true
335335
}
336336

337-
fn visit_leave_class(&mut self, name: &str, n_fields: uint, sz: uint, align: uint)
338-
-> bool {
339-
if ! self.inner.visit_leave_class(name, n_fields, sz, align) {
337+
fn visit_leave_class(&mut self, name: &str, named_fields: bool, n_fields: uint, sz: uint,
338+
align: uint) -> bool {
339+
if ! self.inner.visit_leave_class(name, named_fields, n_fields, sz, align) {
340340
return false;
341341
}
342342
true
@@ -565,13 +565,13 @@ impl TyVisitor for my_visitor {
565565
fn visit_leave_rec(&mut self, _n_fields: uint,
566566
_sz: uint, _align: uint) -> bool { true }
567567

568-
fn visit_enter_class(&mut self, _name: &str, _n_fields: uint,
568+
fn visit_enter_class(&mut self, _name: &str, _named_fields: bool, _n_fields: uint,
569569
_sz: uint, _align: uint) -> bool { true }
570-
fn visit_class_field(&mut self, _i: uint, _name: &str,
570+
fn visit_class_field(&mut self, _i: uint, _name: &str, _named: bool,
571571
_mtbl: uint, inner: *TyDesc) -> bool {
572572
self.visit_inner(inner)
573573
}
574-
fn visit_leave_class(&mut self, _name: &str, _n_fields: uint,
574+
fn visit_leave_class(&mut self, _name: &str, _named_fields: bool, _n_fields: uint,
575575
_sz: uint, _align: uint) -> bool { true }
576576

577577
fn visit_enter_tup(&mut self, _n_fields: uint,

src/test/run-pass/reflect-visit-type.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,11 @@ impl TyVisitor for MyVisitor {
9999
fn visit_leave_rec(&mut self, _n_fields: uint,
100100
_sz: uint, _align: uint) -> bool { true }
101101

102-
fn visit_enter_class(&mut self, _name: &str, _n_fields: uint,
102+
fn visit_enter_class(&mut self, _name: &str, _named_fields: bool, _n_fields: uint,
103103
_sz: uint, _align: uint) -> bool { true }
104-
fn visit_class_field(&mut self, _i: uint, _name: &str,
104+
fn visit_class_field(&mut self, _i: uint, _name: &str, _named: bool,
105105
_mtbl: uint, _inner: *TyDesc) -> bool { true }
106-
fn visit_leave_class(&mut self, _name: &str, _n_fields: uint,
106+
fn visit_leave_class(&mut self, _name: &str, _named_fields: bool, _n_fields: uint,
107107
_sz: uint, _align: uint) -> bool { true }
108108

109109
fn visit_enter_tup(&mut self, _n_fields: uint,

0 commit comments

Comments
 (0)