Skip to content

Commit 0ca1885

Browse files
committed
Feed enum field offsets to type vistors.
1 parent 44d4d6d commit 0ca1885

File tree

5 files changed

+61
-20
lines changed

5 files changed

+61
-20
lines changed

src/libcore/reflect.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,21 +406,31 @@ impl<V:TyVisitor + MovePtr> TyVisitor for MovePtrAdaptor<V> {
406406
disr_val: int,
407407
n_fields: uint,
408408
name: &str) -> bool {
409-
self.inner.push_ptr();
409+
self.inner.push_ptr(); // NOTE remove after next snapshot
410410
if ! self.inner.visit_enter_enum_variant(variant, disr_val,
411411
n_fields, name) {
412412
return false;
413413
}
414414
true
415415
}
416416

417+
#[cfg(stage0)]
417418
fn visit_enum_variant_field(&self, i: uint, inner: *TyDesc) -> bool {
418419
unsafe { self.align((*inner).align); }
419420
if ! self.inner.visit_enum_variant_field(i, inner) { return false; }
420421
unsafe { self.bump((*inner).size); }
421422
true
422423
}
423424

425+
#[cfg(not(stage0))]
426+
fn visit_enum_variant_field(&self, i: uint, offset: uint, inner: *TyDesc) -> bool {
427+
self.inner.push_ptr();
428+
self.bump(offset);
429+
if ! self.inner.visit_enum_variant_field(i, offset, inner) { return false; }
430+
self.inner.pop_ptr();
431+
true
432+
}
433+
424434
fn visit_leave_enum_variant(&self, variant: uint,
425435
disr_val: int,
426436
n_fields: uint,
@@ -429,7 +439,7 @@ impl<V:TyVisitor + MovePtr> TyVisitor for MovePtrAdaptor<V> {
429439
n_fields, name) {
430440
return false;
431441
}
432-
self.inner.pop_ptr();
442+
self.inner.pop_ptr(); // NOTE remove after next snapshot
433443
true
434444
}
435445

src/libcore/repr.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,14 @@ pub impl ReprVisitor {
193193
self.bump(sys::size_of::<T>());
194194
}
195195

196+
#[cfg(stage0)] #[inline(always)]
197+
fn stage0_bump_past<T>(&self) {
198+
self.bump_past::<T>();
199+
}
200+
#[cfg(not(stage0))] #[inline(always)]
201+
fn stage0_bump_past<T>(&self) {
202+
}
203+
196204
#[inline(always)]
197205
fn visit_inner(&self, inner: *TyDesc) -> bool {
198206
self.visit_ptr_inner(self.ptr, inner)
@@ -487,7 +495,7 @@ impl TyVisitor for ReprVisitor {
487495
self.var_stk.push(TagMismatch);
488496
}
489497
};
490-
self.bump_past::<int>();
498+
self.stage0_bump_past::<int>();
491499
}
492500
}
493501

@@ -500,6 +508,7 @@ impl TyVisitor for ReprVisitor {
500508
true
501509
}
502510

511+
#[cfg(stage0)]
503512
fn visit_enum_variant_field(&self, i: uint, inner: *TyDesc) -> bool {
504513
match self.var_stk[vec::uniq_len(&const self.var_stk) - 1] {
505514
Degenerate | TagMatch => {
@@ -515,6 +524,22 @@ impl TyVisitor for ReprVisitor {
515524
true
516525
}
517526

527+
#[cfg(not(stage0))]
528+
fn visit_enum_variant_field(&self, i: uint, _offset: uint, inner: *TyDesc) -> bool {
529+
match self.var_stk[vec::uniq_len(&const self.var_stk) - 1] {
530+
Degenerate | TagMatch => {
531+
if i != 0 {
532+
self.writer.write_str(", ");
533+
}
534+
if ! self.visit_inner(inner) {
535+
return false;
536+
}
537+
}
538+
TagMismatch => ()
539+
}
540+
true
541+
}
542+
518543
fn visit_leave_enum_variant(&self, _variant: uint,
519544
_disr_val: int,
520545
n_fields: uint,

src/librustc/front/intrinsic.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ pub mod intrinsic {
9696
disr_val: int,
9797
n_fields: uint,
9898
name: &str) -> bool;
99-
fn visit_enum_variant_field(&self, i: uint, inner: *TyDesc) -> bool;
99+
fn visit_enum_variant_field(&self, i: uint, offset: uint, inner: *TyDesc) -> bool;
100100
fn visit_leave_enum_variant(&self, variant: uint,
101101
disr_val: int,
102102
n_fields: uint,

src/librustc/middle/trans/reflect.rs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111

1212
use lib::llvm::{TypeRef, ValueRef};
13+
use middle::trans::adt;
1314
use middle::trans::base::*;
1415
use middle::trans::build::*;
1516
use middle::trans::callee::{ArgVals, DontAutorefArg};
@@ -266,23 +267,28 @@ pub impl Reflector {
266267
// variant?
267268
ty::ty_enum(did, ref substs) => {
268269
let bcx = self.bcx;
269-
let tcx = bcx.ccx().tcx;
270-
let variants = ty::substd_enum_variants(tcx, did, substs);
270+
let ccx = bcx.ccx();
271+
let repr = adt::represent_type(bcx.ccx(), t);
272+
let variants = ty::substd_enum_variants(ccx.tcx, did, substs);
271273

272-
let extra = ~[self.c_uint(vec::len(variants))]
274+
let enum_args = ~[self.c_uint(vec::len(variants))]
273275
+ self.c_size_and_align(t);
274-
do self.bracketed(~"enum", extra) |this| {
276+
do self.bracketed(~"enum", enum_args) |this| {
275277
for variants.eachi |i, v| {
276-
let extra1 = ~[this.c_uint(i),
277-
this.c_int(v.disr_val),
278-
this.c_uint(vec::len(v.args)),
279-
this.c_slice(
280-
bcx.ccx().sess.str_of(v.name))];
281-
do this.bracketed(~"enum_variant", extra1) |this| {
278+
let variant_args = ~[this.c_uint(i),
279+
this.c_int(v.disr_val),
280+
this.c_uint(vec::len(v.args)),
281+
this.c_slice(ccx.sess.str_of(v.name))];
282+
do this.bracketed(~"enum_variant", variant_args) |this| {
282283
for v.args.eachi |j, a| {
283-
let extra = ~[this.c_uint(j),
284-
this.c_tydesc(*a)];
285-
this.visit(~"enum_variant_field", extra);
284+
let bcx = this.bcx;
285+
let null = C_null(T_ptr(type_of(ccx, t)));
286+
let offset = p2i(ccx, adt::trans_field_ptr(bcx, repr, null,
287+
v.disr_val, j));
288+
let field_args = ~[this.c_uint(j),
289+
offset,
290+
this.c_tydesc(*a)];
291+
this.visit(~"enum_variant_field", field_args);
286292
}
287293
}
288294
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -394,8 +394,8 @@ impl<V:TyVisitor + movable_ptr> TyVisitor for ptr_visit_adaptor<V> {
394394
true
395395
}
396396

397-
fn visit_enum_variant_field(&self, i: uint, inner: *TyDesc) -> bool {
398-
if ! self.inner.visit_enum_variant_field(i, inner) { return false; }
397+
fn visit_enum_variant_field(&self, i: uint, offset: uint, inner: *TyDesc) -> bool {
398+
if ! self.inner.visit_enum_variant_field(i, offset, inner) { return false; }
399399
true
400400
}
401401

@@ -594,7 +594,7 @@ impl TyVisitor for my_visitor {
594594
_disr_val: int,
595595
_n_fields: uint,
596596
_name: &str) -> bool { true }
597-
fn visit_enum_variant_field(&self, _i: uint, inner: *TyDesc) -> bool {
597+
fn visit_enum_variant_field(&self, _i: uint, _offset: uint, inner: *TyDesc) -> bool {
598598
self.visit_inner(inner)
599599
}
600600
fn visit_leave_enum_variant(&self, _variant: uint,

0 commit comments

Comments
 (0)