Merge pull request #5566 from zhaowenlan1779/layered-fs-fix
layered_fs: Make LoadFile and LoadDirectory less recursive
This commit is contained in:
		@@ -82,7 +82,7 @@ void LayeredFS::Load() {
 | 
			
		||||
 | 
			
		||||
LayeredFS::~LayeredFS() = default;
 | 
			
		||||
 | 
			
		||||
void LayeredFS::LoadDirectory(Directory& current, u32 offset) {
 | 
			
		||||
u32 LayeredFS::LoadDirectory(Directory& current, u32 offset) {
 | 
			
		||||
    DirectoryMetadata metadata;
 | 
			
		||||
    romfs->ReadFile(header.directory_metadata_table.offset + offset, sizeof(metadata),
 | 
			
		||||
                    reinterpret_cast<u8*>(&metadata));
 | 
			
		||||
@@ -92,28 +92,24 @@ void LayeredFS::LoadDirectory(Directory& current, u32 offset) {
 | 
			
		||||
    current.path = current.parent->path + current.name + DIR_SEP;
 | 
			
		||||
    directory_path_map.emplace(current.path, ¤t);
 | 
			
		||||
 | 
			
		||||
    if (metadata.first_file_offset != 0xFFFFFFFF) {
 | 
			
		||||
        LoadFile(current, metadata.first_file_offset);
 | 
			
		||||
    u32 file_offset = metadata.first_file_offset;
 | 
			
		||||
    while (file_offset != 0xFFFFFFFF) {
 | 
			
		||||
        file_offset = LoadFile(current, file_offset);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (metadata.first_child_directory_offset != 0xFFFFFFFF) {
 | 
			
		||||
    u32 child_directory_offset = metadata.first_child_directory_offset;
 | 
			
		||||
    while (child_directory_offset != 0xFFFFFFFF) {
 | 
			
		||||
        auto child = std::make_unique<Directory>();
 | 
			
		||||
        auto& directory = *child;
 | 
			
		||||
        directory.parent = ¤t;
 | 
			
		||||
        current.directories.emplace_back(std::move(child));
 | 
			
		||||
        LoadDirectory(directory, metadata.first_child_directory_offset);
 | 
			
		||||
        child_directory_offset = LoadDirectory(directory, child_directory_offset);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (metadata.next_sibling_offset != 0xFFFFFFFF) {
 | 
			
		||||
        auto sibling = std::make_unique<Directory>();
 | 
			
		||||
        auto& directory = *sibling;
 | 
			
		||||
        directory.parent = current.parent;
 | 
			
		||||
        current.parent->directories.emplace_back(std::move(sibling));
 | 
			
		||||
        LoadDirectory(directory, metadata.next_sibling_offset);
 | 
			
		||||
    }
 | 
			
		||||
    return metadata.next_sibling_offset;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void LayeredFS::LoadFile(Directory& parent, u32 offset) {
 | 
			
		||||
u32 LayeredFS::LoadFile(Directory& parent, u32 offset) {
 | 
			
		||||
    FileMetadata metadata;
 | 
			
		||||
    romfs->ReadFile(header.file_metadata_table.offset + offset, sizeof(metadata),
 | 
			
		||||
                    reinterpret_cast<u8*>(&metadata));
 | 
			
		||||
@@ -129,9 +125,7 @@ void LayeredFS::LoadFile(Directory& parent, u32 offset) {
 | 
			
		||||
    file_path_map.emplace(file->path, file.get());
 | 
			
		||||
    parent.files.emplace_back(std::move(file));
 | 
			
		||||
 | 
			
		||||
    if (metadata.next_sibling_offset != 0xFFFFFFFF) {
 | 
			
		||||
        LoadFile(parent, metadata.next_sibling_offset);
 | 
			
		||||
    }
 | 
			
		||||
    return metadata.next_sibling_offset;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string LayeredFS::ReadName(u32 offset, u32 name_length) {
 | 
			
		||||
 
 | 
			
		||||
@@ -65,11 +65,13 @@ private:
 | 
			
		||||
 | 
			
		||||
    std::string ReadName(u32 offset, u32 name_length);
 | 
			
		||||
 | 
			
		||||
    // Loads the current directory, then its siblings, and then its children.
 | 
			
		||||
    void LoadDirectory(Directory& current, u32 offset);
 | 
			
		||||
    // Loads the current directory, then its children.
 | 
			
		||||
    // Returns offset of the next sibling directory to load (0xFFFFFFFF if the last directory)
 | 
			
		||||
    u32 LoadDirectory(Directory& current, u32 offset);
 | 
			
		||||
 | 
			
		||||
    // Load the file at offset, and then its siblings.
 | 
			
		||||
    void LoadFile(Directory& parent, u32 offset);
 | 
			
		||||
    // Load the file at offset.
 | 
			
		||||
    // Returns offset of the next sibling file to load (0xFFFFFFFF if the last file)
 | 
			
		||||
    u32 LoadFile(Directory& parent, u32 offset);
 | 
			
		||||
 | 
			
		||||
    // Load replace/create relocations
 | 
			
		||||
    void LoadRelocations();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user