1
0
Fork 0
mirror of https://codeberg.org/demostf/parser.git synced 2026-06-03 18:24:05 +02:00

keep gameevent enum under 128b

This commit is contained in:
Robin Appelman 2019-10-11 23:24:47 +02:00
commit 7ee659a8ed
4 changed files with 1300 additions and 27 deletions

View file

@ -4,6 +4,8 @@ use inflector::Inflector;
use lazy_static::lazy_static;
use proc_macro2::{Ident, Literal, Span, TokenStream};
use quote::quote;
use std::collections::hash_map::HashMap;
use tf_demo_parser::demo::gameevent_gen::get_sizes;
use tf_demo_parser::demo::gamevent::{GameEventDefinition, GameEventValueType};
use tf_demo_parser::demo::parser::MessageHandler;
use tf_demo_parser::{Demo, ParserState};
@ -23,6 +25,14 @@ impl MessageHandler for GameEventAnalyser {
}
}
fn should_box_event(name: &str) -> bool {
lazy_static! {
static ref SIZES: HashMap<&'static str, usize> = get_sizes();
}
SIZES.get(name).cloned().unwrap_or_default() > 120
}
fn get_type_name(ty: GameEventValueType) -> &'static str {
match ty {
GameEventValueType::String => "String",
@ -275,7 +285,11 @@ pub fn generate_game_events(demo: Demo) -> TokenStream {
let name = Ident::new(&name_str, span);
let struct_name = Ident::new(&format!("{}Event", name_str), span);
quote!(#name(#struct_name),)
if should_box_event(&name_str) {
quote!(#name(Box<#struct_name>),)
} else {
quote!(#name(#struct_name),)
}
});
let event_types = events.iter().map(|event| {
@ -298,10 +312,28 @@ pub fn generate_game_events(demo: Demo) -> TokenStream {
let variant_name = Ident::new(&name, span);
let struct_name = Ident::new(&format!("{}Event", name), span);
if should_box_event(&name) {
quote!(
GameEventType::#variant_name => {
GameEvent::#variant_name(<Box<#struct_name>>::from_raw_event(event.values)?)
}
)
} else {
quote!(
GameEventType::#variant_name => {
GameEvent::#variant_name(#struct_name::from_raw_event(event.values)?)
}
)
}
});
let sizes = events.iter().map(|event| {
let name = get_event_name(&event.name);
let variant_name = Ident::new(&name, span);
let struct_name = Ident::new(&format!("{}Event", name), span);
quote!(
GameEventType::#variant_name => {
GameEvent::#variant_name(#struct_name::from_raw_event(event.values)?)
}
(#name, std::mem::size_of::<#struct_name>())
)
});
@ -339,5 +371,11 @@ pub fn generate_game_events(demo: Demo) -> TokenStream {
})
}
}
pub fn get_sizes() -> std::collections::hash_map::HashMap<&'static str, usize> {
vec![
#(#sizes,)*
].into_iter().collect()
}
)
}