jruby_visualizer 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/jruby_visualizer +5 -0
- data/lib/jruby_visualizer.rb +9 -0
- data/lib/jruby_visualizer/about_page.rb +64 -0
- data/lib/jruby_visualizer/ast_tree_view_builder.rb +77 -0
- data/lib/jruby_visualizer/cfg_visualizer.rb +122 -0
- data/lib/jruby_visualizer/compiler_data.rb +133 -0
- data/lib/jruby_visualizer/control_flow_graph_view.rb +96 -0
- data/lib/jruby_visualizer/core_ext/ir_scope.rb +15 -0
- data/lib/jruby_visualizer/ir_pretty_printer.rb +57 -0
- data/lib/jruby_visualizer/ir_scope_registry.rb +41 -0
- data/lib/jruby_visualizer/ir_visualizer.rb +79 -0
- data/lib/jruby_visualizer/jruby_visualizer.rb +103 -0
- data/lib/jruby_visualizer/ui/about.fxml +35 -0
- data/lib/jruby_visualizer/ui/cfg-view.fxml +42 -0
- data/lib/jruby_visualizer/ui/img/jruby-icon-32.png +0 -0
- data/lib/jruby_visualizer/ui/img/jruby-icon-64.png +0 -0
- data/lib/jruby_visualizer/ui/img/jruby-logo.png +0 -0
- data/lib/jruby_visualizer/ui/ir-view.fxml +18 -0
- data/lib/jruby_visualizer/ui/jruby-visualizer.fxml +81 -0
- data/lib/jruby_visualizer/version.rb +20 -0
- data/lib/jruby_visualizer/visualizer_compiler_pass_listener.rb +40 -0
- data/lib/jruby_visualizer/visualizer_main_app.rb +284 -0
- data/spec/compiler_data_spec.rb +102 -0
- data/spec/ir_scope_registry_spec.rb +49 -0
- data/spec/jruby_visualizer_test_utils.rb +19 -0
- data/spec/spec_helper.rb +20 -0
- metadata +110 -0
@@ -0,0 +1,15 @@
|
|
1
|
+
class Java::org::jruby::ir::IRScope
|
2
|
+
##
|
3
|
+
# Return a key for storage into the ScopeRegistry.
|
4
|
+
def key
|
5
|
+
"#{get_name}[#{get_file_name}:#{get_line_number}]".to_sym
|
6
|
+
end
|
7
|
+
|
8
|
+
##
|
9
|
+
# return the CFG and if it is not created yet construct it as
|
10
|
+
# a side-effect
|
11
|
+
def cfg!
|
12
|
+
buildCFG unless get_cfg
|
13
|
+
get_cfg
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
=begin
|
2
|
+
JRuby Visualizer
|
3
|
+
Copyright (C) 2013 The JRuby Team
|
4
|
+
|
5
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
you may not use this file except in compliance with the License.
|
7
|
+
You may obtain a copy of the License at
|
8
|
+
|
9
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
|
11
|
+
Unless required by applicable law or agreed to in writing, software
|
12
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
See the License for the specific language governing permissions and
|
15
|
+
limitations under the License.
|
16
|
+
=end
|
17
|
+
|
18
|
+
#
|
19
|
+
# Retrieve a nicely formatted string from JRuby's IRScope
|
20
|
+
#
|
21
|
+
module IRPrettyPrinter
|
22
|
+
|
23
|
+
def self.pretty_ir(scope, indent='')
|
24
|
+
instrs = if scope.cfg
|
25
|
+
# read instrs from control flow graph
|
26
|
+
scope.cfg.sorted_basic_blocks.reduce([]) do |cfg_instrs, bb|
|
27
|
+
cfg_instrs += bb.instrs
|
28
|
+
end
|
29
|
+
else
|
30
|
+
# if no pass has been executed get them directly without cfg
|
31
|
+
scope.instrs
|
32
|
+
end
|
33
|
+
pretty_str = instrs.map do |instr|
|
34
|
+
f_str = "%s\s\s%s" % [indent, instr]
|
35
|
+
f_str
|
36
|
+
end
|
37
|
+
pretty_str = [indent + scope.to_s] + pretty_str
|
38
|
+
scope.lexical_scopes.each do |lex_scope|
|
39
|
+
pretty_str += pretty_ir(lex_scope, indent + "\s" * 4)
|
40
|
+
end
|
41
|
+
pretty_str
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.print_ir(scope)
|
45
|
+
instrs = pretty_ir(scope)
|
46
|
+
instrs.each do |instr|
|
47
|
+
puts instr
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.pretty_string(scope)
|
52
|
+
instrs = pretty_ir(scope)
|
53
|
+
instrs.join("\n")
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
=begin
|
2
|
+
JRuby Visualizer
|
3
|
+
Copyright (C) 2013 The JRuby Team
|
4
|
+
|
5
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
you may not use this file except in compliance with the License.
|
7
|
+
You may obtain a copy of the License at
|
8
|
+
|
9
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
|
11
|
+
Unless required by applicable law or agreed to in writing, software
|
12
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
See the License for the specific language governing permissions and
|
15
|
+
limitations under the License.
|
16
|
+
=end
|
17
|
+
|
18
|
+
require_relative 'core_ext/ir_scope'
|
19
|
+
|
20
|
+
#
|
21
|
+
# Registry for IRScopes, to access them by key without nesting of scopes
|
22
|
+
#
|
23
|
+
class IRScopeRegistry
|
24
|
+
|
25
|
+
attr_reader :scopes
|
26
|
+
|
27
|
+
def initialize(root_scope)
|
28
|
+
@scopes = {}
|
29
|
+
fill_registry(root_scope)
|
30
|
+
end
|
31
|
+
|
32
|
+
def fill_registry(ir_scope)
|
33
|
+
@scopes[ir_scope.key] = ir_scope
|
34
|
+
ir_scope.lexical_scopes.each { |lex_scope| fill_registry(lex_scope) }
|
35
|
+
end
|
36
|
+
|
37
|
+
def clear
|
38
|
+
@scopes = {}
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
=begin
|
2
|
+
JRuby Visualizer
|
3
|
+
Copyright (C) 2013 The JRuby Team
|
4
|
+
|
5
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
you may not use this file except in compliance with the License.
|
7
|
+
You may obtain a copy of the License at
|
8
|
+
|
9
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
|
11
|
+
Unless required by applicable law or agreed to in writing, software
|
12
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
See the License for the specific language governing permissions and
|
15
|
+
limitations under the License.
|
16
|
+
=end
|
17
|
+
|
18
|
+
require 'jrubyfx'
|
19
|
+
require 'diffy'
|
20
|
+
require_relative 'ir_pretty_printer'
|
21
|
+
require_relative 'jruby_visualizer'
|
22
|
+
|
23
|
+
resource_root :images, File.join(File.dirname(__FILE__), 'ui', 'img'), 'ui/img'
|
24
|
+
fxml_root File.join(File.dirname(__FILE__), 'ui')
|
25
|
+
|
26
|
+
#
|
27
|
+
# Visualizer for JRuby's Intermediate Representation (IR)
|
28
|
+
# displaying all IR Scopes with its lexical nesting
|
29
|
+
# and
|
30
|
+
# diffs on the IR, if it has changed (after executing a compiler pass)
|
31
|
+
#
|
32
|
+
class IRVisualizer < JRubyFX::Application
|
33
|
+
|
34
|
+
def start(stage)
|
35
|
+
compiler_data = JRubyVisualizer.compiler_data
|
36
|
+
with(stage, title: 'Intermediate Representation (IR) Visualizer') do
|
37
|
+
fxml(IRVisualizerController, initialize: [compiler_data])
|
38
|
+
icons.add(Image.new(resource_url(:images, 'jruby-icon-32.png').to_s))
|
39
|
+
show
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
#
|
45
|
+
# The controller loads the UI file and takes care of the diffs and
|
46
|
+
# updating the UI
|
47
|
+
#
|
48
|
+
class IRVisualizerController
|
49
|
+
include JRubyFX::Controller
|
50
|
+
fxml 'ir-view.fxml'
|
51
|
+
|
52
|
+
attr_reader :compiler_data
|
53
|
+
|
54
|
+
def initialize(compiler_data)
|
55
|
+
@compiler_data = compiler_data
|
56
|
+
pretty_ir_string = IRPrettyPrinter.pretty_string(@compiler_data.ir_scope)
|
57
|
+
@ir_view.text = @new_ir_string = @previous_ir_string = pretty_ir_string
|
58
|
+
|
59
|
+
@compiler_data.ir_scope_property.add_invalidation_listener do |new_scope_property|
|
60
|
+
@previous_ir_string = @new_ir_string
|
61
|
+
@new_ir_string = IRPrettyPrinter.pretty_string(new_scope_property.get)
|
62
|
+
diff_string = Diffy::Diff.new(@previous_ir_string, @new_ir_string).to_s
|
63
|
+
@ir_view.text =
|
64
|
+
if diff_string.empty?
|
65
|
+
@new_ir_string
|
66
|
+
else
|
67
|
+
diff_string
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
if __FILE__ == $PROGRAM_NAME
|
75
|
+
JRubyVisualizer.compiler_data = CompilerData.new(
|
76
|
+
"a = 1 + 4 + 7;\nc = nil;\nj = 1;\ni = 3 + j;\nputs i")
|
77
|
+
IRVisualizer.launch
|
78
|
+
end
|
79
|
+
|
@@ -0,0 +1,103 @@
|
|
1
|
+
=begin
|
2
|
+
JRuby Visualizer
|
3
|
+
Copyright (C) 2013 The JRuby Team
|
4
|
+
|
5
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
you may not use this file except in compliance with the License.
|
7
|
+
You may obtain a copy of the License at
|
8
|
+
|
9
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
|
11
|
+
Unless required by applicable law or agreed to in writing, software
|
12
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
See the License for the specific language governing permissions and
|
15
|
+
limitations under the License.
|
16
|
+
=end
|
17
|
+
|
18
|
+
require 'java'
|
19
|
+
require 'jruby'
|
20
|
+
require_relative 'visualizer_compiler_pass_listener'
|
21
|
+
require_relative 'visualizer_main_app'
|
22
|
+
|
23
|
+
#
|
24
|
+
# The Visualizer module enables to launch the visualizer components via
|
25
|
+
# an API call or ARGV
|
26
|
+
#
|
27
|
+
module JRubyVisualizer
|
28
|
+
@@main_app = nil
|
29
|
+
@@compiler_data = nil
|
30
|
+
|
31
|
+
def self.compiler_data
|
32
|
+
@@compiler_data
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.compiler_data=(new_data)
|
36
|
+
@@compiler_data = new_data
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.launched?
|
40
|
+
!!@@main_app
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.launch
|
44
|
+
if launched?
|
45
|
+
return
|
46
|
+
end
|
47
|
+
unless @@compiler_data
|
48
|
+
raise 'Cannot launch Visualizer without a ComiplerData object'
|
49
|
+
end
|
50
|
+
VisualizerMainApp.launch
|
51
|
+
@@main_app = VisualizerMainApp
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.inject_pass_listener
|
55
|
+
# create and add listener
|
56
|
+
vis_pass_listener = VisualizerCompilerPassListener.new
|
57
|
+
ir_manager = JRuby::runtime.ir_manager
|
58
|
+
ir_manager.add_listener(vis_pass_listener)
|
59
|
+
|
60
|
+
# activate visualization listener
|
61
|
+
JRuby::IR.visualize = true
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.pass_listener?
|
65
|
+
JRuby::IR.visualize
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.visualize(ruby_code)
|
69
|
+
unless pass_listener?
|
70
|
+
inject_pass_listener
|
71
|
+
end
|
72
|
+
@@compiler_data = CompilerData.new(ruby_code)
|
73
|
+
# launch App with Ruby code as input
|
74
|
+
launch
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.visualize_with_argv
|
78
|
+
unless ARGV.length == 1
|
79
|
+
usage_message =
|
80
|
+
%#No ruby input for the JRuby Visualizer
|
81
|
+
Usage:
|
82
|
+
./lib/jruby_visualizer.rb "def foo; 42; end; foo"
|
83
|
+
or
|
84
|
+
./lib/jruby_visualizer.rb foo.rb#
|
85
|
+
raise usage_message
|
86
|
+
end
|
87
|
+
ruby_input = ARGV[0]
|
88
|
+
ruby_code =
|
89
|
+
if ruby_input.end_with?('.rb')
|
90
|
+
File.read(ruby_input)
|
91
|
+
else
|
92
|
+
ruby_input
|
93
|
+
end
|
94
|
+
visualize(ruby_code)
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
if __FILE__ == $PROGRAM_NAME
|
100
|
+
vis = JRubyVisualizer
|
101
|
+
vis.visualize('def foo; 42; end; foo')
|
102
|
+
end
|
103
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
|
3
|
+
<?import java.lang.*?>
|
4
|
+
<?import java.util.*?>
|
5
|
+
<?import javafx.scene.control.*?>
|
6
|
+
<?import javafx.scene.image.*?>
|
7
|
+
<?import javafx.scene.layout.*?>
|
8
|
+
<?import javafx.scene.paint.*?>
|
9
|
+
<?import javafx.scene.text.*?>
|
10
|
+
|
11
|
+
<VBox alignment="CENTER" prefHeight="300.0" prefWidth="500.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">
|
12
|
+
<children>
|
13
|
+
<HBox alignment="CENTER" prefHeight="-1.0" prefWidth="-1.0">
|
14
|
+
<children>
|
15
|
+
<Label text="JRuby:" />
|
16
|
+
<Hyperlink fx:id="jruby_hyperlink" text="www.jruby.org">
|
17
|
+
<font>
|
18
|
+
<Font name="Monospaced Regular" size="13.0" />
|
19
|
+
</font>
|
20
|
+
</Hyperlink>
|
21
|
+
</children>
|
22
|
+
</HBox>
|
23
|
+
<ImageView fx:id="jruby_logo" fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true">
|
24
|
+
<image>
|
25
|
+
<Image url="@img/jruby-logo.png" />
|
26
|
+
</image>
|
27
|
+
</ImageView>
|
28
|
+
<Hyperlink fx:id="visualizer_hyperlink" text="The JRuby Visualizer">
|
29
|
+
<font>
|
30
|
+
<Font name="System Bold" size="20.0" />
|
31
|
+
</font>
|
32
|
+
</Hyperlink>
|
33
|
+
<TextArea editable="false" prefWidth="200.0" text="visualizes JRuby's Compiler and Interpreter artifacts: - the Abstract Syntax Tree (AST) - the Intermediate Representation (IR) - the execution of compiler passes on IR - a visualization for the Control Flow Graphs (CFGs) on JRuby Scopes" wrapText="true" />
|
34
|
+
</children>
|
35
|
+
</VBox>
|
@@ -0,0 +1,42 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
|
3
|
+
<?import java.lang.*?>
|
4
|
+
<?import java.util.*?>
|
5
|
+
<?import javafx.collections.*?>
|
6
|
+
<?import javafx.geometry.*?>
|
7
|
+
<?import javafx.scene.control.*?>
|
8
|
+
<?import javafx.scene.image.*?>
|
9
|
+
<?import javafx.scene.layout.*?>
|
10
|
+
<?import javafx.scene.paint.*?>
|
11
|
+
|
12
|
+
<BorderPane prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">
|
13
|
+
<center>
|
14
|
+
<TabPane id="ir_scopes" fx:id="cfg_scopes_view" prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE" />
|
15
|
+
</center>
|
16
|
+
<padding>
|
17
|
+
<Insets />
|
18
|
+
</padding>
|
19
|
+
<top>
|
20
|
+
<HBox prefHeight="25.0" prefWidth="600.0" spacing="5.0" BorderPane.alignment="CENTER">
|
21
|
+
<children>
|
22
|
+
<Label text="Scope">
|
23
|
+
<HBox.margin>
|
24
|
+
<Insets bottom="5.0" left="5.0" top="8.0" />
|
25
|
+
</HBox.margin>
|
26
|
+
</Label>
|
27
|
+
<ComboBox fx:id="ir_scope_selector" onAction="#select_scope" prefWidth="201.0">
|
28
|
+
<items>
|
29
|
+
<FXCollections fx:factory="observableArrayList">
|
30
|
+
<String fx:value="Item 1" />
|
31
|
+
<String fx:value="Item 2" />
|
32
|
+
<String fx:value="Item 3" />
|
33
|
+
</FXCollections>
|
34
|
+
</items>
|
35
|
+
<HBox.margin>
|
36
|
+
<Insets bottom="5.0" right="5.0" top="5.0" />
|
37
|
+
</HBox.margin>
|
38
|
+
</ComboBox>
|
39
|
+
</children>
|
40
|
+
</HBox>
|
41
|
+
</top>
|
42
|
+
</BorderPane>
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
|
3
|
+
<?import java.lang.*?>
|
4
|
+
<?import java.util.*?>
|
5
|
+
<?import javafx.scene.control.*?>
|
6
|
+
<?import javafx.scene.layout.*?>
|
7
|
+
<?import javafx.scene.paint.*?>
|
8
|
+
|
9
|
+
<BorderPane prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">
|
10
|
+
<center>
|
11
|
+
<VBox prefHeight="-1.0" prefWidth="-1.0">
|
12
|
+
<children>
|
13
|
+
<Label text="IR Code:" />
|
14
|
+
<TextArea id="ir" fx:id="ir_view" editable="false" minHeight="-1.0" prefWidth="-1.0" style="-fx-font-family: monospaced" text="Script: file: -ScriptBody -[-:0] 0 %self = recv_self 1 %current_scope = scope<-> 2 %current_module = module<-> 3 line_num(0) 4 def_inst_meth("--unused--", foo, -) 5 return(nil) Method foo[-:0] 0 %self = recv_self 1 %current_scope = scope<-> 2 %current_module = module<-> 3 check_arity(0, 0, -1) 4 %block(0:0) = recv_closure 5 thread_poll 6 line_num(0) 7 %v_2 = "bar" 8 %v_3 = call(FUNCTIONAL, 'puts', %self, [%v_2]) 9 return(%v_3) " wrapText="true" VBox.vgrow="ALWAYS" />
|
15
|
+
</children>
|
16
|
+
</VBox>
|
17
|
+
</center>
|
18
|
+
</BorderPane>
|
@@ -0,0 +1,81 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
|
3
|
+
<?import java.lang.*?>
|
4
|
+
<?import java.util.*?>
|
5
|
+
<?import javafx.collections.*?>
|
6
|
+
<?import javafx.scene.control.*?>
|
7
|
+
<?import javafx.scene.layout.*?>
|
8
|
+
<?import javafx.scene.paint.*?>
|
9
|
+
|
10
|
+
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">
|
11
|
+
<center>
|
12
|
+
<SplitPane dividerPositions="0.6783625730994152" focusTraversable="true" orientation="VERTICAL" prefHeight="200.0" prefWidth="160.0">
|
13
|
+
<items>
|
14
|
+
<SplitPane dividerPositions="0.5" focusTraversable="true" prefHeight="160.0" prefWidth="200.0">
|
15
|
+
<items>
|
16
|
+
<VBox prefHeight="200.0" prefWidth="100.0">
|
17
|
+
<children>
|
18
|
+
<Label text="Abstract Syntax Tree:" />
|
19
|
+
<TreeView fx:id="ast_view" prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS" />
|
20
|
+
</children>
|
21
|
+
</VBox>
|
22
|
+
<VBox prefHeight="100.0" prefWidth="414.0">
|
23
|
+
<children>
|
24
|
+
<Label text="Ruby Source:" />
|
25
|
+
<TextArea id="ruby_source" fx:id="ruby_view" editable="false" prefHeight="258.0000999999975" prefWidth="330.0" style="-fx-font-family: monospaced" text="def foo puts "bar" end" wrapText="true" VBox.vgrow="ALWAYS" />
|
26
|
+
</children>
|
27
|
+
</VBox>
|
28
|
+
</items>
|
29
|
+
</SplitPane>
|
30
|
+
<VBox prefHeight="-1.0" prefWidth="-1.0">
|
31
|
+
<children>
|
32
|
+
<Label id="compile_information" text="Information" />
|
33
|
+
<ListView fx:id="compile_information" prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS" />
|
34
|
+
</children>
|
35
|
+
</VBox>
|
36
|
+
</items>
|
37
|
+
</SplitPane>
|
38
|
+
</center>
|
39
|
+
<top>
|
40
|
+
<VBox prefHeight="-1.0" prefWidth="-1.0">
|
41
|
+
<children>
|
42
|
+
<MenuBar>
|
43
|
+
<menus>
|
44
|
+
<Menu mnemonicParsing="false" text="File">
|
45
|
+
<items>
|
46
|
+
<MenuItem mnemonicParsing="false" onAction="#close_app" text="Close" />
|
47
|
+
</items>
|
48
|
+
</Menu>
|
49
|
+
<Menu mnemonicParsing="false" text="View">
|
50
|
+
<items>
|
51
|
+
<MenuItem mnemonicParsing="false" onAction="#launch_ir_view" text="IR View" />
|
52
|
+
<MenuItem mnemonicParsing="false" onAction="#launch_cfg_view" text="Control Flow Graph" />
|
53
|
+
</items>
|
54
|
+
</Menu>
|
55
|
+
<Menu mnemonicParsing="false" text="Help">
|
56
|
+
<items>
|
57
|
+
<MenuItem mnemonicParsing="false" onAction="#launch_about" text="About" />
|
58
|
+
</items>
|
59
|
+
</Menu>
|
60
|
+
</menus>
|
61
|
+
</MenuBar>
|
62
|
+
<ToolBar>
|
63
|
+
<items>
|
64
|
+
<Label text="IRPasses:" />
|
65
|
+
<ComboBox fx:id="ir_passes_box" onAction="#select_ir_pass">
|
66
|
+
<items>
|
67
|
+
<FXCollections fx:factory="observableArrayList">
|
68
|
+
<String fx:value="Item 1" />
|
69
|
+
<String fx:value="Item 2" />
|
70
|
+
<String fx:value="Item 3" />
|
71
|
+
</FXCollections>
|
72
|
+
</items>
|
73
|
+
</ComboBox>
|
74
|
+
<Button mnemonicParsing="false" onAction="#step_ir_pass" text="Step" />
|
75
|
+
<Button mnemonicParsing="false" onAction="#reset_passes" text="Reset" />
|
76
|
+
</items>
|
77
|
+
</ToolBar>
|
78
|
+
</children>
|
79
|
+
</VBox>
|
80
|
+
</top>
|
81
|
+
</BorderPane>
|