@@ -807,17 +807,19 @@ where
807807 }
808808 Opcode :: DerefOf => {
809809 let [ Argument :: Object ( object) ] = & op. arguments [ ..] else { panic ! ( ) } ;
810- let result = if object. typ ( ) == ObjectType :: Reference {
811- object. clone ( ) . unwrap_reference ( )
812- } else if object. typ ( ) == ObjectType :: String {
813- let path = AmlName :: from_str ( & object. as_string ( ) . unwrap ( ) ) ?;
814- let ( _, object) = self . namespace . lock ( ) . search ( & path, & context. current_scope ) ?;
815- object. clone ( )
816- } else {
817- return Err ( AmlError :: ObjectNotOfExpectedType {
818- expected : ObjectType :: Reference ,
819- got : object. typ ( ) ,
820- } ) ;
810+ let result = match * * object {
811+ Object :: Reference { kind : _, inner : _ } => object. clone ( ) . unwrap_reference ( ) ,
812+ Object :: String ( _) => {
813+ let path = AmlName :: from_str ( & object. as_string ( ) . unwrap ( ) ) ?;
814+ let ( _, object) = self . namespace . lock ( ) . search ( & path, & context. current_scope ) ?;
815+ object. clone ( )
816+ }
817+ _ => {
818+ return Err ( AmlError :: ObjectNotOfExpectedType {
819+ expected : ObjectType :: Reference ,
820+ got : object. typ ( ) ,
821+ } ) ;
822+ }
821823 } ;
822824 context. contribute_arg ( Argument :: Object ( result) ) ;
823825 context. retire_op ( op) ;
@@ -1796,8 +1798,9 @@ where
17961798 let [ Argument :: Object ( left) , Argument :: Object ( right) , target] = & op. arguments [ 0 ..3 ] else { panic ! ( ) } ;
17971799 let target2 = if op. op == Opcode :: Divide { Some ( & op. arguments [ 3 ] ) } else { None } ;
17981800
1799- let left = left. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ?;
1800- let right = right. clone ( ) . unwrap_transparent_reference ( ) . as_integer ( ) ?;
1801+ let allowed_length = if self . dsdt_revision >= 2 { 8 } else { 4 } ;
1802+ let left = left. clone ( ) . unwrap_transparent_reference ( ) . to_integer ( allowed_length) ?;
1803+ let right = right. clone ( ) . unwrap_transparent_reference ( ) . to_integer ( allowed_length) ?;
18011804
18021805 let result = match op. op {
18031806 Opcode :: Add => left. wrapping_add ( right) ,
@@ -1981,43 +1984,7 @@ where
19811984 let [ Argument :: Object ( operand) , target] = & op. arguments [ ..] else { panic ! ( ) } ;
19821985 let operand = operand. clone ( ) . unwrap_transparent_reference ( ) ;
19831986
1984- let result = match * operand {
1985- Object :: Integer ( value) => Object :: Integer ( value) ,
1986- Object :: Buffer ( ref bytes) => {
1987- /*
1988- * The spec says this should respect the revision of the current definition block.
1989- * Apparently, the NT interpreter always uses the first 8 bytes of the buffer.
1990- */
1991- let mut to_interpret = [ 0u8 ; 8 ] ;
1992- ( to_interpret[ 0 ..usize:: min ( bytes. len ( ) , 8 ) ] ) . copy_from_slice ( bytes) ;
1993- Object :: Integer ( u64:: from_le_bytes ( to_interpret) )
1994- }
1995- Object :: String ( ref value) => {
1996- /*
1997- * This is about the same level of effort as ACPICA puts in. The uACPI test suite
1998- * has tests that this fails - namely because of support for octal, signs, strings
1999- * that won't fit in a `u64` etc. We probably need to write a more robust parser
2000- * 'real' parser to handle those cases.
2001- */
2002- let value = value. trim ( ) ;
2003- let value = value. to_ascii_lowercase ( ) ;
2004- let ( value, radix) : ( & str , u32 ) = match value. strip_prefix ( "0x" ) {
2005- Some ( value) => {
2006- ( value. split ( |c : char | !c. is_ascii_hexdigit ( ) ) . next ( ) . unwrap_or ( "" ) , 16 )
2007- }
2008- None => ( value. split ( |c : char | !c. is_ascii_digit ( ) ) . next ( ) . unwrap_or ( "" ) , 10 ) ,
2009- } ;
2010- match value. len ( ) {
2011- 0 => Object :: Integer ( 0 ) ,
2012- _ => Object :: Integer ( u64:: from_str_radix ( value, radix) . map_err ( |_| {
2013- AmlError :: InvalidOperationOnObject { op : Operation :: ToInteger , typ : ObjectType :: String }
2014- } ) ?) ,
2015- }
2016- }
2017- _ => Err ( AmlError :: InvalidOperationOnObject { op : Operation :: ToBuffer , typ : operand. typ ( ) } ) ?,
2018- }
2019- . wrap ( ) ;
2020-
1987+ let result = Object :: Integer ( operand. to_integer ( if self . dsdt_revision >= 2 { 8 } else { 4 } ) ?) . wrap ( ) ;
20211988 let result = self . do_store ( target, result) ?;
20221989 context. contribute_arg ( Argument :: Object ( result) ) ;
20231990 context. retire_op ( op) ;
0 commit comments