|  | 
| 1 | 1 | //! Working with GC `array` objects. | 
| 2 | 2 | 
 | 
| 3 |  | -use crate::runtime::vm::VMGcRef; | 
| 4 |  | -use crate::store::StoreId; | 
|  | 3 | +use crate::runtime::vm::{VMGcRef, VMStore}; | 
|  | 4 | +use crate::store::{StoreId, StoreResourceLimiter}; | 
| 5 | 5 | use crate::vm::{self, VMArrayRef, VMGcHeader}; | 
| 6 | 6 | use crate::{AnyRef, FieldType}; | 
| 7 | 7 | use crate::{ | 
| @@ -297,9 +297,15 @@ impl ArrayRef { | 
| 297 | 297 |         elem: &Val, | 
| 298 | 298 |         len: u32, | 
| 299 | 299 |     ) -> Result<Rooted<ArrayRef>> { | 
| 300 |  | -        let store = store.as_context_mut().0; | 
|  | 300 | +        let (mut limiter, store) = store.as_context_mut().0.resource_limiter_and_store_opaque(); | 
| 301 | 301 |         assert!(!store.async_support()); | 
| 302 |  | -        vm::assert_ready(Self::_new_async(store, allocator, elem, len)) | 
|  | 302 | +        vm::assert_ready(Self::_new_async( | 
|  | 303 | +            store, | 
|  | 304 | +            limiter.as_mut(), | 
|  | 305 | +            allocator, | 
|  | 306 | +            elem, | 
|  | 307 | +            len, | 
|  | 308 | +        )) | 
| 303 | 309 |     } | 
| 304 | 310 | 
 | 
| 305 | 311 |     /// Asynchronously allocate a new `array` of the given length, with every | 
| @@ -341,17 +347,19 @@ impl ArrayRef { | 
| 341 | 347 |         elem: &Val, | 
| 342 | 348 |         len: u32, | 
| 343 | 349 |     ) -> Result<Rooted<ArrayRef>> { | 
| 344 |  | -        Self::_new_async(store.as_context_mut().0, allocator, elem, len).await | 
|  | 350 | +        let (mut limiter, store) = store.as_context_mut().0.resource_limiter_and_store_opaque(); | 
|  | 351 | +        Self::_new_async(store, limiter.as_mut(), allocator, elem, len).await | 
| 345 | 352 |     } | 
| 346 | 353 | 
 | 
| 347 | 354 |     pub(crate) async fn _new_async( | 
| 348 | 355 |         store: &mut StoreOpaque, | 
|  | 356 | +        limiter: Option<&mut StoreResourceLimiter<'_>>, | 
| 349 | 357 |         allocator: &ArrayRefPre, | 
| 350 | 358 |         elem: &Val, | 
| 351 | 359 |         len: u32, | 
| 352 | 360 |     ) -> Result<Rooted<ArrayRef>> { | 
| 353 | 361 |         store | 
| 354 |  | -            .retry_after_gc_async((), |store, ()| { | 
|  | 362 | +            .retry_after_gc_async(limiter, (), |store, ()| { | 
| 355 | 363 |                 Self::new_from_iter(store, allocator, RepeatN(elem, len)) | 
| 356 | 364 |             }) | 
| 357 | 365 |             .await | 
| @@ -445,9 +453,14 @@ impl ArrayRef { | 
| 445 | 453 |         allocator: &ArrayRefPre, | 
| 446 | 454 |         elems: &[Val], | 
| 447 | 455 |     ) -> Result<Rooted<ArrayRef>> { | 
| 448 |  | -        let store = store.as_context_mut().0; | 
|  | 456 | +        let (mut limiter, store) = store.as_context_mut().0.resource_limiter_and_store_opaque(); | 
| 449 | 457 |         assert!(!store.async_support()); | 
| 450 |  | -        vm::assert_ready(Self::_new_fixed_async(store, allocator, elems)) | 
|  | 458 | +        vm::assert_ready(Self::_new_fixed_async( | 
|  | 459 | +            store, | 
|  | 460 | +            limiter.as_mut(), | 
|  | 461 | +            allocator, | 
|  | 462 | +            elems, | 
|  | 463 | +        )) | 
| 451 | 464 |     } | 
| 452 | 465 | 
 | 
| 453 | 466 |     /// Asynchronously allocate a new `array` containing the given elements. | 
| @@ -491,16 +504,18 @@ impl ArrayRef { | 
| 491 | 504 |         allocator: &ArrayRefPre, | 
| 492 | 505 |         elems: &[Val], | 
| 493 | 506 |     ) -> Result<Rooted<ArrayRef>> { | 
| 494 |  | -        Self::_new_fixed_async(store.as_context_mut().0, allocator, elems).await | 
|  | 507 | +        let (mut limiter, store) = store.as_context_mut().0.resource_limiter_and_store_opaque(); | 
|  | 508 | +        Self::_new_fixed_async(store, limiter.as_mut(), allocator, elems).await | 
| 495 | 509 |     } | 
| 496 | 510 | 
 | 
| 497 | 511 |     pub(crate) async fn _new_fixed_async( | 
| 498 | 512 |         store: &mut StoreOpaque, | 
|  | 513 | +        limiter: Option<&mut StoreResourceLimiter<'_>>, | 
| 499 | 514 |         allocator: &ArrayRefPre, | 
| 500 | 515 |         elems: &[Val], | 
| 501 | 516 |     ) -> Result<Rooted<ArrayRef>> { | 
| 502 | 517 |         store | 
| 503 |  | -            .retry_after_gc_async((), |store, ()| { | 
|  | 518 | +            .retry_after_gc_async(limiter, (), |store, ()| { | 
| 504 | 519 |                 Self::new_from_iter(store, allocator, elems.iter()) | 
| 505 | 520 |             }) | 
| 506 | 521 |             .await | 
|  | 
0 commit comments