furnace 0.4.0.beta.1 → 0.4.0.beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +6 -0
  3. data/INSTRUMENT.md +250 -0
  4. data/Rakefile +1 -1
  5. data/lib/furnace.rb +10 -6
  6. data/lib/furnace/ast/node.rb +15 -1
  7. data/lib/furnace/awesome_printer.rb +121 -0
  8. data/lib/furnace/context.rb +0 -0
  9. data/lib/furnace/ssa.rb +7 -25
  10. data/lib/furnace/ssa/argument.rb +14 -10
  11. data/lib/furnace/ssa/basic_block.rb +70 -25
  12. data/lib/furnace/ssa/builder.rb +11 -7
  13. data/lib/furnace/ssa/constant.rb +19 -11
  14. data/lib/furnace/ssa/event_stream.rb +145 -0
  15. data/lib/furnace/ssa/function.rb +78 -57
  16. data/lib/furnace/ssa/generic_instruction.rb +12 -5
  17. data/lib/furnace/ssa/instruction.rb +50 -35
  18. data/lib/furnace/ssa/instruction_syntax.rb +9 -25
  19. data/lib/furnace/ssa/instructions/branch.rb +2 -2
  20. data/lib/furnace/ssa/instructions/phi.rb +12 -10
  21. data/lib/furnace/ssa/instructions/return.rb +3 -3
  22. data/lib/furnace/ssa/instructions/return_value.rb +11 -0
  23. data/lib/furnace/ssa/instrumentation.rb +33 -0
  24. data/lib/furnace/ssa/module.rb +5 -1
  25. data/lib/furnace/ssa/named_value.rb +31 -10
  26. data/lib/furnace/ssa/terminator_instruction.rb +6 -6
  27. data/lib/furnace/ssa/types/basic_block.rb +4 -8
  28. data/lib/furnace/ssa/types/function.rb +4 -8
  29. data/lib/furnace/ssa/user.rb +14 -15
  30. data/lib/furnace/ssa/value.rb +9 -5
  31. data/lib/furnace/transform/iterative.rb +20 -4
  32. data/lib/furnace/type.rb +9 -0
  33. data/lib/furnace/type/bottom.rb +11 -0
  34. data/lib/furnace/type/top.rb +72 -0
  35. data/lib/furnace/type/value.rb +13 -0
  36. data/lib/furnace/type/variable.rb +61 -0
  37. data/lib/furnace/version.rb +1 -1
  38. data/test/{test_helper.rb → helper.rb} +28 -3
  39. data/test/{ast_test.rb → test_ast.rb} +13 -1
  40. data/test/test_awesome_printer.rb +148 -0
  41. data/test/{ssa_test.rb → test_ssa.rb} +276 -315
  42. data/test/{transform_test.rb → test_transform.rb} +2 -2
  43. data/test/test_type.rb +138 -0
  44. metadata +83 -105
  45. data/lib/furnace/graphviz.rb +0 -49
  46. data/lib/furnace/ssa/generic_type.rb +0 -16
  47. data/lib/furnace/ssa/pretty_printer.rb +0 -113
  48. data/lib/furnace/ssa/type.rb +0 -27
  49. data/lib/furnace/ssa/types/void.rb +0 -15
@@ -1,16 +0,0 @@
1
- module Furnace
2
- class SSA::GenericType < SSA::Type
3
- def parameters
4
- nil
5
- end
6
-
7
- def ==(other)
8
- other.instance_of?(self.class) &&
9
- other.parameters == parameters
10
- end
11
-
12
- def hash
13
- [self.class, parameters].hash
14
- end
15
- end
16
- end
@@ -1,113 +0,0 @@
1
- require 'ansi'
2
-
3
- module Furnace
4
- class SSA::PrettyPrinter
5
- @colorize = true
6
-
7
- class << self
8
- attr_accessor :colorize
9
- end
10
-
11
- def initialize(colorize=self.class.colorize)
12
- @colorize = colorize
13
- @buffer = ""
14
- @need_space = false
15
-
16
- yield self if block_given?
17
- end
18
-
19
- def to_s
20
- @buffer
21
- end
22
-
23
- alias to_str to_s
24
-
25
- def ==(other)
26
- to_s == other
27
- end
28
-
29
- def =~(other)
30
- to_s =~ other
31
- end
32
-
33
- def <<(what)
34
- @buffer << what
35
-
36
- self
37
- end
38
-
39
- def text(*what)
40
- what = what.map(&:to_s)
41
- return if what.all?(&:empty?)
42
-
43
- ensure_space do
44
- self << what.join
45
- end
46
- end
47
-
48
- def newline
49
- @need_space = false
50
-
51
- self << "\n"
52
- end
53
-
54
- def name(what)
55
- text '%', what
56
- end
57
-
58
- def type(what)
59
- text with_ansi(:green) { Furnace::SSA.inspect_type(what) }
60
- end
61
-
62
- def keyword(what)
63
- text with_ansi(:bright, :white) { what.to_s }
64
- end
65
-
66
- def keyword_invalid(what)
67
- if @colorize
68
- text with_ansi(:bright, :red) { what.to_s }
69
- else
70
- text "!#{what}".to_s
71
- end
72
- end
73
-
74
- def objects(objects, separator=",", printer=:pretty_print)
75
- objects.each_with_index do |object, index|
76
- object.send(printer, self)
77
-
78
- self << separator if index < objects.count - 1
79
- end
80
-
81
- self
82
- end
83
-
84
- def values(values, separator=",")
85
- objects(values, separator, :inspect_as_value)
86
- end
87
-
88
- protected
89
-
90
- def with_ansi(*colors)
91
- string = yield
92
-
93
- if @colorize
94
- ANSI::Code.ansi(yield, *colors)
95
- else
96
- yield
97
- end
98
- end
99
-
100
- def ensure_space(need_space_after=true)
101
- if @need_space
102
- self << " "
103
- @need_space = false
104
- end
105
-
106
- yield
107
-
108
- @need_space = need_space_after
109
-
110
- self
111
- end
112
- end
113
- end
@@ -1,27 +0,0 @@
1
- module Furnace
2
- class SSA::Type
3
- def to_type
4
- self
5
- end
6
-
7
- def monotype?
8
- true
9
- end
10
-
11
- def ==(other)
12
- other.instance_of?(self.class)
13
- end
14
-
15
- def hash
16
- [self.class].hash
17
- end
18
-
19
- def eql?(other)
20
- self == other
21
- end
22
-
23
- def subtype_of?(other)
24
- self == other
25
- end
26
- end
27
- end
@@ -1,15 +0,0 @@
1
- module Furnace
2
- class SSA::VoidType < SSA::Type
3
- def inspect
4
- 'void'
5
- end
6
-
7
- def self.instance
8
- @instance ||= new
9
- end
10
-
11
- def self.value
12
- @value ||= SSA::Constant.new(instance, nil)
13
- end
14
- end
15
- end