PERFORMANCE
Changed some struct values from pointers to normal values for improved performance.
This commit is contained in:
+13
-13
@@ -18,10 +18,10 @@ type Directory struct {
|
||||
Entries []directory.Entry
|
||||
}
|
||||
|
||||
func (r *Reader) directoryFromRef(ref uint64, name string) (*Directory, error) {
|
||||
func (r *Reader) directoryFromRef(ref uint64, name string) (Directory, error) {
|
||||
i, err := r.InodeFromRef(ref)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return Directory{}, err
|
||||
}
|
||||
var blockStart uint32
|
||||
var size uint32
|
||||
@@ -36,48 +36,48 @@ func (r *Reader) directoryFromRef(ref uint64, name string) (*Directory, error) {
|
||||
size = i.Data.(inode.EDirectory).Size
|
||||
offset = i.Data.(inode.EDirectory).Offset
|
||||
default:
|
||||
return nil, errors.New("not a directory")
|
||||
return Directory{}, errors.New("not a directory")
|
||||
}
|
||||
dirRdr := metadata.NewReader(toreader.NewReader(r.r, int64(r.Superblock.DirTableStart)+int64(blockStart)), r.d)
|
||||
defer dirRdr.Close()
|
||||
_, err = dirRdr.Read(make([]byte, offset))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return Directory{}, err
|
||||
}
|
||||
entries, err := directory.ReadDirectory(dirRdr, size)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return Directory{}, err
|
||||
}
|
||||
return &Directory{
|
||||
FileBase: *r.BaseFromInode(i, name),
|
||||
return Directory{
|
||||
FileBase: r.BaseFromInode(i, name),
|
||||
Entries: entries,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (d *Directory) Open(r *Reader, path string) (*FileBase, error) {
|
||||
func (d *Directory) Open(r *Reader, path string) (FileBase, error) {
|
||||
path = filepath.Clean(path)
|
||||
if path == "." || path == "" {
|
||||
return &d.FileBase, nil
|
||||
return d.FileBase, nil
|
||||
}
|
||||
split := strings.Split(path, "/")
|
||||
i, found := slices.BinarySearchFunc(d.Entries, split[0], func(e directory.Entry, name string) int {
|
||||
return strings.Compare(e.Name, name)
|
||||
})
|
||||
if !found {
|
||||
return nil, fs.ErrNotExist
|
||||
return FileBase{}, fs.ErrNotExist
|
||||
}
|
||||
b, err := r.BaseFromEntry(d.Entries[i])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return FileBase{}, err
|
||||
}
|
||||
if len(split) == 1 {
|
||||
return b, nil
|
||||
} else if !b.IsDir() {
|
||||
return nil, fs.ErrNotExist
|
||||
return FileBase{}, fs.ErrNotExist
|
||||
}
|
||||
dir, err := b.ToDir(r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return FileBase{}, err
|
||||
}
|
||||
return dir.Open(r, strings.Join(split[1:], "/"))
|
||||
}
|
||||
|
||||
+14
-14
@@ -12,28 +12,28 @@ import (
|
||||
)
|
||||
|
||||
type FileBase struct {
|
||||
Inode *inode.Inode
|
||||
Inode inode.Inode
|
||||
Name string
|
||||
}
|
||||
|
||||
func (r *Reader) BaseFromInode(i *inode.Inode, name string) *FileBase {
|
||||
return &FileBase{Inode: i, Name: name}
|
||||
func (r *Reader) BaseFromInode(i inode.Inode, name string) FileBase {
|
||||
return FileBase{Inode: i, Name: name}
|
||||
}
|
||||
|
||||
func (r *Reader) BaseFromEntry(e directory.Entry) (*FileBase, error) {
|
||||
func (r *Reader) BaseFromEntry(e directory.Entry) (FileBase, error) {
|
||||
in, err := r.InodeFromEntry(e)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return FileBase{}, err
|
||||
}
|
||||
return &FileBase{Inode: in, Name: e.Name}, nil
|
||||
return FileBase{Inode: in, Name: e.Name}, nil
|
||||
}
|
||||
|
||||
func (r *Reader) BaseFromRef(ref uint64, name string) (*FileBase, error) {
|
||||
func (r *Reader) BaseFromRef(ref uint64, name string) (FileBase, error) {
|
||||
in, err := r.InodeFromRef(ref)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return FileBase{}, err
|
||||
}
|
||||
return &FileBase{Inode: in, Name: name}, nil
|
||||
return FileBase{Inode: in, Name: name}, nil
|
||||
}
|
||||
|
||||
func (b *FileBase) Uid(r *Reader) (uint32, error) {
|
||||
@@ -48,7 +48,7 @@ func (b *FileBase) IsDir() bool {
|
||||
return b.Inode.Type == inode.Dir || b.Inode.Type == inode.EDir
|
||||
}
|
||||
|
||||
func (b *FileBase) ToDir(r *Reader) (*Directory, error) {
|
||||
func (b *FileBase) ToDir(r *Reader) (Directory, error) {
|
||||
var blockStart uint32
|
||||
var size uint32
|
||||
var offset uint16
|
||||
@@ -62,19 +62,19 @@ func (b *FileBase) ToDir(r *Reader) (*Directory, error) {
|
||||
size = b.Inode.Data.(inode.EDirectory).Size
|
||||
offset = b.Inode.Data.(inode.EDirectory).Offset
|
||||
default:
|
||||
return nil, errors.New("not a directory")
|
||||
return Directory{}, errors.New("not a directory")
|
||||
}
|
||||
dirRdr := metadata.NewReader(toreader.NewReader(r.r, int64(r.Superblock.DirTableStart)+int64(blockStart)), r.d)
|
||||
defer dirRdr.Close()
|
||||
_, err := dirRdr.Read(make([]byte, offset))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return Directory{}, err
|
||||
}
|
||||
entries, err := directory.ReadDirectory(dirRdr, size)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return Directory{}, err
|
||||
}
|
||||
return &Directory{
|
||||
return Directory{
|
||||
FileBase: *b,
|
||||
Entries: entries,
|
||||
}, nil
|
||||
|
||||
+3
-3
@@ -7,18 +7,18 @@ import (
|
||||
"github.com/CalebQ42/squashfs/low/inode"
|
||||
)
|
||||
|
||||
func (r *Reader) InodeFromRef(ref uint64) (*inode.Inode, error) {
|
||||
func (r *Reader) InodeFromRef(ref uint64) (inode.Inode, error) {
|
||||
offset, meta := (ref>>16)+r.Superblock.InodeTableStart, ref&0xFFFF
|
||||
rdr := metadata.NewReader(toreader.NewReader(r.r, int64(offset)), r.d)
|
||||
defer rdr.Close()
|
||||
_, err := rdr.Read(make([]byte, meta))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return inode.Inode{}, err
|
||||
}
|
||||
return inode.Read(rdr, r.Superblock.BlockSize)
|
||||
}
|
||||
|
||||
func (r *Reader) InodeFromEntry(e directory.Entry) (*inode.Inode, error) {
|
||||
func (r *Reader) InodeFromEntry(e directory.Entry) (inode.Inode, error) {
|
||||
rdr := metadata.NewReader(toreader.NewReader(r.r, int64(r.Superblock.InodeTableStart)+int64(e.BlockStart)), r.d)
|
||||
defer rdr.Close()
|
||||
rdr.Read(make([]byte, e.Offset))
|
||||
|
||||
+1
-2
@@ -39,8 +39,7 @@ type Inode struct {
|
||||
Data any
|
||||
}
|
||||
|
||||
func Read(r io.Reader, blockSize uint32) (i *Inode, err error) {
|
||||
i = new(Inode)
|
||||
func Read(r io.Reader, blockSize uint32) (i Inode, err error) {
|
||||
err = binary.Read(r, binary.LittleEndian, &i.Header)
|
||||
if err != nil {
|
||||
return
|
||||
|
||||
+3
-3
@@ -32,7 +32,7 @@ var (
|
||||
type Reader struct {
|
||||
r io.ReaderAt
|
||||
d decompress.Decompressor
|
||||
Root *Directory
|
||||
Root Directory
|
||||
fragTable []fragEntry
|
||||
idTable []uint32
|
||||
exportTable []uint64
|
||||
@@ -210,10 +210,10 @@ func (r *Reader) inodeRef(i uint32) (uint64, error) {
|
||||
return r.exportTable[i], nil
|
||||
}
|
||||
|
||||
func (r *Reader) Inode(i uint32) (*inode.Inode, error) {
|
||||
func (r *Reader) Inode(i uint32) (inode.Inode, error) {
|
||||
ref, err := r.inodeRef(i)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return inode.Inode{}, err
|
||||
}
|
||||
return r.InodeFromRef(ref)
|
||||
}
|
||||
|
||||
+3
-3
@@ -88,7 +88,7 @@ func TestSingleFile(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
err = extractToDir(rdr, b, path)
|
||||
err = extractToDir(rdr, &b, path)
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
@@ -103,13 +103,13 @@ func extractToDir(rdr *squashfslow.Reader, b *squashfslow.FileBase, folder strin
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var nestBast *squashfslow.FileBase
|
||||
var nestBast squashfslow.FileBase
|
||||
for _, e := range d.Entries {
|
||||
nestBast, err = rdr.BaseFromEntry(e)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = extractToDir(rdr, nestBast, path)
|
||||
err = extractToDir(rdr, &nestBast, path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user