Class: Vaporware::Compiler

Inherits:
Object
  • Object
show all
Defined in:
lib/vaporware.rb

Overview

Your code goes hereā€¦

Constant Summary collapse

REGISTER =
%w(r9 r8 rcx rdx rsi rdi).reverse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(source, _precompile: "tmp.s", debug: false, shared: false) ⇒ Compiler

Returns a new instance of Compiler.



18
19
20
21
22
23
24
25
26
# File 'lib/vaporware.rb', line 18

def initialize(source, _precompile: "tmp.s", debug: false, shared: false)
  @_precompile, @debug, @seq, @shared = _precompile, debug, 0, shared
  @defined_methods = Set.new
  @defined_variables = Set.new
  @doned = Set.new
  src = File.read(File.expand_path(source))
  @ast = Parser::CurrentRuby.parse(src)
  @main = false
end

Instance Attribute Details

#_precompileObject (readonly)

Returns the value of attribute _precompile.



11
12
13
# File 'lib/vaporware.rb', line 11

def _precompile
  @_precompile
end

#astObject (readonly)

Returns the value of attribute ast.



11
12
13
# File 'lib/vaporware.rb', line 11

def ast
  @ast
end

#debugObject (readonly)

Returns the value of attribute debug.



11
12
13
# File 'lib/vaporware.rb', line 11

def debug
  @debug
end

#defined_methodsObject (readonly)

Returns the value of attribute defined_methods.



11
12
13
# File 'lib/vaporware.rb', line 11

def defined_methods
  @defined_methods
end

#defined_variablesObject (readonly)

Returns the value of attribute defined_variables.



11
12
13
# File 'lib/vaporware.rb', line 11

def defined_variables
  @defined_variables
end

#donedObject (readonly)

Returns the value of attribute doned.



11
12
13
# File 'lib/vaporware.rb', line 11

def doned
  @doned
end

#mainObject (readonly)

Returns the value of attribute main.



11
12
13
# File 'lib/vaporware.rb', line 11

def main
  @main
end

#seqObject (readonly)

Returns the value of attribute seq.



11
12
13
# File 'lib/vaporware.rb', line 11

def seq
  @seq
end

#sharedObject (readonly)

Returns the value of attribute shared.



11
12
13
# File 'lib/vaporware.rb', line 11

def shared
  @shared
end

Class Method Details

.compile(source, compiler: "gcc", dest: "tmp", debug: false, compiler_options: ["-O0"], shared: false) ⇒ Object



12
13
14
15
16
# File 'lib/vaporware.rb', line 12

def self.compile(source, compiler: "gcc", dest: "tmp", debug: false, compiler_options: ["-O0"], shared: false)
  _precompile = "#{dest}.s"
  s = new(source, _precompile: _precompile, debug:, shared:)
  s.compile(compiler:, compiler_options:)
end

Instance Method Details

#compile(compiler: "gcc", compiler_options: ["-O0"]) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/vaporware.rb', line 28

def compile(compiler: "gcc", compiler_options: ["-O0"])
  puts ast if debug

  register_var_and_method(ast)

  output = File.open(_precompile, "w")
  # prologue
  output.puts ".intel_syntax noprefix"
  if defined_methods.empty?
    @main = true
    output.puts ".globl main"
    output.puts "main:"
    output.puts "  push rbp"
    output.puts "  mov rbp, rsp"
    output.puts "  sub rsp, #{defined_variables.size * 8}"
    gen(ast, output)
    # epilogue
    gen_epilogue(output)
  else
    gen_prologue_methods(output)
    output.puts ".globl main" unless shared
    gen(ast, output)
    # epilogue
    gen_epilogue(output)
  end
  output.close
  compiler_options += compile_shared_option if shared
  call_compiler(compiler:, compiler_options:)
end