@@ -331,10 +331,11 @@ impl DataView {
331331 ) -> JsResult < JsValue > {
332332 // 1. Let O be the this value.
333333 // 2. Perform ? RequireInternalSlot(O, [[DataView]]).
334- require_internal_slot ! ( view = this, Self , "DataView" ) ;
334+ let view = require_internal_slot ! ( this, Self , "DataView" ) ;
335335 // 3. Assert: O has a [[ViewedArrayBuffer]] internal slot.
336336 // 4. Let buffer be O.[[ViewedArrayBuffer]].
337- let buffer = view. viewed_array_buffer . clone ( ) ;
337+ let view_data = view. borrow ( ) ;
338+ let buffer = view_data. data ( ) . viewed_array_buffer . clone ( ) ;
338339 // 5. Return buffer.
339340 Ok ( buffer. into ( ) )
340341 }
@@ -357,22 +358,24 @@ impl DataView {
357358 // 1. Let O be the this value.
358359 // 2. Perform ? RequireInternalSlot(O, [[DataView]]).
359360 // 3. Assert: O has a [[ViewedArrayBuffer]] internal slot.
360- require_internal_slot ! ( view = this, Self , "DataView" ) ;
361+ let view = require_internal_slot ! ( this, Self , "DataView" ) ;
361362
362363 // 4. Let viewRecord be MakeDataViewWithBufferWitnessRecord(O, seq-cst).
363364 // 5. If IsViewOutOfBounds(viewRecord) is true, throw a TypeError exception.
364- let buffer = view. viewed_array_buffer . as_buffer ( ) ;
365+ let view_data = view. borrow ( ) ;
366+ let buffer = view_data. data ( ) . viewed_array_buffer . as_buffer ( ) ;
365367 let Some ( slice) = buffer
366368 . bytes ( Ordering :: SeqCst )
367- . filter ( |s| !view. is_out_of_bounds ( s. len ( ) ) )
369+ . filter ( |s| !view. borrow ( ) . data ( ) . is_out_of_bounds ( s. len ( ) ) )
368370 else {
369371 return Err ( JsNativeError :: typ ( )
370372 . with_message ( "view out of bounds for its inner buffer" )
371373 . into ( ) ) ;
372374 } ;
373375
374376 // 6. Let size be GetViewByteLength(viewRecord).
375- let size = view. byte_length ( slice. len ( ) ) ;
377+ let view_data = view. borrow ( ) ;
378+ let size = view_data. data ( ) . byte_length ( slice. len ( ) ) ;
376379
377380 // 7. Return 𝔽(size).
378381 Ok ( size. into ( ) )
@@ -396,15 +399,16 @@ impl DataView {
396399 ) -> JsResult < JsValue > {
397400 // 1. Let O be the this value.
398401 // 2. Perform ? RequireInternalSlot(O, [[DataView]]).
399- require_internal_slot ! ( view = this, Self , "DataView" ) ;
402+ let view = require_internal_slot ! ( this, Self , "DataView" ) ;
400403
401404 // 3. Assert: O has a [[ViewedArrayBuffer]] internal slot.
402- let buffer = view. viewed_array_buffer . as_buffer ( ) ;
405+ let view_data = view. borrow ( ) ;
406+ let buffer = view_data. data ( ) . viewed_array_buffer . as_buffer ( ) ;
403407 // 4. Let viewRecord be MakeDataViewWithBufferWitnessRecord(O, seq-cst).
404408 // 5. If IsViewOutOfBounds(viewRecord) is true, throw a TypeError exception.
405409 if buffer
406410 . bytes ( Ordering :: SeqCst )
407- . filter ( |b| !view. is_out_of_bounds ( b. len ( ) ) )
411+ . filter ( |b| !view. borrow ( ) . data ( ) . is_out_of_bounds ( b. len ( ) ) )
408412 . is_none ( )
409413 {
410414 return Err ( JsNativeError :: typ ( )
@@ -413,7 +417,8 @@ impl DataView {
413417 }
414418
415419 // 6. Let offset be O.[[ByteOffset]].
416- let offset = view. byte_offset ;
420+ let view_data = view. borrow ( ) ;
421+ let offset = view_data. data ( ) . byte_offset ;
417422 // 7. Return 𝔽(offset).
418423 Ok ( offset. into ( ) )
419424 }
@@ -436,7 +441,7 @@ impl DataView {
436441 ) -> JsResult < JsValue > {
437442 // 1. Perform ? RequireInternalSlot(view, [[DataView]]).
438443 // 2. Assert: view has a [[ViewedArrayBuffer]] internal slot.
439- require_internal_slot ! ( view = view, Self , "DataView" ) ;
444+ let view = require_internal_slot ! ( view, Self , "DataView" ) ;
440445
441446 // 3. Let getIndex be ? ToIndex(requestIndex).
442447 let get_index = request_index. to_index ( context) ?;
@@ -447,21 +452,24 @@ impl DataView {
447452 // 6. Let viewRecord be MakeDataViewWithBufferWitnessRecord(view, unordered).
448453 // 7. NOTE: Bounds checking is not a synchronizing operation when view's backing buffer is a growable SharedArrayBuffer.
449454 // 8. If IsViewOutOfBounds(viewRecord) is true, throw a TypeError exception.
450- let buffer = view. viewed_array_buffer . as_buffer ( ) ;
455+ let view_data = view. borrow ( ) ;
456+ let buffer = view_data. data ( ) . viewed_array_buffer . as_buffer ( ) ;
451457 let Some ( data) = buffer
452458 . bytes ( Ordering :: Relaxed )
453- . filter ( |buf| !view. is_out_of_bounds ( buf. len ( ) ) )
459+ . filter ( |buf| !view. borrow ( ) . data ( ) . is_out_of_bounds ( buf. len ( ) ) )
454460 else {
455461 return Err ( JsNativeError :: typ ( )
456462 . with_message ( "view out of bounds for its inner buffer" )
457463 . into ( ) ) ;
458464 } ;
459465
460466 // 5. Let viewOffset be view.[[ByteOffset]].
461- let view_offset = view. byte_offset ;
467+ let view_data = view. borrow ( ) ;
468+ let view_offset = view_data. data ( ) . byte_offset ;
462469
463470 // 9. Let viewSize be GetViewByteLength(viewRecord).
464- let view_size = view. byte_length ( data. len ( ) ) ;
471+ let view_data = view. borrow ( ) ;
472+ let view_size = view_data. data ( ) . byte_length ( data. len ( ) ) ;
465473
466474 // 10. Let elementSize be the Element Size value specified in Table 71 for Element Type type.
467475 let element_size = size_of :: < T > ( ) as u64 ;
@@ -774,7 +782,7 @@ impl DataView {
774782 ) -> JsResult < JsValue > {
775783 // 1. Perform ? RequireInternalSlot(view, [[DataView]]).
776784 // 2. Assert: view has a [[ViewedArrayBuffer]] internal slot.
777- require_internal_slot ! ( view = view, Self , "DataView" ) ;
785+ let view = require_internal_slot ! ( view, Self , "DataView" ) ;
778786
779787 // 3. Let getIndex be ? ToIndex(requestIndex).
780788 let get_index = request_index. to_index ( context) ?;
@@ -789,22 +797,28 @@ impl DataView {
789797 // 8. Let viewRecord be MakeDataViewWithBufferWitnessRecord(view, unordered).
790798 // 9. NOTE: Bounds checking is not a synchronizing operation when view's backing buffer is a growable SharedArrayBuffer.
791799 // 10. If IsViewOutOfBounds(viewRecord) is true, throw a TypeError exception.
792- let mut buffer = view. viewed_array_buffer . as_buffer_mut ( ) ;
800+ let viewed_buffer = {
801+ let view_data = view. borrow ( ) ;
802+ view_data. data ( ) . viewed_array_buffer . clone ( )
803+ } ;
804+ let mut buffer = viewed_buffer. as_buffer_mut ( ) ;
793805
794806 let Some ( mut data) = buffer
795807 . bytes ( Ordering :: Relaxed )
796- . filter ( |buf| !view. is_out_of_bounds ( buf. len ( ) ) )
808+ . filter ( |buf| !view. borrow ( ) . data ( ) . is_out_of_bounds ( buf. len ( ) ) )
797809 else {
798810 return Err ( JsNativeError :: typ ( )
799811 . with_message ( "view out of bounds for its inner buffer" )
800812 . into ( ) ) ;
801813 } ;
802814
803815 // 11. Let viewSize be GetViewByteLength(viewRecord).
804- let view_size = view. byte_length ( data. len ( ) ) ;
816+ let view_data = view. borrow ( ) ;
817+ let view_size = view_data. data ( ) . byte_length ( data. len ( ) ) ;
805818
806819 // 7. Let viewOffset be view.[[ByteOffset]].
807- let view_offset = view. byte_offset ;
820+ let view_data = view. borrow ( ) ;
821+ let view_offset = view_data. data ( ) . byte_offset ;
808822
809823 // 12. Let elementSize be the Element Size value specified in Table 71 for Element Type type.
810824 let elem_size = size_of :: < T > ( ) ;
0 commit comments