@@ -7,7 +7,10 @@ use crate::compile::meta;
7
7
use crate :: compile:: { self , IrErrorKind , ItemId , ModId , WithSpan } ;
8
8
use crate :: hir;
9
9
use crate :: query:: { Query , Used } ;
10
- use crate :: runtime:: { BorrowRefRepr , ConstValue , Mutable , Object , OwnedTuple , RefRepr , Value } ;
10
+ use crate :: runtime:: {
11
+ self , BorrowRefRepr , ConstValue , Mutable , Object , OwnedTuple , RefRepr , Value ,
12
+ } ;
13
+ use crate :: TypeHash ;
11
14
12
15
/// The interpreter that executed [Ir][crate::ir::Ir].
13
16
pub struct Interpreter < ' a , ' arena > {
@@ -224,11 +227,6 @@ impl ir::Scopes {
224
227
match target {
225
228
BorrowRefRepr :: Mutable ( value) => {
226
229
match & * value {
227
- Mutable :: Vec ( vec) => {
228
- if let Some ( value) = vec. get ( * index) {
229
- return Ok ( value. clone ( ) ) ;
230
- }
231
- }
232
230
Mutable :: Tuple ( tuple) => {
233
231
if let Some ( value) = tuple. get ( * index) {
234
232
return Ok ( value. clone ( ) ) ;
@@ -242,11 +240,26 @@ impl ir::Scopes {
242
240
}
243
241
} ;
244
242
}
245
- actual => {
243
+ BorrowRefRepr :: Any ( value) => match value. type_hash ( ) {
244
+ runtime:: Vec :: HASH => {
245
+ let vec = value. borrow_ref :: < runtime:: Vec > ( ) . with_span ( ir_target) ?;
246
+
247
+ if let Some ( value) = vec. get ( * index) {
248
+ return Ok ( value. clone ( ) ) ;
249
+ }
250
+ }
251
+ _ => {
252
+ return Err ( compile:: Error :: expected_type :: < OwnedTuple > (
253
+ ir_target,
254
+ value. type_info ( ) ,
255
+ ) ) ;
256
+ }
257
+ } ,
258
+ value => {
246
259
return Err ( compile:: Error :: expected_type :: < OwnedTuple > (
247
260
ir_target,
248
- actual . type_info ( ) ,
249
- ) )
261
+ value . type_info ( ) ,
262
+ ) ) ;
250
263
}
251
264
}
252
265
@@ -300,35 +313,47 @@ impl ir::Scopes {
300
313
ir:: IrTargetKind :: Index ( target, index) => {
301
314
let target = self . get_target ( target) ?;
302
315
303
- let mut target = match target. as_ref_repr ( ) . with_span ( ir_target) ? {
304
- RefRepr :: Mutable ( current) => current. borrow_mut ( ) . with_span ( ir_target) ?,
305
- actual => {
316
+ match target. as_ref_repr ( ) . with_span ( ir_target) ? {
317
+ RefRepr :: Inline ( value) => {
306
318
return Err ( compile:: Error :: expected_type :: < OwnedTuple > (
307
319
ir_target,
308
- actual . type_info ( ) . with_span ( ir_target ) ? ,
320
+ value . type_info ( ) ,
309
321
) ) ;
310
322
}
311
- } ;
323
+ RefRepr :: Mutable ( current) => {
324
+ let mut mutable = current. borrow_mut ( ) . with_span ( ir_target) ?;
312
325
313
- match & mut * target {
314
- Mutable :: Vec ( vec) => {
315
- if let Some ( current) = vec. get_mut ( * index) {
316
- * current = value;
317
- return Ok ( ( ) ) ;
318
- }
326
+ match & mut * mutable {
327
+ Mutable :: Tuple ( tuple) => {
328
+ if let Some ( current) = tuple. get_mut ( * index) {
329
+ * current = value;
330
+ return Ok ( ( ) ) ;
331
+ }
332
+ }
333
+ value => {
334
+ return Err ( compile:: Error :: expected_type :: < OwnedTuple > (
335
+ ir_target,
336
+ value. type_info ( ) ,
337
+ ) ) ;
338
+ }
339
+ } ;
319
340
}
320
- Mutable :: Tuple ( tuple) => {
321
- if let Some ( current) = tuple. get_mut ( * index) {
322
- * current = value;
323
- return Ok ( ( ) ) ;
341
+ RefRepr :: Any ( any) => match any. type_hash ( ) {
342
+ runtime:: Vec :: HASH => {
343
+ let mut vec = any. borrow_mut :: < runtime:: Vec > ( ) . with_span ( ir_target) ?;
344
+
345
+ if let Some ( current) = vec. get_mut ( * index) {
346
+ * current = value;
347
+ return Ok ( ( ) ) ;
348
+ }
324
349
}
325
- }
326
- actual => {
327
- return Err ( compile :: Error :: expected_type :: < OwnedTuple > (
328
- ir_target ,
329
- actual . type_info ( ) ,
330
- ) ) ;
331
- }
350
+ _ => {
351
+ return Err ( compile :: Error :: expected_type :: < OwnedTuple > (
352
+ ir_target ,
353
+ any . type_info ( ) ,
354
+ ) ) ;
355
+ }
356
+ } ,
332
357
} ;
333
358
334
359
Err ( compile:: Error :: msg ( ir_target, "missing index" ) )
@@ -382,40 +407,49 @@ impl ir::Scopes {
382
407
ir:: IrTargetKind :: Index ( target, index) => {
383
408
let current = self . get_target ( target) ?;
384
409
385
- let mut value = match current. as_ref_repr ( ) . with_span ( ir_target) ? {
386
- RefRepr :: Mutable ( value) => value. borrow_mut ( ) . with_span ( ir_target) ?,
387
- actual => {
388
- return Err ( compile:: Error :: expected_type :: < OwnedTuple > (
389
- ir_target,
390
- actual. type_info ( ) . with_span ( ir_target) ?,
391
- ) ) ;
392
- }
393
- } ;
410
+ match current. as_ref_repr ( ) . with_span ( ir_target) ? {
411
+ RefRepr :: Mutable ( value) => {
412
+ let mut value = value. borrow_mut ( ) . with_span ( ir_target) ?;
394
413
395
- match & mut * value {
396
- Mutable :: Vec ( vec) => {
397
- let value = vec. get_mut ( * index) . ok_or_else ( || {
398
- compile:: Error :: new (
414
+ match & mut * value {
415
+ Mutable :: Tuple ( tuple) => {
416
+ let value = tuple. get_mut ( * index) . ok_or_else ( || {
417
+ compile:: Error :: new (
418
+ ir_target,
419
+ IrErrorKind :: MissingIndex { index : * index } ,
420
+ )
421
+ } ) ?;
422
+
423
+ op ( value)
424
+ }
425
+ actual => Err ( compile:: Error :: expected_type :: < OwnedTuple > (
399
426
ir_target,
400
- IrErrorKind :: MissingIndex { index : * index } ,
401
- )
402
- } ) ?;
403
-
404
- op ( value)
427
+ actual. type_info ( ) ,
428
+ ) ) ,
429
+ }
405
430
}
406
- Mutable :: Tuple ( tuple) => {
407
- let value = tuple. get_mut ( * index) . ok_or_else ( || {
408
- compile::Error :: new (
409
- ir_target,
410
- IrErrorKind :: MissingIndex { index : * index } ,
411
- )
412
- } ) ?;
431
+ RefRepr :: Any ( value) => match value. type_hash ( ) {
432
+ runtime:: Vec :: HASH => {
433
+ let mut vec =
434
+ value. borrow_mut :: < runtime:: Vec > ( ) . with_span ( ir_target) ?;
413
435
414
- op ( value)
415
- }
436
+ let value = vec. get_mut ( * index) . ok_or_else ( || {
437
+ compile:: Error :: new (
438
+ ir_target,
439
+ IrErrorKind :: MissingIndex { index : * index } ,
440
+ )
441
+ } ) ?;
442
+
443
+ op ( value)
444
+ }
445
+ _ => Err ( compile:: Error :: expected_type :: < OwnedTuple > (
446
+ ir_target,
447
+ value. type_info ( ) ,
448
+ ) ) ,
449
+ } ,
416
450
actual => Err ( compile:: Error :: expected_type :: < OwnedTuple > (
417
451
ir_target,
418
- actual. type_info ( ) ,
452
+ actual. type_info ( ) . with_span ( ir_target ) ? ,
419
453
) ) ,
420
454
}
421
455
}
0 commit comments