2
2
* TODO:
3
3
* - Field reads supporting custom handlers
4
4
* - Run `_REG` on supported op region handlers
5
- * - Sort out situation with `gain_mut` omg - thinking we should have a weird mutex thingy and
6
- * gain a 'token' to give us access to objects. Objects themselves should probs be in like an
7
- * `UnsafeCell` or something.
8
5
* - Count operations performed and time
9
6
* - Do stores properly :(
10
7
* - Load and LoadTable
@@ -442,7 +439,7 @@ where
442
439
else {
443
440
panic ! ( )
444
441
} ;
445
- let buffer_size = buffer_size. clone ( ) . unwrap_reference ( ) . as_integer ( ) ?;
442
+ let buffer_size = buffer_size. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ?;
446
443
447
444
let buffer_len = pkg_length - ( context. current_block . pc - start_pc) ;
448
445
let mut buffer = vec ! [ 0 ; buffer_size as usize ] ;
@@ -804,7 +801,8 @@ where
804
801
panic ! ( )
805
802
} ;
806
803
let total_elements =
807
- total_elements. clone ( ) . unwrap_reference ( ) . as_integer ( ) ? as usize ;
804
+ total_elements. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ?
805
+ as usize ;
808
806
809
807
// Update the expected number of arguments to terminate the in-flight op
810
808
package_op. expected_arguments = total_elements;
@@ -1494,14 +1492,14 @@ where
1494
1492
}
1495
1493
1496
1494
let [ Argument :: Object ( left) , Argument :: Object ( right) ] = & op. arguments [ ..] else { panic ! ( ) } ;
1495
+ let left = left. clone ( ) . unwrap_transparent_reference ( ) ;
1496
+ let right = right. clone ( ) . unwrap_transparent_reference ( ) ;
1497
1497
1498
1498
/*
1499
1499
* Some of these operations allow strings and buffers to be used as operands. Apparently
1500
1500
* NT's interpreter just takes the first 4 bytes of the string/buffer and casts them as an
1501
1501
* integer...
1502
1502
*/
1503
- let left = left. clone ( ) . unwrap_transparent_reference ( ) ;
1504
- let right = right. clone ( ) . unwrap_transparent_reference ( ) ;
1505
1503
let ( left, right) = match * left {
1506
1504
Object :: Integer ( left) => ( left, right. as_integer ( ) ?) ,
1507
1505
Object :: String ( ref left) => {
@@ -1559,8 +1557,9 @@ where
1559
1557
1560
1558
fn do_to_buffer ( & self , context : & mut MethodContext , op : OpInFlight ) -> Result < ( ) , AmlError > {
1561
1559
let [ Argument :: Object ( operand) , target] = & op. arguments [ ..] else { panic ! ( ) } ;
1560
+ let operand = operand. clone ( ) . unwrap_transparent_reference ( ) ;
1562
1561
1563
- let result = match * * operand {
1562
+ let result = match * operand {
1564
1563
Object :: Buffer ( ref bytes) => Object :: Buffer ( bytes. clone ( ) ) ,
1565
1564
Object :: Integer ( value) => {
1566
1565
if self . dsdt_revision >= 2 {
@@ -1592,8 +1591,9 @@ where
1592
1591
1593
1592
fn do_to_integer ( & self , context : & mut MethodContext , op : OpInFlight ) -> Result < ( ) , AmlError > {
1594
1593
let [ Argument :: Object ( operand) , target] = & op. arguments [ ..] else { panic ! ( ) } ;
1594
+ let operand = operand. clone ( ) . unwrap_transparent_reference ( ) ;
1595
1595
1596
- let result = match * * operand {
1596
+ let result = match * operand {
1597
1597
Object :: Integer ( value) => Object :: Integer ( value) ,
1598
1598
Object :: Buffer ( ref bytes) => {
1599
1599
/*
@@ -1636,8 +1636,9 @@ where
1636
1636
1637
1637
fn do_to_string ( & self , context : & mut MethodContext , op : OpInFlight ) -> Result < ( ) , AmlError > {
1638
1638
let [ Argument :: Object ( source) , Argument :: Object ( length) , target] = & op. arguments [ ..] else { panic ! ( ) } ;
1639
+ let source = source. clone ( ) . unwrap_transparent_reference ( ) ;
1639
1640
let source = source. as_buffer ( ) ?;
1640
- let length = length. as_integer ( ) ? as usize ;
1641
+ let length = length. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ? as usize ;
1641
1642
1642
1643
let result = if source. is_empty ( ) {
1643
1644
Object :: String ( String :: new ( ) )
@@ -1677,7 +1678,6 @@ where
1677
1678
if bytes. is_empty ( ) {
1678
1679
Object :: String ( String :: new ( ) )
1679
1680
} else {
1680
- // TODO: there has GOT to be a better way to format directly into a string...
1681
1681
let mut string = String :: new ( ) ;
1682
1682
for byte in bytes {
1683
1683
let as_str = match op. op {
@@ -1711,8 +1711,8 @@ where
1711
1711
else {
1712
1712
panic ! ( )
1713
1713
} ;
1714
- let index = index. as_integer ( ) ? as usize ;
1715
- let length = length. as_integer ( ) ? as usize ;
1714
+ let index = index. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ? as usize ;
1715
+ let length = length. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ? as usize ;
1716
1716
1717
1717
let result = match * * source {
1718
1718
Object :: String ( ref string) => {
@@ -1740,12 +1740,14 @@ where
1740
1740
self . do_store ( target, result. clone ( ) ) ?;
1741
1741
context. contribute_arg ( Argument :: Object ( result) ) ;
1742
1742
context. retire_op ( op) ;
1743
-
1744
1743
Ok ( ( ) )
1745
1744
}
1746
1745
1747
1746
fn do_concat ( & self , context : & mut MethodContext , op : OpInFlight ) -> Result < ( ) , AmlError > {
1748
1747
let [ Argument :: Object ( source1) , Argument :: Object ( source2) , target] = & op. arguments [ ..] else { panic ! ( ) } ;
1748
+ let source1 = source1. clone ( ) . unwrap_transparent_reference ( ) ;
1749
+ let source2 = source2. clone ( ) . unwrap_transparent_reference ( ) ;
1750
+
1749
1751
fn resolve_as_string ( obj : & Object ) -> String {
1750
1752
match obj {
1751
1753
Object :: Uninitialized => "[Uninitialized Object]" . to_string ( ) ,
@@ -1838,7 +1840,7 @@ where
1838
1840
1839
1841
fn do_size_of ( & self , context : & mut MethodContext , op : OpInFlight ) -> Result < ( ) , AmlError > {
1840
1842
let [ Argument :: Object ( object) ] = & op. arguments [ ..] else { panic ! ( ) } ;
1841
- let object = object. clone ( ) . unwrap_reference ( ) ;
1843
+ let object = object. clone ( ) . unwrap_transparent_reference ( ) ;
1842
1844
1843
1845
let result = match * object {
1844
1846
Object :: Buffer ( ref buffer) => buffer. len ( ) ,
@@ -1856,9 +1858,10 @@ where
1856
1858
let [ Argument :: Object ( object) , Argument :: Object ( index_value) , target] = & op. arguments [ ..] else {
1857
1859
panic ! ( )
1858
1860
} ;
1859
- let index_value = index_value. as_integer ( ) ?;
1861
+ let object = object. clone ( ) . unwrap_transparent_reference ( ) ;
1862
+ let index_value = index_value. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ?;
1860
1863
1861
- let result = match * * object {
1864
+ let result = match * object {
1862
1865
Object :: Buffer ( ref buffer) => {
1863
1866
if index_value as usize >= buffer. len ( ) {
1864
1867
Err ( AmlError :: IndexOutOfBounds ) ?
0 commit comments