Skip to content

Commit 21f702e

Browse files
committed
add setter name for Shstrtab
1 parent 86cbe15 commit 21f702e

File tree

9 files changed

+52
-15
lines changed

9 files changed

+52
-15
lines changed

lib/vaporware/compiler/assembler.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# frozen_string_literal: true
22
require_relative "assembler/elf"
3+
require_relative "assembler/elf/utils"
34
require_relative "assembler/elf/header"
45
require_relative "assembler/elf/sections"
56
require_relative "assembler/elf/section_header"

lib/vaporware/compiler/assembler/elf.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ module Vaporware
22
class Compiler
33
class Assembler
44
class ELF
5-
class ERROR < StandardError; end
5+
class Error < StandardError; end
66
class Section; end
77
class SectionHeader; end
88
module Utils; end
Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,27 @@
11
class Vaporware::Compiler::Assembler::ELF::Section::Shstrtab
22
include Vaporware::Compiler::Assembler::ELF::Utils
3-
def initialize = @strtab = []
3+
def initialize = @name = []
44
def build = bytes.flatten.pack("C*")
5-
def set!(name:) = @strtab << name
5+
def set!(name:)
6+
@name << set(name)
7+
self
8+
end
9+
10+
def set(name:) = name!(name)
11+
612
private
7-
def bytes = [@strtab]
13+
def bytes = [@name]
14+
def name!(name)
15+
case name
16+
when String
17+
(name.match(/\A\0.+\0\z/) ? name : "\0#{name}\0").bytes
18+
when Array
19+
raise Vaporware::Compiler::Assembler::ELF::Error, "unaccepted type in Array" unless name.all? { |elem| elem.is_a?(Integer) }
20+
n = name
21+
n.unshift(0) && n.push(0) unless n.first == 0 && n.last == 0
22+
n
23+
else
24+
raise Vaporware::Compiler::Assembler::ELF::Error, "unsupported type" unless name.then { |elem| [Integer, Array].map.all? { |c| elem.is_a?(c) } }
25+
end
26+
end
827
end

lib/vaporware/compiler/assembler/elf/section_header.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,5 @@ def data! = set!()
3838
def symtab! = set!
3939
def strtab! = set!
4040
def bss! = set!
41-
def shsymtab! = set!
41+
def shstrtab! = set!
4242
end

lib/vaporware/compiler/assembler/elf/sections.rb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ class Vaporware::Compiler::Assembler::ELF::Sections
44
ATTRIBUTES = %i|null text data bss note symtab strtab shstrtab|
55
attr_reader *ATTRIBUTES
66
def initialize
7-
@null = Section.new(type: :null)
8-
@text = Section.new(type: :text)
9-
@data = Section.new(type: :data)
10-
@bss = Section.new(type: :bss)
11-
@note = Section.new(type: :note)
12-
@symtab = Section.new(type: :symtab)
13-
@strtab = Section.new(type: :strtab)
14-
@shstrtab = Section.new(type: :shstrtab)
7+
@null = Vaporware::Compiler::Assembler::ELF::Section.new(type: :null)
8+
@text = Vaporware::Compiler::Assembler::ELF::Section.new(type: :text)
9+
@data = Vaporware::Compiler::Assembler::ELF::Section.new(type: :data)
10+
@bss = Vaporware::Compiler::Assembler::ELF::Section.new(type: :bss)
11+
@note = Vaporware::Compiler::Assembler::ELF::Section.new(type: :note)
12+
@symtab = Vaporware::Compiler::Assembler::ELF::Section.new(type: :symtab)
13+
@strtab = Vaporware::Compiler::Assembler::ELF::Section.new(type: :strtab)
14+
@shstrtab = Vaporware::Compiler::Assembler::ELF::Section.new(type: :shstrtab)
1515
end
1616

1717
def each(&block)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
class Vaporware::Compiler::Assembler::ELF
2+
class Error
3+
end
24
end

sig/vaporware/compiler/assembler/elf/section/shstrtab.rbs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ class Vaporware::Compiler::Assembler::ELF::Section::Shstrtab
33

44
def build: () -> String
55
def set!: (name: String | Array[Integer]) -> self
6+
def set: (name: String | Array[Integer]) -> Array[Integer]?
67
private def bytes: () -> Array[Array[Integer]?]
7-
private def set_name: (String | Array[Integer]) -> Array[Integer]?
8+
private def name!: (String | Array[Integer]) -> Array[Integer]?
89
end

sig/vaporware/compiler/assembler/elf/utils.rbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module Vaporware::Utils
1+
module Vaporware::Compiler::Assembler::ELF::Utils
22
def build: () -> String
33
private def align: (Array[Integer], Integer) -> void
44
private def check: (Array[Integer]?, Integer) -> bool
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
require "vaporware"
2+
require "test/unit"
3+
4+
class Vaporware::Compiler::Assembler::ELF::Section::TestShstrtab < Test::Unit::TestCase
5+
def setup = @shstrtab = Vaporware::Compiler::Assembler::ELF::Section::Shstrtab.new
6+
def test_set_values
7+
assert_equal(@shstrtab.set(name: "main"), [0, 109, 97, 105, 110, 0])
8+
assert_equal(@shstrtab.set(name: [0, 109, 97, 105, 110, 0]), [0, 109, 97, 105, 110, 0])
9+
end
10+
def test_alert_values
11+
assert_raise(Vaporware::Compiler::Assembler::ELF::Error) { @shstrtab.set(name: :main) }
12+
assert_raise(Vaporware::Compiler::Assembler::ELF::Error) { @shstrtab.set(name: 123) }
13+
end
14+
end

0 commit comments

Comments
 (0)