@@ -1022,12 +1022,13 @@ fn assemble_typed_value<'arena>(
10221022 ) )
10231023 }
10241024
1025- /// s:s.len():"(escaped s)";
1026- fn deserialize_string < ' arena , ' a > (
1025+ /// s:s.len():"(escaped s)"; or l:s.len():"(escaped s)";
1026+ fn deserialize_string_or_lazyclass < ' arena , ' a > (
10271027 alloc : & ' arena Bump ,
10281028 src : & ' a [ u8 ] ,
1029+ s_or_l : StringOrLazyClass ,
10291030 ) -> Result < ( & ' a [ u8 ] , hhbc:: TypedValue < ' arena > ) > {
1030- let src = expect ( src, b"s" ) ?;
1031+ let src = expect ( src, s_or_l . prefix ( ) ) ?;
10311032 let src = expect ( src, b":" ) ?;
10321033 let ( len, src) = expect_usize ( src) ?;
10331034 let src = expect ( src, b":" ) ?;
@@ -1044,7 +1045,29 @@ fn assemble_typed_value<'arena>(
10441045 let src = & src[ len..] ;
10451046 let src = expect ( src, b"\" " ) ?;
10461047 let src = expect ( src, b";" ) ?;
1047- Ok ( ( src, hhbc:: TypedValue :: String ( Str :: new_slice ( alloc, s) ) ) )
1048+ Ok ( ( src, s_or_l. build ( Str :: new_slice ( alloc, s) ) ) )
1049+ }
1050+
1051+ #[ derive( PartialEq ) ]
1052+ pub enum StringOrLazyClass {
1053+ String ,
1054+ LazyClass ,
1055+ }
1056+
1057+ impl StringOrLazyClass {
1058+ pub fn prefix ( & self ) -> & [ u8 ] {
1059+ match self {
1060+ StringOrLazyClass :: String => b"s" ,
1061+ StringOrLazyClass :: LazyClass => b"l" ,
1062+ }
1063+ }
1064+
1065+ pub fn build < ' arena > ( & self , content : Str < ' arena > ) -> hhbc:: TypedValue < ' arena > {
1066+ match self {
1067+ StringOrLazyClass :: String => hhbc:: TypedValue :: String ( content) ,
1068+ StringOrLazyClass :: LazyClass => hhbc:: TypedValue :: LazyClass ( content) ,
1069+ }
1070+ }
10481071 }
10491072
10501073 #[ derive( PartialEq ) ]
@@ -1125,13 +1148,15 @@ fn assemble_typed_value<'arena>(
11251148 b'd' => deserialize_float ( src) . context ( "Assembling a TV float" ) ?,
11261149 b'N' => deserialize_null ( src) . context ( "Assembling a TV Null" ) ?,
11271150 b'u' => deserialize_uninit ( src) . context ( "Assembling a uninit" ) ?,
1128- b's' => deserialize_string ( alloc, src) . context ( "Assembling a TV string" ) ?,
1151+ b's' => deserialize_string_or_lazyclass ( alloc, src, StringOrLazyClass :: String )
1152+ . context ( "Assembling a TV string" ) ?,
11291153 b'v' => deserialize_vec_or_keyset ( alloc, src, VecOrKeyset :: Vec )
11301154 . context ( "Assembling a TV vec" ) ?,
11311155 b'k' => deserialize_vec_or_keyset ( alloc, src, VecOrKeyset :: Keyset )
11321156 . context ( "Assembling a TV keyset" ) ?,
11331157 b'D' => deserialize_dict ( alloc, src) . context ( "Assembling a TV dict" ) ?,
1134- b'l' => todo ! ( ) , // Never encounter LazyClass in all WWW...
1158+ b'l' => deserialize_string_or_lazyclass ( alloc, src, StringOrLazyClass :: LazyClass )
1159+ . context ( "Assembling a LazyClass" ) ?,
11351160 _ => bail ! ( "Unknown tv: {}" , src[ 0 ] ) ,
11361161 } ;
11371162 Ok ( ( src, tr) )
@@ -2054,6 +2079,12 @@ fn assemble_instr<'arena>(
20542079 b"True" => {
20552080 assemble_single_opcode_instr ( & mut sl_lexer, || hhbc:: Opcode :: True , "True" )
20562081 }
2082+ b"LazyClass" => assemble_lazyclass_opcode ( alloc, & mut sl_lexer) ,
2083+ b"LazyClassFromClass" => assemble_single_opcode_instr (
2084+ & mut sl_lexer,
2085+ || hhbc:: Opcode :: LazyClassFromClass ,
2086+ "LazyClassFromClass" ,
2087+ ) ,
20572088 b"VerifyOutType" => assemble_local_carrying_opcode_instr (
20582089 & mut sl_lexer,
20592090 decl_map,
@@ -3717,6 +3748,20 @@ fn assemble_double_opcode<'arena>(token_iter: &mut Lexer<'_>) -> Result<hhbc::In
37173748 ) ) )
37183749}
37193750
3751+ fn assemble_lazyclass_opcode < ' arena > (
3752+ alloc : & ' arena Bump ,
3753+ token_iter : & mut Lexer < ' _ > ,
3754+ ) -> Result < hhbc:: Instruct < ' arena > > {
3755+ token_iter. expect_is_str ( Token :: into_identifier, "LazyClass" ) ?;
3756+ let st_data = token_iter. expect ( Token :: into_str_literal) ?;
3757+ let st_data =
3758+ escaper:: unescape_literal_bytes_into_vec_bytes ( escaper:: unquote_slice ( st_data. as_bytes ( ) ) ) ?;
3759+ token_iter. expect_end ( ) ?;
3760+ Ok ( hhbc:: Instruct :: Opcode ( hhbc:: Opcode :: LazyClass (
3761+ hhbc:: ClassName :: new ( Str :: new_slice ( alloc, & st_data) ) ,
3762+ ) ) )
3763+ }
3764+
37203765type Line = usize ;
37213766
37223767#[ derive( Debug , PartialEq , Eq , Copy , Clone ) ]
0 commit comments