Class: Vaporware::Compiler
- Inherits:
-
Object
- Object
- Vaporware::Compiler
- 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
-
#_precompile ⇒ Object
readonly
Returns the value of attribute _precompile.
-
#ast ⇒ Object
readonly
Returns the value of attribute ast.
-
#debug ⇒ Object
readonly
Returns the value of attribute debug.
-
#defined_methods ⇒ Object
readonly
Returns the value of attribute defined_methods.
-
#defined_variables ⇒ Object
readonly
Returns the value of attribute defined_variables.
-
#doned ⇒ Object
readonly
Returns the value of attribute doned.
-
#main ⇒ Object
readonly
Returns the value of attribute main.
-
#seq ⇒ Object
readonly
Returns the value of attribute seq.
-
#shared ⇒ Object
readonly
Returns the value of attribute shared.
Class Method Summary collapse
Instance Method Summary collapse
- #compile(compiler: "gcc", compiler_options: ["-O0"]) ⇒ Object
-
#initialize(source, _precompile: "tmp.s", debug: false, shared: false) ⇒ Compiler
constructor
A new instance of Compiler.
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.(source)) @ast = Parser::CurrentRuby.parse(src) @main = false end |
Instance Attribute Details
#_precompile ⇒ Object (readonly)
Returns the value of attribute _precompile.
11 12 13 |
# File 'lib/vaporware.rb', line 11 def _precompile @_precompile end |
#ast ⇒ Object (readonly)
Returns the value of attribute ast.
11 12 13 |
# File 'lib/vaporware.rb', line 11 def ast @ast end |
#debug ⇒ Object (readonly)
Returns the value of attribute debug.
11 12 13 |
# File 'lib/vaporware.rb', line 11 def debug @debug end |
#defined_methods ⇒ Object (readonly)
Returns the value of attribute defined_methods.
11 12 13 |
# File 'lib/vaporware.rb', line 11 def defined_methods @defined_methods end |
#defined_variables ⇒ Object (readonly)
Returns the value of attribute defined_variables.
11 12 13 |
# File 'lib/vaporware.rb', line 11 def defined_variables @defined_variables end |
#doned ⇒ Object (readonly)
Returns the value of attribute doned.
11 12 13 |
# File 'lib/vaporware.rb', line 11 def doned @doned end |
#main ⇒ Object (readonly)
Returns the value of attribute main.
11 12 13 |
# File 'lib/vaporware.rb', line 11 def main @main end |
#seq ⇒ Object (readonly)
Returns the value of attribute seq.
11 12 13 |
# File 'lib/vaporware.rb', line 11 def seq @seq end |
#shared ⇒ Object (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 += compile_shared_option if shared call_compiler(compiler:, compiler_options:) end |