rubinius-compiler 2.3.1 → 3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rubinius/code/compiler.rb +10 -0
  3. data/lib/rubinius/{compiler → code/compiler}/compiled_file.rb +0 -0
  4. data/lib/rubinius/{compiler → code/compiler}/compiler.rb +0 -0
  5. data/lib/rubinius/{compiler → code/compiler}/evaluator.rb +0 -0
  6. data/lib/rubinius/{compiler → code/compiler}/generator.rb +0 -0
  7. data/lib/rubinius/{compiler → code/compiler}/generator_methods.rb +0 -0
  8. data/lib/rubinius/{compiler → code/compiler}/iseq.rb +0 -0
  9. data/lib/rubinius/{compiler → code/compiler}/locals.rb +0 -0
  10. data/lib/rubinius/{compiler → code/compiler}/opcodes.rb +0 -0
  11. data/lib/rubinius/{compiler → code/compiler}/printers.rb +0 -0
  12. data/lib/rubinius/{compiler → code/compiler}/stages.rb +0 -0
  13. data/lib/rubinius/{compiler → code/compiler}/version.rb +1 -1
  14. metadata +23 -271
  15. data/.gitignore +0 -17
  16. data/.travis.yml +0 -8
  17. data/Gemfile +0 -4
  18. data/LICENSE +0 -25
  19. data/README.md +0 -29
  20. data/Rakefile +0 -1
  21. data/lib/rubinius/compiler.rb +0 -10
  22. data/rubinius-compiler.gemspec +0 -28
  23. data/spec/alias_spec.rb +0 -39
  24. data/spec/and_spec.rb +0 -44
  25. data/spec/array_spec.rb +0 -110
  26. data/spec/attrasgn_spec.rb +0 -186
  27. data/spec/back_ref_spec.rb +0 -11
  28. data/spec/call_spec.rb +0 -580
  29. data/spec/case_spec.rb +0 -576
  30. data/spec/cdecl_spec.rb +0 -70
  31. data/spec/class_spec.rb +0 -120
  32. data/spec/colon2_spec.rb +0 -8
  33. data/spec/colon3_spec.rb +0 -8
  34. data/spec/const_spec.rb +0 -7
  35. data/spec/custom/guards/profiler.rb +0 -18
  36. data/spec/custom/helpers/generator.rb +0 -828
  37. data/spec/custom/matchers/compile_as.rb +0 -46
  38. data/spec/custom/mspec.rb +0 -15
  39. data/spec/custom/runner/actions/debug.rb +0 -10
  40. data/spec/custom/runner/actions/gcstats.rb +0 -17
  41. data/spec/custom/runner/actions/memory.rb +0 -11
  42. data/spec/custom/runner/actions/parser.rb +0 -14
  43. data/spec/custom/runner/actions/profiler.rb +0 -19
  44. data/spec/custom/runner/relates.rb +0 -86
  45. data/spec/custom/utils/options.rb +0 -40
  46. data/spec/custom/utils/script.rb +0 -50
  47. data/spec/cvar_spec.rb +0 -39
  48. data/spec/cvasgn_spec.rb +0 -33
  49. data/spec/cvdecl_spec.rb +0 -17
  50. data/spec/defined_spec.rb +0 -616
  51. data/spec/defn_spec.rb +0 -732
  52. data/spec/defs_spec.rb +0 -113
  53. data/spec/dot2_spec.rb +0 -16
  54. data/spec/dot3_spec.rb +0 -17
  55. data/spec/dregx_spec.rb +0 -160
  56. data/spec/dstr_spec.rb +0 -424
  57. data/spec/dsym_spec.rb +0 -18
  58. data/spec/dxstr_spec.rb +0 -24
  59. data/spec/ensure_spec.rb +0 -196
  60. data/spec/false_spec.rb +0 -7
  61. data/spec/flip2_spec.rb +0 -21
  62. data/spec/flip3_spec.rb +0 -12
  63. data/spec/for_spec.rb +0 -228
  64. data/spec/gasgn_spec.rb +0 -15
  65. data/spec/generator/encode_spec.rb +0 -34
  66. data/spec/gvar_spec.rb +0 -37
  67. data/spec/hash_spec.rb +0 -108
  68. data/spec/iasgn_spec.rb +0 -26
  69. data/spec/if_spec.rb +0 -415
  70. data/spec/iter_spec.rb +0 -1011
  71. data/spec/lasgn_spec.rb +0 -561
  72. data/spec/lit_spec.rb +0 -61
  73. data/spec/masgn_spec.rb +0 -1558
  74. data/spec/match2_spec.rb +0 -42
  75. data/spec/match3_spec.rb +0 -54
  76. data/spec/match_spec.rb +0 -29
  77. data/spec/module_spec.rb +0 -73
  78. data/spec/nil_spec.rb +0 -7
  79. data/spec/not_spec.rb +0 -47
  80. data/spec/nth_ref_spec.rb +0 -7
  81. data/spec/op_asgn_spec.rb +0 -563
  82. data/spec/or_spec.rb +0 -126
  83. data/spec/postexe_spec.rb +0 -11
  84. data/spec/preexe_spec.rb +0 -21
  85. data/spec/regex_spec.rb +0 -54
  86. data/spec/rescue_spec.rb +0 -763
  87. data/spec/return_spec.rb +0 -152
  88. data/spec/sclass_spec.rb +0 -138
  89. data/spec/spec_helper.rb +0 -12
  90. data/spec/str_spec.rb +0 -118
  91. data/spec/super_spec.rb +0 -170
  92. data/spec/transforms/assembly_spec.rb +0 -195
  93. data/spec/transforms/block_given_spec.rb +0 -75
  94. data/spec/transforms/fast_coerce_spec.rb +0 -112
  95. data/spec/transforms/fast_new_spec.rb +0 -255
  96. data/spec/transforms/invoke_primitive_spec.rb +0 -14
  97. data/spec/transforms/kernel_methods_spec.rb +0 -29
  98. data/spec/transforms/primitive_spec.rb +0 -33
  99. data/spec/transforms/privately_spec.rb +0 -24
  100. data/spec/true_spec.rb +0 -7
  101. data/spec/undef_spec.rb +0 -133
  102. data/spec/until_spec.rb +0 -254
  103. data/spec/valias_spec.rb +0 -11
  104. data/spec/while_spec.rb +0 -494
  105. data/spec/xstr_spec.rb +0 -10
  106. data/spec/yield_spec.rb +0 -92
  107. data/spec/zsuper_spec.rb +0 -63
@@ -1,46 +0,0 @@
1
- require 'spec/custom/helpers/generator'
2
-
3
- # The CompileAsMatcher wraps the logic for checking that a string of Ruby code
4
- # is converted to the expected bytecode. It is combined with the #compile_as
5
- # spec helper and enables specs of the form:
6
- #
7
- # "a = 1".should compile_as(<some bytecode>)
8
- #
9
- class CompileAsMatcher
10
- def initialize(expected, plugins)
11
- @expected = expected
12
- @plugins = plugins
13
- end
14
-
15
- def matches?(actual)
16
- @actual = Rubinius::ToolSets::Spec::Compiler.compile_test_bytecode actual, @plugins
17
- @actual == @expected
18
- end
19
-
20
- def diff(actual, expected)
21
- actual = actual.pretty_inspect.each_line.to_a
22
- expected = expected.pretty_inspect.each_line.to_a
23
-
24
- line = actual.each_with_index do |item, index|
25
- break index unless item == expected[index]
26
- end
27
-
28
- /^( +)/ =~ actual[line]
29
- marker = "#{' ' * $1.size if $1}^ differs\n\n"
30
- actual.insert line+1, marker
31
- expected.insert line+1, marker
32
-
33
- return actual.join, expected.join
34
- end
35
-
36
- def failure_message
37
- actual, expected = diff @actual, @expected
38
- ["Expected:\n#{actual}\n", "to equal:\n#{expected}"]
39
- end
40
- end
41
-
42
- class Object
43
- def compile_as(bytecode, *plugins)
44
- CompileAsMatcher.new bytecode, plugins
45
- end
46
- end
data/spec/custom/mspec.rb DELETED
@@ -1,15 +0,0 @@
1
- require 'spec/custom/utils/options'
2
-
3
- if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
4
- require 'spec/custom/matchers/compile_as'
5
- require 'spec/custom/helpers/generator'
6
- require 'spec/custom/guards/profiler'
7
- require 'spec/custom/runner/relates'
8
- require 'spec/custom/runner/actions/debug'
9
- require 'spec/custom/runner/actions/gcstats'
10
- require 'spec/custom/runner/actions/memory'
11
- require 'spec/custom/runner/actions/parser'
12
- require 'spec/custom/runner/actions/profiler'
13
- end
14
-
15
- require 'spec/custom/utils/script'
@@ -1,10 +0,0 @@
1
- class DebugAction < ActionFilter
2
- def initialize(tags=nil, descs=nil)
3
- super
4
- require 'rubinius/debugger'
5
- end
6
-
7
- def before(state)
8
- Rubinius::Debugger.start if self === state.description
9
- end
10
- end
@@ -1,17 +0,0 @@
1
- # Custom MSpec action that prints GC stats after a spec run
2
- #
3
- class GCStatsAction
4
- def register
5
- MSpec.register :start, self
6
- MSpec.register :finish, self
7
- end
8
-
9
- def start
10
- @stats = Rubinius::Stats::GC.new
11
- @stats.clear
12
- end
13
-
14
- def finish
15
- @stats.show
16
- end
17
- end
@@ -1,11 +0,0 @@
1
- class MemoryAction
2
- def register
3
- MSpec.register :finish, self
4
- end
5
-
6
- def finish
7
- require 'rubinius/analyst'
8
-
9
- puts "\nTotal memory: #{Rubinius::Analyst.new.total_memory}"
10
- end
11
- end
@@ -1,14 +0,0 @@
1
- class Parser19Action
2
- def register
3
- MSpec.register :load, self
4
- MSpec.register :unload, self
5
- end
6
-
7
- def load
8
- SpecGuard.ruby_version_override = "1.9.2"
9
- end
10
-
11
- def unload
12
- SpecGuard.ruby_version_override = nil
13
- end
14
- end
@@ -1,19 +0,0 @@
1
- # Custom MSpec action that prints profiler stats after a spec run
2
- #
3
- class ProfilerAction
4
- def register
5
- MSpec.register :start, self
6
- MSpec.register :finish, self
7
- end
8
-
9
- def start
10
- @profiler = Rubinius::Profiler::Instrumenter.new(
11
- :sort => [:self_seconds, :calls])
12
- @profiler.start
13
- end
14
-
15
- def finish
16
- @profiler.stop
17
- @profiler.show
18
- end
19
- end
@@ -1,86 +0,0 @@
1
- # SpecDataRelation enables concise specs that involve several different forms
2
- # of the same data. This is specifically useful for the parser and compiler
3
- # specs where the output of each stage is essentially related to the input
4
- # Ruby source. Together with the #relates spec method, it enables specs like:
5
- #
6
- # describe "An If node" do
7
- # relates "a if b" do
8
- # parse do
9
- # # return the expected sexp
10
- # end
11
- #
12
- # compile do |g|
13
- # # return the expected bytecode
14
- # end
15
- #
16
- # jit do |as|
17
- # # return the expected asm/machine code
18
- # end
19
- # end
20
- #
21
- # relates "if a; b; end" do
22
- # # ...
23
- # end
24
- # end
25
-
26
- class SpecDataRelation
27
- # Provides a simple configurability so that any one or more of the possible
28
- # processes can be run. See the custom options in custom/utils/options.rb.
29
- def self.enable(process)
30
- @processors ||= []
31
- @processors << process
32
- end
33
-
34
- # Returns true if no process is specifically set or if +process+ is in the
35
- # list of enabled processes. In other words, all processes are enabled by
36
- # default, or any combination of them may be enabled.
37
- def self.enabled?(process)
38
- @processors.nil? or @processors.include?(process)
39
- end
40
-
41
- def initialize(ruby)
42
- @ruby = ruby
43
- end
44
-
45
- # Formats the Ruby source code for reabable output in the -fs formatter
46
- # option. If the source contains no newline characters, wraps the source in
47
- # single quotes to set if off from the rest of the description string. If
48
- # the source does contain newline characters, sets the indent level to four
49
- # characters.
50
- def format(ruby)
51
- if /\n/ =~ ruby
52
- lines = ruby.rstrip.each_line.to_a
53
- if /( *)/ =~ lines.first
54
- if $1.size > 4
55
- dedent = $1.size - 4
56
- ruby = lines.map { |l| l[dedent..-1] }.join
57
- else
58
- indent = " " * (4 - $1.size)
59
- ruby = lines.map { |l| "#{indent}#{l}" }.join
60
- end
61
- end
62
- "\n#{ruby}"
63
- else
64
- "'#{ruby}'"
65
- end
66
- end
67
-
68
- # Creates spec example blocks if the compile process is enabled.
69
- def compile(*plugins, &block)
70
- return unless self.class.enabled? :compiler
71
-
72
- ruby = @ruby
73
- it "is compiled from #{format ruby}" do
74
- generator = Rubinius::TestGenerator.new
75
- generator.instance_eval(&block)
76
-
77
- ruby.should compile_as(generator, *plugins)
78
- end
79
- end
80
- end
81
-
82
- class Object
83
- def relates(str, &block)
84
- SpecDataRelation.new(str).instance_eval(&block)
85
- end
86
- end
@@ -1,40 +0,0 @@
1
- # Custom MSpec options
2
- #
3
- class MSpecOptions
4
- def compiler
5
- on("--compiler", "Run only the compile part of the compiler specs") do
6
- SpecDataRelation.enable :compiler
7
- end
8
- end
9
-
10
- def parser_19
11
- on("--parser-1.9", "Run the compiler specs with the 1.9 parser") do
12
- require 'spec/custom/matchers/compile_as_19'
13
- config[:parser_19] = true
14
- end
15
- end
16
-
17
- def memory
18
- on("--memory", "Display total memory in use before exiting") do
19
- config[:memory] = true
20
- end
21
- end
22
-
23
- def gc_stats
24
- on("--gc-stats", "Show GC stats at the end") do
25
- config[:gc_stats] = true
26
- end
27
- end
28
-
29
- def profiler
30
- on("--profiler", "Show profiler data at the end") do
31
- config[:profiler] = true
32
- end
33
- end
34
-
35
- def agent
36
- on("--agent", "Start the Rubinius agent") do
37
- config[:launch] << "-Xagent.start"
38
- end
39
- end
40
- end
@@ -1,50 +0,0 @@
1
- # Registers custom actions, etc. for all MSpec scripts
2
- #
3
- class MSpecScript
4
- def custom_register
5
- GCStatsAction.new.register if config[:gc_stats]
6
- ProfilerAction.new.register if config[:profiler]
7
- Parser19Action.new.register if config[:parser_19]
8
- MemoryAction.new.register if config[:memory]
9
- end
10
- end
11
-
12
- # Custom options for mspec
13
- #
14
- class MSpecMain
15
- def custom_options(options)
16
- options.agent
17
- end
18
- end
19
-
20
- # Custom options for mspec-run
21
- #
22
- class MSpecRun
23
- def custom_options(options)
24
- options.compiler
25
- options.parser_19
26
- options.memory
27
- options.gc_stats
28
- options.profiler
29
- end
30
- end
31
-
32
- # Custom options for mspec-ci
33
- #
34
- class MSpecCI
35
- def custom_options(options)
36
- options.compiler
37
- options.parser_19
38
- options.memory
39
- options.gc_stats
40
- options.profiler
41
- end
42
- end
43
-
44
- # Custom options for mspec-tag
45
- #
46
- class MSpecTag
47
- def custom_options(options)
48
- options.compiler
49
- end
50
- end
data/spec/cvar_spec.rb DELETED
@@ -1,39 +0,0 @@
1
- describe "A Cvar node" do
2
- relates "@@x" do
3
- compile do |g|
4
- g.push_scope
5
- g.push_literal :@@x
6
- g.send :class_variable_get, 1
7
- end
8
- end
9
-
10
- relates <<-ruby do
11
- class A
12
- @@a
13
- end
14
- ruby
15
-
16
- compile do |g|
17
- in_class :A do |d|
18
- d.push :self
19
- d.push_literal :@@a
20
- d.send :class_variable_get, 1
21
- end
22
- end
23
- end
24
-
25
- relates <<-ruby do
26
- module M
27
- @@a
28
- end
29
- ruby
30
-
31
- compile do |g|
32
- in_module :M do |d|
33
- d.push :self
34
- d.push_literal :@@a
35
- d.send :class_variable_get, 1
36
- end
37
- end
38
- end
39
- end
data/spec/cvasgn_spec.rb DELETED
@@ -1,33 +0,0 @@
1
- describe "A Cvasgn node" do
2
- relates <<-ruby do
3
- def x
4
- @@blah = 1
5
- end
6
- ruby
7
-
8
- compile do |g|
9
- in_method :x do |d|
10
- d.push_scope
11
- d.push_literal :@@blah
12
- d.push 1
13
- d.send :class_variable_set, 2
14
- end
15
- end
16
- end
17
-
18
- relates <<-ruby do
19
- def self.quiet_mode=(boolean)
20
- @@quiet_mode = boolean
21
- end
22
- ruby
23
-
24
- compile do |g|
25
- in_singleton_method :quiet_mode=, [:push, :self] do |d|
26
- d.push_scope
27
- d.push_literal :@@quiet_mode
28
- d.push_local 0
29
- d.send :class_variable_set, 2
30
- end
31
- end
32
- end
33
- end
data/spec/cvdecl_spec.rb DELETED
@@ -1,17 +0,0 @@
1
- describe "A Cvdecl node" do
2
- relates <<-ruby do
3
- class X
4
- @@blah = 1
5
- end
6
- ruby
7
-
8
- compile do |g|
9
- in_class :X do |d|
10
- d.push :self
11
- d.push_literal :@@blah
12
- d.push 1
13
- d.send :class_variable_set, 2
14
- end
15
- end
16
- end
17
- end
data/spec/defined_spec.rb DELETED
@@ -1,616 +0,0 @@
1
- describe "A Defined node" do
2
- relates "defined? $x" do
3
- compile do |g|
4
- f = g.new_label
5
- done = g.new_label
6
-
7
- g.push_rubinius
8
- g.find_const :Globals
9
- g.push_literal :$x
10
- g.send :key?, 1
11
- g.gif f
12
- g.push_literal "global-variable"
13
- g.goto done
14
-
15
- f.set!
16
- g.push :nil
17
-
18
- done.set!
19
- end
20
- end
21
-
22
- relates "defined? a" do
23
- compile do |g|
24
- f = g.new_label
25
- done = g.new_label
26
-
27
- g.push :self
28
- g.push_literal :a
29
- g.push :true
30
- g.send :__respond_to_p__, 2
31
- g.gif f
32
- g.push_literal "method"
33
- g.goto done
34
-
35
- f.set!
36
- g.push :nil
37
-
38
- done.set!
39
- end
40
- end
41
-
42
- relates <<-ruby do
43
- a = 1
44
- defined? a
45
- ruby
46
-
47
- compile do |g|
48
- g.push 1
49
- g.set_local 0
50
- g.pop
51
-
52
- g.push_literal "local-variable"
53
- end
54
- end
55
-
56
- relates "defined? x = 1" do
57
- compile do |g|
58
- g.push_literal "assignment"
59
- end
60
- end
61
-
62
- relates "defined? x += 1" do
63
- compile do |g|
64
- g.push_literal "assignment"
65
- end
66
- end
67
-
68
- relates "defined? x ||= 1" do
69
- compile do |g|
70
- g.push_literal "assignment"
71
- end
72
- end
73
-
74
- relates "defined? x &&= 1" do
75
- compile do |g|
76
- g.push_literal "assignment"
77
- end
78
- end
79
-
80
- relates "defined? X" do
81
- compile do |g|
82
- g.push_exception_state
83
- outer_exc_state = g.new_stack_local
84
- g.set_stack_local outer_exc_state
85
- g.pop
86
-
87
- f = g.new_label
88
- done = g.new_label
89
-
90
- ex = g.new_label
91
- ok = g.new_label
92
- g.setup_unwind ex
93
-
94
- g.push_literal :X
95
- g.invoke_primitive :vm_const_defined, 1
96
- g.pop_unwind
97
- g.goto ok
98
-
99
- ex.set!
100
- g.clear_exception
101
- g.push_stack_local outer_exc_state
102
- g.restore_exception_state
103
- g.goto f
104
-
105
- ok.set!
106
- g.pop
107
- g.push_literal "constant"
108
- g.goto done
109
-
110
- f.set!
111
- g.push :nil
112
-
113
- done.set!
114
- end
115
- end
116
-
117
- relates "defined? ::X" do
118
- compile do |g|
119
- g.push_exception_state
120
- outer_exc_state = g.new_stack_local
121
- g.set_stack_local outer_exc_state
122
- g.pop
123
-
124
- f = g.new_label
125
- done = g.new_label
126
-
127
- ex = g.new_label
128
- ok = g.new_label
129
- g.setup_unwind ex
130
-
131
- g.push_cpath_top
132
- g.push_literal :X
133
- g.push :false
134
- g.invoke_primitive :vm_const_defined_under, 3
135
- g.pop_unwind
136
- g.goto ok
137
-
138
- ex.set!
139
- g.clear_exception
140
- g.push_stack_local outer_exc_state
141
- g.restore_exception_state
142
- g.goto f
143
-
144
- ok.set!
145
- g.pop
146
- g.push_literal "constant"
147
- g.goto done
148
-
149
- f.set!
150
- g.push :nil
151
-
152
- done.set!
153
- end
154
- end
155
-
156
- relates "defined? X::Y" do
157
- compile do |g|
158
- g.push_exception_state
159
- outer_exc_state = g.new_stack_local
160
- g.set_stack_local outer_exc_state
161
- g.pop
162
-
163
- f = g.new_label
164
- done = g.new_label
165
-
166
- ex = g.new_label
167
- ok = g.new_label
168
- g.setup_unwind ex
169
-
170
- g.push_const :X
171
- g.push_literal :Y
172
- g.push :false
173
- g.invoke_primitive :vm_const_defined_under, 3
174
- g.pop_unwind
175
- g.goto ok
176
-
177
- ex.set!
178
- g.clear_exception
179
- g.push_stack_local outer_exc_state
180
- g.restore_exception_state
181
- g.goto f
182
-
183
- ok.set!
184
- g.pop
185
- g.push_literal "constant"
186
- g.goto done
187
-
188
- f.set!
189
- g.push :nil
190
-
191
- done.set!
192
- end
193
- end
194
-
195
- relates "defined? X::Y::Z" do
196
- compile do |g|
197
- g.push_exception_state
198
- outer_exc_state = g.new_stack_local
199
- g.set_stack_local outer_exc_state
200
- g.pop
201
-
202
- f = g.new_label
203
- done = g.new_label
204
-
205
- ex = g.new_label
206
- ok = g.new_label
207
- g.setup_unwind ex
208
-
209
- g.push_const :X
210
- g.find_const :Y
211
- g.push_literal :Z
212
- g.push :false
213
- g.invoke_primitive :vm_const_defined_under, 3
214
- g.pop_unwind
215
- g.goto ok
216
-
217
- ex.set!
218
- g.clear_exception
219
- g.push_stack_local outer_exc_state
220
- g.restore_exception_state
221
- g.goto f
222
-
223
- ok.set!
224
- g.pop
225
- g.push_literal "constant"
226
- g.goto done
227
-
228
- f.set!
229
- g.push :nil
230
-
231
- done.set!
232
- end
233
- end
234
-
235
- relates "defined? self::A" do
236
- compile do |g|
237
- g.push_exception_state
238
- outer_exc_state = g.new_stack_local
239
- g.set_stack_local outer_exc_state
240
- g.pop
241
-
242
- f = g.new_label
243
- done = g.new_label
244
-
245
- ex = g.new_label
246
- ok = g.new_label
247
- g.setup_unwind ex
248
-
249
- g.push :self
250
- g.push_literal :A
251
- g.push :false
252
- g.invoke_primitive :vm_const_defined_under, 3
253
- g.pop_unwind
254
- g.goto ok
255
-
256
- ex.set!
257
- g.clear_exception
258
- g.push_stack_local outer_exc_state
259
- g.restore_exception_state
260
- g.goto f
261
-
262
- ok.set!
263
- g.pop
264
- g.push_literal "constant"
265
- g.goto done
266
-
267
- f.set!
268
- g.push :nil
269
-
270
- done.set!
271
- end
272
- end
273
-
274
- relates "defined? self" do
275
- compile do |g|
276
- g.push_literal "self"
277
- end
278
- end
279
-
280
- relates "defined? true" do
281
- compile do |g|
282
- g.push_literal "true"
283
- end
284
- end
285
-
286
- relates "defined? false" do
287
- compile do |g|
288
- g.push_literal "false"
289
- end
290
- end
291
-
292
- relates "defined? nil" do
293
- compile do |g|
294
- g.push_literal "nil"
295
- end
296
- end
297
-
298
- relates "defined? @var" do
299
- compile do |g|
300
- f = g.new_label
301
- done = g.new_label
302
-
303
- g.push :self
304
- g.push_literal :@var
305
- g.send :__instance_variable_defined_p__, 1
306
- g.gif f
307
- g.push_literal "instance-variable"
308
- g.goto done
309
-
310
- f.set!
311
- g.push :nil
312
-
313
- done.set!
314
- end
315
- end
316
-
317
- relates "defined? @@var" do
318
- compile do |g|
319
- f = g.new_label
320
- done = g.new_label
321
-
322
- g.push_scope
323
- g.push_literal :@@var
324
- g.send :class_variable_defined?, 1
325
- g.gif f
326
- g.push_literal "class variable"
327
- g.goto done
328
-
329
- f.set!
330
- g.push :nil
331
-
332
- done.set!
333
- end
334
- end
335
-
336
- relates "defined? :a" do
337
- compile do |g|
338
- g.push_literal "expression"
339
- end
340
- end
341
-
342
- relates "defined? 'a'" do
343
- compile do |g|
344
- g.push_literal "expression"
345
- end
346
- end
347
-
348
- relates "defined? 0" do
349
- compile do |g|
350
- g.push_literal "expression"
351
- end
352
- end
353
-
354
- relates "defined? yield" do
355
- compile do |g|
356
- t = g.new_label
357
- f = g.new_label
358
-
359
- g.push_block
360
- g.git t
361
- g.push :nil
362
- g.goto f
363
-
364
- t.set!
365
- g.push_literal "yield"
366
-
367
- f.set!
368
- end
369
- end
370
-
371
- relates "defined? A.m" do
372
- compile do |g|
373
- g.push_exception_state
374
- outer_exc_state = g.new_stack_local
375
- g.set_stack_local outer_exc_state
376
- g.pop
377
-
378
- f = g.new_label
379
- done = g.new_label
380
-
381
- ex = g.new_label
382
- ok = g.new_label
383
- g.setup_unwind ex
384
-
385
- g.push_literal :A
386
- g.invoke_primitive :vm_const_defined, 1
387
-
388
- g.pop_unwind
389
- g.goto ok
390
-
391
- ex.set!
392
- g.clear_exception
393
- g.push_stack_local outer_exc_state
394
- g.restore_exception_state
395
- g.goto f
396
-
397
- ok.set!
398
- g.push_literal :m
399
- g.push_self
400
- g.invoke_primitive :vm_check_callable, 3
401
- g.gif f
402
- g.push_literal "method"
403
- g.goto done
404
-
405
- f.set!
406
- g.push :nil
407
-
408
- done.set!
409
- end
410
- end
411
-
412
- relates "defined? ::A.m" do
413
- compile do |g|
414
- g.push_exception_state
415
- outer_exc_state = g.new_stack_local
416
- g.set_stack_local outer_exc_state
417
- g.pop
418
-
419
- f = g.new_label
420
- done = g.new_label
421
-
422
- ex = g.new_label
423
- ok = g.new_label
424
- g.setup_unwind ex
425
-
426
- g.push_cpath_top
427
- g.push_literal :A
428
- g.push :false
429
- g.invoke_primitive :vm_const_defined_under, 3
430
-
431
- g.pop_unwind
432
- g.goto ok
433
-
434
- ex.set!
435
- g.clear_exception
436
- g.push_stack_local outer_exc_state
437
- g.restore_exception_state
438
- g.goto f
439
-
440
- ok.set!
441
- g.push_literal :m
442
- g.push_self
443
- g.invoke_primitive :vm_check_callable, 3
444
- g.gif f
445
- g.push_literal "method"
446
- g.goto done
447
-
448
- f.set!
449
- g.push :nil
450
-
451
- done.set!
452
- end
453
- end
454
-
455
- relates "defined? A::B.m" do
456
- compile do |g|
457
- g.push_exception_state
458
- outer_exc_state = g.new_stack_local
459
- g.set_stack_local outer_exc_state
460
- g.pop
461
-
462
- f = g.new_label
463
- done = g.new_label
464
-
465
- ex = g.new_label
466
- ok = g.new_label
467
- g.setup_unwind ex
468
-
469
- g.push_const :A
470
- g.push_literal :B
471
- g.push :true
472
- g.invoke_primitive :vm_const_defined_under, 3
473
-
474
- g.pop_unwind
475
- g.goto ok
476
-
477
- ex.set!
478
- g.clear_exception
479
- g.push_stack_local outer_exc_state
480
- g.restore_exception_state
481
- g.goto f
482
-
483
- ok.set!
484
- g.push_literal :m
485
- g.push_self
486
- g.invoke_primitive :vm_check_callable, 3
487
- g.gif f
488
- g.push_literal "method"
489
- g.goto done
490
-
491
- f.set!
492
- g.push :nil
493
-
494
- done.set!
495
- end
496
- end
497
-
498
- relates "defined? a.b" do
499
- compile do |g|
500
- g.push_exception_state
501
- outer_exc_state = g.new_stack_local
502
- g.set_stack_local outer_exc_state
503
- g.pop
504
-
505
- f = g.new_label
506
- done = g.new_label
507
-
508
- ex = g.new_label
509
- ok = g.new_label
510
- g.setup_unwind ex
511
-
512
- g.push :self
513
- g.send :a, 0, true
514
-
515
- g.pop_unwind
516
- g.goto ok
517
-
518
- ex.set!
519
- g.clear_exception
520
- g.push_stack_local outer_exc_state
521
- g.restore_exception_state
522
- g.goto f
523
-
524
- ok.set!
525
- g.push_literal :b
526
- g.push_self
527
- g.invoke_primitive :vm_check_callable, 3
528
- g.gif f
529
- g.push_literal "method"
530
- g.goto done
531
-
532
- f.set!
533
- g.push :nil
534
-
535
- done.set!
536
- end
537
- end
538
-
539
- relates "defined? [X]" do
540
- compile do |g|
541
- g.push_exception_state
542
- outer_exc_state = g.new_stack_local
543
- g.set_stack_local outer_exc_state
544
- g.pop
545
-
546
- f = g.new_label
547
- done = g.new_label
548
-
549
- ex = g.new_label
550
- ok = g.new_label
551
- g.setup_unwind ex
552
-
553
- g.push_literal :X
554
- g.invoke_primitive :vm_const_defined, 1
555
- g.pop_unwind
556
- g.goto ok
557
-
558
- ex.set!
559
- g.clear_exception
560
- g.push_stack_local outer_exc_state
561
- g.restore_exception_state
562
- g.goto f
563
-
564
- ok.set!
565
- g.pop
566
- g.push_literal "constant"
567
- g.goto done
568
-
569
- f.set!
570
- g.push :nil
571
-
572
- done.set!
573
-
574
- not_found = g.new_label
575
- finished = g.new_label
576
-
577
- g.gif not_found
578
- g.push_literal "expression"
579
- g.goto finished
580
-
581
- not_found.set!
582
- g.push_nil
583
- g.goto finished
584
-
585
- finished.set!
586
- end
587
- end
588
-
589
- relates <<-ruby do
590
- a = 1
591
- defined? a.to_s
592
- ruby
593
-
594
- compile do |g|
595
- f = g.new_label
596
- done = g.new_label
597
-
598
- g.push 1
599
- g.set_local 0
600
- g.pop
601
-
602
- g.push_local 0
603
- g.push_literal :to_s
604
- g.push_self
605
- g.invoke_primitive :vm_check_callable, 3
606
- g.gif f
607
- g.push_literal "method"
608
- g.goto done
609
-
610
- f.set!
611
- g.push :nil
612
-
613
- done.set!
614
- end
615
- end
616
- end