From 189e75bfe22abef5a9e64958ea535b6739764032 Mon Sep 17 00:00:00 2001 From: Nick Rolfe Date: Mon, 1 Nov 2021 17:03:44 +0000 Subject: [PATCH] Sort TRAP output First, emit labels with fresh ids. Then other labels. Then tuples, grouped by name. Hopefully this will help both with the compression ratio but also with branch prediction in the TRAP importer. --- ruby/extractor/src/extractor.rs | 9 ++- ruby/extractor/src/trap.rs | 116 +++++++++++++------------------- 2 files changed, 50 insertions(+), 75 deletions(-) diff --git a/ruby/extractor/src/extractor.rs b/ruby/extractor/src/extractor.rs index 945a89b2272..4ed70b101c7 100644 --- a/ruby/extractor/src/extractor.rs +++ b/ruby/extractor/src/extractor.rs @@ -9,7 +9,7 @@ use tree_sitter::{Language, Node, Parser, Range, Tree}; pub fn populate_file(writer: &mut trap::Writer, absolute_path: &Path) -> trap::Label { let (file_label, fresh) = - writer.global_id(&trap::full_id_for_file(&normalize_path(absolute_path))); + writer.global_id(trap::full_id_for_file(&normalize_path(absolute_path))); if fresh { writer.add_tuple( "files", @@ -24,7 +24,7 @@ pub fn populate_file(writer: &mut trap::Writer, absolute_path: &Path) -> trap::L } fn populate_empty_file(writer: &mut trap::Writer) -> trap::Label { - let (file_label, fresh) = writer.global_id("empty;sourcefile"); + let (file_label, fresh) = writer.global_id("empty;sourcefile".to_owned()); if fresh { writer.add_tuple( "files", @@ -54,7 +54,7 @@ pub fn populate_parent_folders( None => break, Some(folder) => { let (folder_label, fresh) = - writer.global_id(&trap::full_id_for_folder(&normalize_path(folder))); + writer.global_id(trap::full_id_for_folder(&normalize_path(folder))); writer.add_tuple( "containerparent", vec![ @@ -88,7 +88,7 @@ fn location( end_line: usize, end_column: usize, ) -> trap::Label { - let (loc_label, fresh) = writer.global_id(&format!( + let (loc_label, fresh) = writer.global_id(format!( "loc,{{{}}},{},{},{},{}", file_label, start_line, start_column, end_line, end_column )); @@ -133,7 +133,6 @@ pub fn extract( parser.set_language(language).unwrap(); parser.set_included_ranges(ranges).unwrap(); let tree = parser.parse(&source, None).expect("Failed to parse file"); - trap_writer.comment(format!("Auto-generated TRAP file for {}", path_str)); let file_label = populate_file(trap_writer, path); let mut visitor = Visitor { source, diff --git a/ruby/extractor/src/trap.rs b/ruby/extractor/src/trap.rs index 691cf12021a..8fbe0e52801 100644 --- a/ruby/extractor/src/trap.rs +++ b/ruby/extractor/src/trap.rs @@ -1,25 +1,34 @@ use std::borrow::Cow; +use std::collections::BTreeMap; use std::fmt; -use std::io::{BufWriter, Write}; +use std::io::BufWriter; use std::path::Path; use flate2::write::GzEncoder; pub struct Writer { - /// The accumulated trap entries - trap_output: Vec, + /// Labels that should be assigned fresh ids, e.g. `#123=*`. + fresh_ids: Vec