@@ -373,18 +373,39 @@ impl Datum {
373
373
self . source)
374
374
}
375
375
376
+ fn to_value_datum ( bcx : block ) -> Datum {
377
+ /*!
378
+ *
379
+ * Yields a by-ref form of this datum. This may involve
380
+ * creation of a temporary stack slot. The value returned by
381
+ * this function is not separately rooted from this datum, so
382
+ * it will not live longer than the current datum. */
383
+
384
+ match self . mode {
385
+ ByValue => self ,
386
+ ByRef => {
387
+ Datum { val : self . to_value_llval ( bcx) , mode : ByValue ,
388
+ ty : self . ty , source : FromRvalue }
389
+ }
390
+ }
391
+ }
392
+
376
393
fn to_value_llval ( bcx : block ) -> ValueRef {
377
394
/*!
378
395
*
379
396
* Yields the value itself. */
380
397
381
- match self . mode {
382
- ByValue => self . val ,
383
- ByRef => Load ( bcx, self . val )
398
+ if ty:: type_is_nil ( self . ty ) || ty:: type_is_bot ( self . ty ) {
399
+ C_nil ( )
400
+ } else {
401
+ match self . mode {
402
+ ByValue => self . val ,
403
+ ByRef => Load ( bcx, self . val )
404
+ }
384
405
}
385
406
}
386
407
387
- fn to_ref ( bcx : block ) -> Datum {
408
+ fn to_ref_datum ( bcx : block ) -> Datum {
388
409
/*!
389
410
*
390
411
* Yields a by-ref form of this datum. This may involve
@@ -405,25 +426,52 @@ impl Datum {
405
426
match self . mode {
406
427
ByRef => self . val ,
407
428
ByValue => {
408
- let slot = alloc_ty ( bcx, self . ty ) ;
409
- Store ( bcx, self . val , slot) ;
410
- slot
429
+ if ty:: type_is_nil ( self . ty ) || ty:: type_is_bot ( self . ty ) {
430
+ C_null ( T_ptr ( type_of:: type_of ( bcx. ccx ( ) , self . ty ) ) )
431
+ } else {
432
+ let slot = alloc_ty ( bcx, self . ty ) ;
433
+ Store ( bcx, self . val , slot) ;
434
+ slot
435
+ }
411
436
}
412
437
}
413
438
}
414
439
415
- fn to_appropriate_llval ( bcx : block ) -> ValueRef {
440
+ fn appropriate_mode ( ) -> DatumMode {
416
441
/*!
417
442
*
418
- * Yields something that is by value if the type is immediate
419
- * and by ref otherwise. */
443
+ * Indicates the "appropriate" mode for this value,
444
+ * which is either by ref or by value, depending
445
+ * on whether type is iimmediate or what. */
420
446
421
447
if ty:: type_is_nil ( self . ty ) || ty:: type_is_bot ( self . ty ) {
422
- self . to_value_llval ( bcx )
448
+ ByValue
423
449
} else if ty:: type_is_immediate ( self . ty ) {
424
- self . to_value_llval ( bcx )
450
+ ByValue
425
451
} else {
426
- self . to_ref_llval ( bcx)
452
+ ByRef
453
+ }
454
+ }
455
+
456
+ fn to_appropriate_llval ( bcx : block ) -> ValueRef {
457
+ /*!
458
+ *
459
+ * Yields an llvalue with the `appropriate_mode()`. */
460
+
461
+ match self . appropriate_mode ( ) {
462
+ ByValue => self . to_value_llval ( bcx) ,
463
+ ByRef => self . to_ref_llval ( bcx)
464
+ }
465
+ }
466
+
467
+ fn to_appropriate_datum ( bcx : block ) -> Datum {
468
+ /*!
469
+ *
470
+ * Yields a datum with the `appropriate_mode()`. */
471
+
472
+ match self . appropriate_mode ( ) {
473
+ ByValue => self . to_value_datum ( bcx) ,
474
+ ByRef => self . to_ref_datum ( bcx)
427
475
}
428
476
}
429
477
0 commit comments