Fix up Rubinius specific library specs.
[rbx.git] / lib / compiler / nodes.rb
blob480a46a3c4021a03f1870cbd7e2b005592440e8b
1 #--
2 # See compiler.rb for more information about the Compiler mode of
3 # operation etc.
4 #++
6 class Compiler
8 ##
9 # Node is the representation of a node in the Abstract Syntax Tree
10 # (AST) of the Ruby code. It is typically fairly close in structure
11 # to the sexp produced by the parser but there are some transforms
12 # that are done at this stage:
14 # 1. Compiler special forms, such as Rubinius.asm which allows
15 #    inline Rubinius "assembly" code. See plugins.rb for more of
16 #    these.
17 # 2. Combining redundant and removing obsolete nodes from the tree.
18 #    The current parser is still mostly MatzRuby's and therefore
19 #    contains some artifacts that we have no need for.
20 # 3. Optimizations. At this time, there are not that many nor will
21 #    there ever be huge amounts.
22 # 4. Sexp transformations, somewhat akin to Lisp macros. These
23 #    allow modifying the sexp, and therefore the code produced,
24 #    as it is being compiled. The mechanism is currently very raw
25 #    and the only transform supported is conditional compilation
26 #    (e.g. not including debug statements in the bytecode at all.)
27 #    Look for Rubinius.compile_if.
29 # The compiler is based on the Visitor pattern, and this stage is no
30 # different. First, for every type of sexp node possible in Ruby code,
31 # one of these Node subclasses will provide a handler (even if to just
32 # skip over the node.) The   #kind method provides this mapping; for
33 # example, the Iter node is kind :iter. The nodes register the kinds
34 # they provide for lookups.
36 # The general model is simple. Each node has a   #consume method, it
37 # may either be the default one defined in Node or a custom one if one
38 # is needed. When the sexp is fed here, the kind mapping is used to
39 # determine the kind of Node to construct, and the rest of the sexp is
40 # fed to it. Typically the Node then goes through what is next in the
41 # sexp, asking each layer to construct itself and   #consume anything
42 # even further down the chain all the way until nothing of the sexp
43 # remains. At this point those recursive calls start rolling back up
44 # higher and higher, and the Nodes at each layer compose themselves of
45 # the constituent parts they get back from in exchange for the sexp
46 # they provided. Verification happens here, to ensure the AST is sane.
47 # Most optimization occurs at the point before the sub-sexp would be
48 # processed; for example a normal Call node (:call is the normal
49 # method call representation) would have its arguments and body sent
50 # for processing, but if the Call detects a special form starting with
51 # +Rubinius+, it produces the special code for that instead and may
52 # even completely omit processing parts of the sexp that a normal
53 # Call node would.
55 # Some Node classes are a bit fancier in their   #consume: ClosedScope
56 # Node subclasses manage a scope for local variables and so on, for
57 # example. The basic idea of having its children produce the subtree
58 # underneath it and then organising those bits to send back to its
59 # parent in turn is still the same, they just have additional things
60 # they are responsible for.
62 # In the end, the caller will be left with a single top-level Node
63 # object (usually a Script) which then hierarchically contains the
64 # rest of the AST. This object graph can then be passed on to the
65 # bytecode producer. See bytecode.rb for that.
67 class Node
68   Mapping = {}
70   def self.kind(name=nil)
71     return @kind unless name
72     Mapping[name] = self
73     @kind = name
74   end
76   def self.create(compiler, sexp)
77     kind = sexp.shift
79     node = new(compiler)
81     # Anywhere within, a piece of code may throw the symbol for the
82     # node type that it wishes to unwind the processing branch to.
83     # If this happens, then the thrown substitute value (defaulting
84     # to nil) is returned instead of the normal node product.
85     #
86     # For example, Call#consume can detect the Rubinius.compile_if
87     # construct and throw :newline which causes this method's return
88     # value to be nil. So this Newline and the entire rest of the
89     # expression are replaced by a nil output, which should be
90     # then handled or optimized away by the node upstream (usually
91     # a Block.)
92     #
93     # Whoever uses the throw MUST ensure that the sexp and the AST
94     # are in a sane state. We do not worry about it here.
95     catch(kind) {
96       args = node.consume(sexp)
98       begin
99         if node.respond_to? :normalize
100           node = node.normalize(*args)
101         else
102           node.args(*args)
103         end
104       rescue ArgumentError => e
105         raise ArgumentError, "#{kind} (#{self}) takes #{args.size} argument(s): passed #{args.inspect} (#{e.message})", e.context
106       end
108       node
109     }
110   end
112   def initialize(compiler)
113     @compiler = compiler
114     @in_masgn = false
115     @splat = false
116     @parent = nil
117   end
119   def convert(x)
120     @compiler.convert_sexp(x)
121   end
123   def consume(sexp)
124     # This lets nil come back from convert_sexp which means
125     # leave it out of the stream. This is primarily so that
126     # expressions can be optimized away and wont be seen at
127     # all in the output stream.
128     out = []
129     sexp.each do |x|
130       if x.kind_of? Array
131         v = @compiler.convert_sexp(x)
132         out << v unless v.nil?
133       else
134         out << x
135       end
136     end
138     return out
139   end
141   def args
142   end
144   def get(tag)
145     @compiler.get(tag)
146   end
148   def set(tag, val=true, &b)
149     @compiler.set(tag, val, &b)
150   end
152   def inspect
153     kind = self.class.kind
154     if kind
155       prefix = "Compiler:#{self.class.kind}"
156     else
157       prefix = self.class.name
158     end
159     prefix
161     super(prefix)
162   end
164   def is?(clas)
165     self.kind_of?(clas)
166   end
168   def expand(obj)
169     obj.nil? ? Nil.new(@compiler) : obj
170   end
172   def use_plugin(g, kind, *args)
173     @compiler.plugins[kind].find do |plug|
174       plug.handle(g, self, *args)
175     end
176   end
178   #--- Start of Node subclasses
180   # ClosedScope is a metanode in that it does not exist in Ruby code;
181   # it merely abstracts common functionality of various real Ruby nodes
182   # that must control a local variable scope. These classes will exist
183   # as subclasses of ClosedScope below.
184   #
185   # Most notably, LocalScope objects are kept to maintain a hierarchy
186   # of visibility and availability for the runtime.
187   class ClosedScope < Node
188     def initialize(comp)
189       super(comp)
191       @use_eval = false
192       @alloca = 0
193       @top_scope = create_scope()
194       @block_scope = []
195       @all_scopes = [@top_scope]
196       @slot = 0
197       @ivar_as_slot = {}
198       @visibility = :public
199     end
201     attr_accessor :visibility
203     def create_scope
204       LocalScope.new(self)
205     end
207     attr_accessor :use_eval
209     def locals
210       @top_scope
211     end
213     def name
214       nil
215     end
217     def consume(sexp, iter=false, eval=false)
218       set(:scope => self, :iter => iter, :eval => eval) do
219         out = convert(sexp[0])
220         @all_scopes.each do |scope|
221           scope.formalize!
222         end
223         out
224       end
225     end
227     def depth
228       @block_scope.size
229     end
231     def new_block_scope
232       begin
233         scope = create_scope()
234         @block_scope << scope
235         @all_scopes << scope
236         yield
237       ensure
238         @block_scope.pop
239       end
241       return scope
242     end
244     def find_local(name, in_block=false, allocate=true)
245       # If the caller is not in a block, things can only
246       # be in the top_context. Easy enough, return out of the Hash
247       # (which might created in for us automatically)
248       unless in_block
249         if allocate or @top_scope.key?(name)
250           return [@top_scope[name], nil]
251         else
252           return nil
253         end
254       end
256       # They're asking from inside a block, look in the current
257       # block scopes as well as top_scope
259       if @block_scope.empty?
260         raise Error, "You can't be in a block, there are no block scopes"
261       end
263       lcl = nil
264       depth = nil
265       dep = 0
267       @block_scope.reverse_each do |scope|
268         if scope.key?(name)
269           if scope.from_eval
270             depth = dep + 1
271           else
272             depth = dep
273           end
274           lcl = scope[name]
275           break
276         end
277         dep += 1
278       end
280       # Not found in an outstanding block scope, look in the
281       # top context.
282       unless lcl
283         if @top_scope.key?(name)
284           lcl = @top_scope[name]
285         elsif !allocate
286           return nil
287         else
288           # This not found. create it.
289           in_scope = @block_scope.last
290           idx = in_scope.size
291           lcl = in_scope[name]
292           lcl.created_in_block!(idx)
293           if in_scope.from_eval
294             depth = 1
295           else
296             depth = 0
297           end
298         end
299       end
301       lcl.access_in_block!
303       return [lcl, depth]
304     end
306     def find_ivar_index(name)
307       @ivar_as_slot[name]
308     end
310     def add_ivar_as_slot(name, slot)
311       @ivar_as_slot["@#{name}".to_sym] = slot
312     end
314     def allocate_stack
315       return nil if @use_eval
316       # This is correct. the first one is 1, not 0.
317       @alloca += 1
318     end
320     def allocate_slot
321       i = @slot
322       @slot += 1
323       return i
324     end
326     def module_body?
327       false
328     end
329   end
331   # Snippit was a special type of a scope, not exactly a Script but
332   # not something else either. Currently it only provides abstract
333   # support for eval, for example.
334   #
335   class Snippit < ClosedScope
336     kind :snippit
338     def consume(sexp, iter=false, eval=false)
339       set(:family, self) do
340         super(sexp, iter, eval)
341       end
342     end
344     def args(body)
345       @body = expand(body)
346     end
348     attr_accessor :body
349   end
351   class Expression < Snippit
352     kind :expression
353   end
355   # EvalExpression is a special node and does not appear in the Ruby
356   # parse tree itself. It is inserted as the top-level scope when an
357   # eval is run, which allows managing the specialized behaviour that
358   # is needed for it.
359   #
360   class EvalExpression < Expression
361     kind :eval_expression
363     def consume(sexp)
364       super(sexp, @in_iter, true)
365     end
367     def locals
368       @my_scope
369     end
371     def initialize(comp)
372       super(comp)
374       unless comp.custom_scopes?
375         raise ArgumentError, "only use with custom scopes"
376       end
378       @top_scope, @block_scope, @all_scopes, @context = comp.create_scopes
379       @slot = @top_scope.size
381       if @block_scope.empty?
382         @my_scope = @top_scope
383         @in_iter = false
384       else
385         @my_scope = @block_scope.last
386         @in_iter = true
387       end
389       # Setup stuff so allocate_slot works
390       @my_scope.scope = self
391       @slot = @my_scope.size
392     end
394     def enlarge_context
395       locals = @context.locals
397       if !locals
398         if @my_scope.size > 0
399           @context.locals = Tuple.new(@my_scope.size)
400           @context.method.local_names = @my_scope.encoded_order
401         end
402       elsif @my_scope.size > locals.size
403         @context.locals = locals.enlarge(@my_scope.size)
404         @context.method.local_names = @my_scope.encoded_order
405       end
406     end
408   end
410   # Script is a special node, and does not exist in normal Ruby code.
411   # It represents the top-level of a .rb file, and as such is the most
412   # common top-level container.
413   #
414   class Script < ClosedScope
415     kind :script
417     def args(body)
418       @body = expand(body)
419     end
421     attr_accessor :body
423     def name
424       :__script__
425     end
426   end
428   # Newline handles :newline nodes, which are inserted by the parser to
429   # allow keeping track of the file and line a certain sexp was produced
430   # from. In addition to that metadata, it contains within it a Block of
431   # the actual Ruby code (as sexp) that makes up that particular line.
432   #
433   # Sexp tag: +:newline+
434   #
435   class Newline < Node
436     kind :newline
438     def consume(sexp)
439       @compiler.set_position sexp[1], sexp[0]
440       super sexp
441     end
443     def args(line, file, child=nil)
444       @line, @file, @child = line, file, child
445     end
447     attr_accessor :line, :file, :child
449     def is?(cls)
450       @child.kind_of? cls
451     end
452   end
454   # True is the literal +true+.
455   #
456   # Sexp tag: +:true+
457   #
458   # Example:
459   #
460   #   puts "Hi" if true
461   #                ^^^^
462   #
463   class True < Node
464     kind :true
465   end
467   # False is the literal +false+.
468   #
469   # Sexp tag: +:false+
470   #
471   # Example:
472   #
473   #   puts "Hi" if false
474   #                ^^^^^
475   #
476   class False < Node
477     kind :false
478   end
480   # Nil is the literal +nil+.
481   #
482   # Sexp tag: +:nil+
483   #
484   # Example:
485   #
486   #   puts "Hi" if nil
487   #                ^^^
488   #
489   class Nil < Node
490     kind :nil
491   end
493   # Self is the literal +self+.
494   #
495   # Sexp tag: +:self+
496   #
497   # Example:
498   #
499   #   p self
500   #     ^^^^
501   #
502   class Self < Node
503     kind :self
504   end
506   # And represents either +and+ or +&&+.
507   # The precedence difference between the
508   # two has been resolved by the parser so
509   # both types map into this one node (but
510   # their child and parent nodes could be
511   # different.)
512   #
513   # It contains both the left and the right
514   # subexpression.
515   #
516   # Sexp tag: +:and+
517   #
518   # Example:
519   #
520   #   foo and bar
521   #       ^^^
522   #
523   #   baz && quux
524   #       ^^
525   #
526   class And < Node
527     kind :and
529     def args(left, right)
530       @left, @right = left, right
531     end
533     attr_accessor :left, :right
534   end
536   # Or represents either +or+ or +||+.
537   # The precedence difference between the
538   # two has been resolved by the parser so
539   # both types map into this node although
540   # their contexts (parents and children)
541   # may be different.
542   #
543   # It contains both the left and the right
544   # subexpression.
545   #
546   # Sexp tag: +:or+
547   #
548   # Example:
549   #
550   #   foo or bar
551   #       ^^
552   #
553   #   baz || quux
554   #       ^^
555   #
556   class Or < And
557     kind :or
558   end
560   # Not is either +not+ or +!+. The precedence
561   # has been resolved by the parser, the two
562   # types may have different parents and children
563   # because of it, though.
564   #
565   # It contains the expression to negate.
566   #
567   # Sexp tag: +:not+
568   #
569   # Example:
570   #
571   #   not available?
572   #   ^^^
573   #
574   #   !true
575   #   ^
576   #
577   class Not < Node
578     kind :not
580     def args(child)
581       @child = child
582     end
584     attr_accessor :child
585   end
587   # Negate represents a negative numeric literal.
588   # It contains the Ruby object for the absolute
589   # value, the node itself is used as the negative
590   # marker.
591   #
592   # Sexp tag: +:negate+
593   #
594   # Example:
595   #
596   #   -1 + -0.045
597   #   ^^   ^^^^^^
598   #
599   class Negate < Node
600     kind :negate
602     def args(child)
603       @child = child
604     end
606     attr_accessor :child
607   end
609   # NumberLiteral is generated from a Literal node that
610   # represents a Fixnum literal as a convenience. It
611   # contains the actual number in a Ruby Fixnum. These
612   # are positive numbers only; a combination of Negate
613   # and Literal is used for negatives.
614   #
615   # Sexp tag: N/A
616   #
617   # Example:
618   #
619   #   a = 50
620   #       ^^
621   #
622   class NumberLiteral < Node
623     kind :fixnum
625     def args(value)
626       @value = value
627     end
629     attr_accessor :value
630   end
632   # Literal is the default representation of any literal
633   # object value in the code, such as a number representing
634   # a Float. Fixnums and Regexps are delegated to be processed
635   # by NumberLiteral and RegexLiteral respectively, but any
636   # other is contained within as an object.
637   #
638   # The remaining literals will also have special treatment
639   # in that they are stored in the Literals Tuple of the
640   # CompiledMethod so that they are accessible to runtime
641   # code.
642   #
643   # Sexp tag: +:lit+
644   #
645   # Example:
646   #
647   #   pi_ish = 3.14
648   #            ^^^^
649   #
650   #   drive  = :dvd_rom
651   #            ^^^^^^^^
652   #
653   class Literal < Node
654     kind :lit
656     def normalize(value)
657       @value = value
659       case value
660       when Fixnum
661         nd = NumberLiteral.new(@compiler)
662         nd.args(value)
663         return nd
664       when Regexp
665         nd = RegexLiteral.new(@compiler)
666         nd.args(value.source, value.options)
667         return nd
668       end
670       return self
671     end
673     attr_accessor :value
674   end
676   # RegexLiteral is a regular expression literal.
677   # It is usually generated directly but may also
678   # be delegated to by Literal. Each RegexLiteral
679   # contains the source (which is actually a String)
680   # and a Fixnum representing the regexp options in
681   # effect. These two bits of information are used
682   # to create the actual object through Regexp.new
683   # at runtime.
684   #
685   # Sexp tag: +:regex+   (Note missing "p.")
686   #
687   # Example:
688   #
689   #   puts "matched" if /foo/ =~ variable
690   #                     ^^^^^
691   #
692   class RegexLiteral < Node
693     kind :regex
695     def args(source, options)
696       @source, @options = source, options
697     end
699     attr_accessor :source, :options
700   end
702   # StringLiteral is a nondynamic string literal.
703   # It contains the Ruby String object corresponding
704   # to the real given character sequence. Since these
705   # objects are stored in the Literals Tuple, you will
706   # often see bytecode that performs a +string_dup+,
707   # which just makes a copy of the stored one so that
708   # the user can modify his version.
709   #
710   # Sexp tag: +:str+
711   #
712   # Example:
713   #
714   #   puts "hi"
715   #        ^^^^
716   #
717   class StringLiteral < Node
718     kind :str
720     def args(str)
721       @string = str
722     end
724     attr_accessor :string
725   end
728   # DynamicString is a dynamic string literal; i.e.,
729   # one with an interpolated component. There are a
730   # few notable things: the parser will process any
731   # interpolations which themselves contain a string
732   # literal into a plain string literal instead of
733   # a dynamic string. The latter will only be in
734   # effect for variable interpolation etc.
735   #
736   # Each dynamic string consists of two things: string
737   # literals for the nondynamic parts and :evstr nodes
738   # for the parts that need to be evaluated. The :dstr
739   # node itself contains the starting literal (if any),
740   # but all subsequent ones appear as additional :str
741   # nodes interspersed with :evstrs. The :evstr nodes
742   # are any executable code, so they will eventually
743   # be unwrapped and the sexp there translated to AST.
744   #
745   # Sexp tag: +:dstr+
746   #
747   # Example:
748   #
749   #   puts "Hi #{name}, howzit?"
750   #        ^^^^^^^^^^^^^^^^^^^^^
751   #
752   # Sexp from example:
753   #
754   #   [:dstr, "Hi "
755   #         , [:evstr, [:vcall, :name]]
756   #         , [:str, ", howzit?"]
757   #         ]
758   #
759   #
760   class DynamicString < StringLiteral
761     kind :dstr
763     def args(str, *body)
764       @string = str
765       @body = body
766     end
768     attr_accessor :body
769   end
771   # DynamicRegex is a dynamic regexp literal, i.e.
772   # one with an interpolated component. These behave
773   # the same as DynamicStrings (they actually use :str
774   # and :evstr nodes also), please see above for a more
775   # thorough explanation.
776   #
777   # Sexp tag: +:dregx+
778   #
779   # Example:
780   #
781   #   /a#{b}c/
782   #
783   class DynamicRegex < DynamicString
784     kind :dregx
786     def args(str, *body)
787       @string = str
788       @body = body
789       @options = body.pop
790     end
791   end
793   # DynamicOnceRegex is identical to DynamicRegex, with
794   # the exception that the interpolation is only run once.
795   # This is done using the +o+ flag to the literal. Please
796   # see DynamicRegex for more detailed documentation.
797   #
798   # Sexp tag: +:dregx_once+
799   #
800   # Example:
801   #
802   #   /a#{b}c/o   # Note the +o+ option
803   #
804   class DynamicOnceRegex < DynamicRegex
805     kind :dregx_once
806   end
808   # Implicit regexp matching node. A Match is created if
809   # there is a regexp literal in a condition without an
810   # object to match against (or indeed the matching op.)
811   # Ruby allows this form to match against +$_+ which is
812   # a predefined global always set to the last line of
813   # input read into the program.
814   #
815   # Sexp tag: +:match+
816   #
817   # Example:
818   #
819   #   gets
820   #   puts "Uh-uh, you said 'foo'" if /foo/
821   #                                  ^^^^^^^^
822   #
823   class Match < Node
824     kind :match
826     # Essentially same as :match2, just using $_
827     def consume(sexp)
828       pattern = RegexLiteral.new @compiler
829       pattern.args *sexp      # Pattern, options
831       last_input = GVar.new @compiler
832       last_input.name = :$_
834       [pattern, last_input]
835     end
837     def args(pattern, target)
838       @pattern, @target = pattern, target
839     end
841     attr_accessor :pattern, :target
842   end
844   # Match2 is a regexp match where the regexp literal is on the
845   # left hand side of the match operator. This node is generated
846   # any time such an event occurs. Naturally, the parser is not
847   # able to determine whether a variable is a Regexp, so it only
848   # works with a regexp literal. See also Match3.
849   #
850   # Sexp tag: +:match2+
851   #
852   # Example:
853   #
854   #   /this/ =~ "matches this"
855   #   ^^^^^^^^^
856   #
857   class Match2 < Node
858     kind :match2
860     def args(pattern, target)
861       @pattern, @target = pattern, target
862     end
864     attr_accessor :pattern, :target
865   end
867   # Match3 is a regexp match where the regexp literal is on the
868   # right hand side of the match operator. This node is generated
869   # any time such an event occurs. Naturally, the parser is not
870   # able to determine whether a variable is a Regexp, so it only
871   # works with a regexp literal. See also Match2.
872   #
873   # Sexp tag: +:match3+
874   #
875   # Example:
876   #
877   #   "this matches" =~ /this/
878   #                  ^^^^^^^^^
879   #
880   class Match3 < Node
881     kind :match3
883     def args(pattern, target)
884       @pattern, @target = pattern, target
885     end
887     attr_accessor :target, :pattern
888   end
890   # BackRef is any one of the predefined (thread-) global variables
891   # that are set after each regexp match operation, except the numbered
892   # ones. A BackRef can be $`, $', $& etc. The second character is
893   # stored to create the entire variable. See also NthRef.
894   #
895   # Sexp tag: +:back_ref+
896   #
897   # Example:
898   #
899   #   /fo(o)/ =~ variable
900   #
901   #   puts $`
902   #        ^^
903   #
904   class BackRef < Node
905     kind :back_ref
907     def args(kind)
908       @kind = kind.chr.to_sym
909     end
911     attr_accessor :kind
912   end
914   # NthRef is one of the numbered groups from the last regexp match.
915   # The node contains the numeric value, which will then be combined
916   # with $ to make the global at runtime. Technically there is no
917   # limitation (up to the thousands) on the number of backrefs but
918   # Win32 does limit it to 10. See also BackRef for the other regexp
919   # match automatic (thread-) globals.
920   #
921   # Sexp tag: +:nth_ref+
922   #
923   # Example:
924   #
925   #     /(f)oo/ =~ variable
926   #
927   #     puts $1
928   #          ^^
929   #
930   class NthRef < Node
931     kind :nth_ref
933     def args(which)
934       @which = which
935     end
937     attr_accessor :which
938   end
940   # If is the safe and familiar conditional as well as
941   # the inverse: +unless+. The parser simply constructs
942   # a negated version of the +if+ on those occasions.
943   # The contents are the condition expression as well
944   # as the expressions for then and else.
945   #
946   # Sexp tag: +:if+
947   #
948   # Example:
949   #
950   #   if true; puts "hi"; end
951   #   ^^
952   #
953   class If < Node
954     kind :if
956     def args(cond, thn, els)
957       @condition, @then, @else = cond, thn, els
958     end
960     attr_accessor :condition, :then, :else
961   end
963   # While is the standard conditional looping construct.
964   # It contains the condition itself as well as the body
965   # to run; in addition, it may also indicate that the
966   # condition should be checked before or after the first
967   # loop, default of course being before. The syntax for
968   # both is below.
969   #
970   # Sexp tag: +:while+
971   #
972   # Example:
973   #
974   #   # Condition first (optionally add +do+ after the condition.)
975   #   while blah
976   #   ^^^^^^^^^^
977   #     ...
978   #   end
979   #
980   #   # Run once first. +end+ and +while+ must be on the same line
981   #   begin
982   #     ...
983   #   end while blah
984   #   ^^^^^^^^^^^^^^
985   #
986   class While < Node
987     kind :while
989     def args(cond, body, check_first=true)
990       @condition, @body, @check_first = cond, expand(body), check_first
991     end
993     attr_accessor :condition, :body, :check_first
994   end
996   # Until is same as a +while not+. See While for further
997   # documentation. May also be used pre- or postcondition.
998   #
999   # Sexp tag: +:until+
1000   #
1001   # Example:
1002   #
1003   #   # Condition first (optionally add +do+ after the condition.)
1004   #   until blah
1005   #   ^^^^^^^^^^
1006   #     ...
1007   #   end
1008   #
1009   #   # Run once first. +end+ and +until+ must be on the same line
1010   #   begin
1011   #     ...
1012   #   end until blah
1013   #   ^^^^^^^^^^^^^^
1014   #
1015   class Until < While
1016     kind :until
1017   end
1019   # +Block+ is a special node: it is part of Ruby's semantics rather than
1020   # syntax. Notably, a Block is NOT a Ruby block (a Proc object.) A Block
1021   # simply encapsulates multiple expressions into a group. For example, an
1022   # +if+ expression that has a single line inside it does not have a Block,
1023   # but one that has two lines will have both of those lines encapsulated
1024   # inside a Block. It has no fancy purpose apart from grouping.
1025   #
1026   # Sexp tag: +:block+
1027   #
1028   # Example:
1029   #
1030   #   if foo
1031   #     bar    <
1032   #     baz    < These will all be inside the :block
1033   #     quux   <
1034   #   end
1035   #
1036   # Sexp from example (Newline nodes omitted):
1037   #
1038   #   [:if
1039   #       , [:vcall, :foo]
1040   #       , [:block
1041   #                , [:vcall, :bar]
1042   #                , [:vcall, :baz]
1043   #                , [:vcall, :quux]
1044   #                ]
1045   #       ]
1046   #
1047   class Block < Node
1048     kind :block
1050     def args(*body)
1051       @body = body
1052     end
1054     attr_accessor :body
1055   end
1057   # +Scope+ is another special node type. It represents the scope
1058   # inside a logical Ruby unit such as a method definition or a
1059   # class definition. Curiously, though, the Scope is not where
1060   # the variable scoping etc. happens: for that, see ClosedScope
1061   # and its subclasses. For example in a method definition, the
1062   # Define node itself is the ClosedScope, but it in turn has a
1063   # Scope object encapsulated inside. To make things stranger,
1064   # the Scope object itself contains the Block of code (method
1065   # body, for example) but _also the names of local variables_
1066   # inside that code block. The locals are *actually* managed
1067   # by the ClosedScope, though. So for the purposes of Rubinius
1068   # compilation, you can sort of ignore the Scope node except
1069   # for its semantic meaning.
1070   #
1071   # Sexp tag: +:scope+
1072   #
1073   # Example:
1074   #
1075   #   def foo(a, b)   <
1076   #     ...           <  Scope object created inside the Define
1077   #   end             <
1078   #
1079   class Scope < Node
1080     kind :scope
1082     def consume(sexp)
1083       if sexp.size == 1 or sexp[0].nil?
1084         return [nil, nil]
1085       end
1087       # Handle def self.foo; end, which unlike def foo; end does not generate a block
1088       if sexp[0].first == :args
1089         sexp[0] = [:block, sexp[0], [:nil]]
1090       end
1092       sexp[0] = convert(sexp[0])
1093       return sexp
1094     end
1096     def args(block, locals)
1097       @block, @locals = block, locals
1098     end
1100     attr_accessor :block, :locals
1102     def empty?
1103       @block.nil?
1104     end
1105   end
1107   # +Arguments+ is for the representation of a method _definition's_
1108   # argument list. It contains four sub-nodes, one each for required
1109   # args, optional args, splat name and default value expressions. A
1110   # block argument is actually not noted at this level because in the
1111   # sexp, it is a sibling to this node, all contained inside the method
1112   # definition. The block argument is added to the node later by the
1113   # Define node in its normalisation process.
1114   #
1115   # There are a few interesting details: because default values can
1116   # be any expressions (try it, you can use a block, a class, define
1117   # another function etc.), the entire expression subtree is stored.
1118   # The optional arguments are just the variable names, and the values
1119   # are first processed into their own little AST subtrees which are
1120   # then stored in a mapping whence they may be executed at runtime
1121   # if the default value is needed.
1122   #
1123   # The Arguments node performs quite a bit of other normalisation
1124   # also, as well as coordinating setting up the arguments as local
1125   # variables with the appropriate LocalScope and providing the
1126   # arity calculation for this method. See further documentation
1127   # about those operations in the individual methods of Arity.
1128   #
1129   # Sexp tag: +:args+
1130   #
1131   # Example:
1132   #
1133   #   def foo(a, b = lambda { :moo }, *c, &d)
1134   #           ^^^^^^^^^^^^^^^^^^^^^^^^^^
1135   #             These go in the node.
1136   #             Block arg processed
1137   #             in Define.
1138   #     ...
1139   #   end
1140   #
1141   class Arguments < Node
1142     kind :args
1144     # [[:obj], [], nil, nil]
1145     # required, optional, splat, defaults
1146     def consume(sexp)
1148       if sexp.empty?
1149         return [[], [], nil, nil]
1150       end
1152       # Strip the parser calculated index of splat
1153       if sexp[2] and !sexp[2].empty?
1154         sexp[2] = sexp[2].first
1155       end
1157       defaults = sexp[3]
1159       if defaults
1160         defaults.shift
1161         i = 0
1162         defaults.map! do |node|
1163           # HACK: Fix parse_tree bug when an optional arg has a default value
1164           # that is an :iter. For example, the following:
1165           #  def foo(output = 1, b = lambda {|n| output * n})
1166           # generates a sexp where the optional args are [:output, :n], rather
1167           # than [:output, :b]. To fix this, we pick up the name of the :lasgn,
1168           # in the defaults, and set the corresponding optional arg if the
1169           # :lasgn is an :iter.
1170           type = node[2].first rescue nil
1171           if type == :iter
1172             name = node[1]
1173             sexp[1][i] = name
1174           end
1175           i += 1
1177           convert(node)
1178         end
1180         sexp[3] = defaults
1181       end
1183       sexp
1184     end
1186     def args(req, optional, splat, defaults)
1187       @block_arg = nil
1188       @required, @optional, @splat, @defaults = req, optional, splat, defaults
1190       # The splat has no name, so give it a name that a user can't actually
1191       # give, so that we can still use it (ie, for super)
1192       if @splat.kind_of? TrueClass
1193         @splat = :@anon_splat
1194       end
1196       populate
1197     end
1199     attr_accessor :required, :optional, :splat, :defaults, :block_arg
1201     def arity
1202       if !@optional.empty? or @splat
1203         return -(@required.size + 1)
1204       end
1206       return @required.size
1207     end
1209     def populate
1210       i = 0
1211       scope = get(:scope)
1213       @required.map! do |var|
1214         var, depth = scope.find_local(var)
1215         var.argument!(i)
1216         i += 1
1217         var
1218       end
1220       @optional.map! do |var|
1221         var, depth = scope.find_local(var)
1222         var.argument!(i, true)
1223         i += 1
1224         var
1225       end
1227       if @splat.kind_of? Symbol
1228         var, depth = scope.find_local(@splat)
1229         var.argument!(i, true)
1230         @splat = var
1231       end
1233       @mapped_defaults = {}
1235       if @defaults
1236         @defaults.each do |x|
1237           @mapped_defaults[x.name] = x
1238         end
1239       end
1241     end
1242   end
1244   # +Undef+ is the keyword +undef+, #undefine_method does not have any
1245   # special handling that would make it processable here and thus is
1246   # just a normal method call. Two data are retained: first naturally
1247   # the name of the method in question which can be either just the name
1248   # as a plain identifier or given as a Symbol. The other information
1249   # is whether the undef occurs inside a Module definition scope. The
1250   # undef keyword is somewhat surprising in its behaviour: it always
1251   # tries to undefine the given method in the module that the line is
1252   # _lexically_ enclosed in, so this must be known for the cases it is
1253   # used outside the Module definition scopes. This also excludes any
1254   # use in the block form of Module.new, which may be surprising altough
1255   # consistent with closure behaviour.
1256   #
1257   # Sexp tag: +:undef+
1258   #
1259   # Example:
1260   #
1261   #   class Foo
1262   #     undef bar
1263   #     ^^^^^^^^^
1264   #   end
1265   #
1266   class Undef < Node
1267     kind :undef
1269     def args(name)
1270       @name = name
1271       scope = get(:scope)
1272       if scope.is? Node::Class or scope.is? Node::Module
1273         @in_module = true
1274       else
1275         @in_module = false
1276       end
1277     end
1279     attr_accessor :name, :in_module
1280   end
1282   class Break < Node
1283     kind :break
1284     def args(value=nil)
1285       @value = value
1287       if @in_block = get(:iter)
1288         @check_var, _ = get(:scope).find_local :@lre
1289       end
1290     end
1292     attr_accessor :value, :in_block
1293   end
1295   class Redo < Break
1296     kind :redo
1297   end
1299   class Next < Break
1300     kind :next
1301   end
1303   class Retry < Break
1304     kind :retry
1305   end
1307   class When < Node
1308     kind :when
1310     def args(cond, body = nil)
1311       @body = expand(body)
1312       @conditions = []
1313       @splat = nil
1315       if cond.is? ArrayLiteral
1316         cond.body.each do |c|
1317           # Inner when means splat.
1318           if c.is? Node::When
1319             if c.splat
1320               @splat = c.splat
1321             else
1322               @splat = c.conditions
1323             end
1324           else
1325             @conditions << c
1326           end
1327         end
1328       else
1329         @splat = cond
1330       end
1331     end
1333     attr_reader :body, :conditions, :splat
1334   end
1336   class Case < Node
1337     kind :case
1339     def consume(sexp)
1340       sexp[1].map! do |w|
1341         convert(w)
1342       end
1343       [convert(sexp[0]), sexp[1], convert(sexp[2])]
1344     end
1346     def args(recv, whens, els)
1347       @receiver, @whens, @else = recv, whens, els
1348     end
1350     def has_receiver?
1351       true
1352     end
1354     attr_accessor :receiver, :whens, :else
1355   end
1357   # ManyIf represents a case statement with no receiver, i.e.
1358   #   case
1359   #     when foo: bar
1360   #   end
1361   class ManyIf < Case
1362     kind :many_if
1364     # :many_if contains an array of whens and an else
1365     # the whens are in turn an array of condition expressions,
1366     # followed by a body
1367     def consume(sexp)
1368       whens = sexp[0]
1369       whens.map! do |w|
1370         w.unshift :when
1371         convert(w)
1372       end
1373       [whens, convert(sexp[1])]
1374     end
1376     def args(whens, els)
1377       @whens = whens
1378       @else = els
1379     end
1381     def has_receiver?
1382       false
1383     end
1385     attr_accessor :whens, :else
1386   end
1388   class LocalVariable < Node
1390     def consume(sexp)
1391       name = sexp[0]
1393       scope = get(:scope)
1395       if get(:iter)
1396         @variable, @depth = scope.find_local name, true
1397       else
1398         @variable, @depth = scope.find_local name
1399       end
1401       super(sexp)
1402     end
1404     def args(name)
1405       @name = name
1406     end
1408     def from_variable(var, depth=nil)
1409       @variable = var
1410       @depth = depth
1411       @name = var.name
1412     end
1414   end
1416   class LocalAssignment < LocalVariable
1417     kind :lasgn
1419     def args(name, val=nil)
1420       # val will be nil if this is e.g. an lasgn inside an masgn
1421       @value = val
1422       super(name)
1424       @variable.assigned!
1425     end
1427     attr_accessor :name, :value, :variable
1429     def from_variable(var, value=nil)
1430       super(var)
1432       @value = value
1433     end
1435     def optional
1436       []
1437     end
1439     def required
1440       [name]
1441     end
1442   end
1444   class LocalAccess < LocalVariable
1445     kind :lvar
1447     def args(name, idx)
1448       @name = name
1449       super(name)
1450     end
1452     attr_accessor :name
1453   end
1455   class SValue < Node
1456     kind :svalue
1458     def args(child)
1459       @child = child
1460     end
1462     attr_accessor :child
1463   end
1465   class OpAssignOr < Node
1466     kind :op_asgn_or
1468     def args(left, right)
1469       @left, @right = left, right
1470     end
1472     attr_accessor :left, :right
1473   end
1475   class OpAssignAnd < OpAssignOr
1476     kind :op_asgn_and
1477   end
1479   class OpAssign1 < Node
1480     kind :op_asgn1
1482     def consume(sexp)
1483       # Value to be op-assigned is always first element of value
1484       sexp[2].shift # Discard :array token
1485       val = convert(sexp[2].shift)
1486       # Remaining elements in value are index args excluding final nil marker
1487       idx = []
1488       while sexp[2].size > 1 do
1489         idx << convert(sexp[2].shift)
1490       end
1491       [convert(sexp[0]), sexp[1], idx, val]
1492     end
1494     def args(obj, kind, index, value)
1495       @object, @kind, @index, @value = obj, kind, index, value
1496     end
1498     attr_accessor :object, :kind, :value, :index
1499   end
1501   class OpAssign2 < Node
1502     kind :op_asgn2
1504     def args(obj, method, kind, assign, value)
1505       @object, @method, @kind, @value = obj, method, kind, value
1506       str = assign.to_s
1507       if str[-1] == ?=
1508         @assign = assign
1509       else
1510         str << "="
1511         @assign = str.to_sym
1512       end
1513     end
1515     attr_accessor :object, :method, :kind, :assign, :value
1516   end
1518   class ArrayLiteral < Node
1519     kind :array
1521     # We do this to get around having to do *body in
1522     # args. 1024 is the max number of args, so if an
1523     # array had more elements that than, args would
1524     # get an args error. This lets us leave it as an
1525     # Array.
1526     def consume(sexp)
1527       sexp.map! { |s| convert(s) }
1528       [sexp]
1529     end
1531     def args(body)
1532       @body = body
1533     end
1535     attr_accessor :body
1536   end
1538   class EmptyArray < Node
1539     kind :zarray
1540   end
1542   class HashLiteral < Node
1543     kind :hash
1545     def args(*body)
1546       @body = body
1547     end
1549     attr_accessor :body
1550   end
1552   class ImplicitHash < HashLiteral
1553     kind :ihash
1554   end
1556   class DynamicArguments < Node
1557   end
1559   class Splat < DynamicArguments
1560     kind :splat
1562     def args(child)
1563       @child = child
1564     end
1566     attr_accessor :child
1568   end
1570   class ConcatArgs < DynamicArguments
1571     kind :argscat
1573     def args(rest, array)
1574       @array = array
1576       if rest.kind_of? Array      # When does this happen?
1577         @rest = rest
1578       else
1579         @rest = rest.body
1580       end
1581     end
1583     attr_accessor :array, :rest
1584   end
1586   class PushArgs < DynamicArguments
1587     kind :argspush
1589     def args(array, item)
1590       @item = item
1591       unless array.is? Splat
1592         raise Error, "Unknown form of argspush: #{array.class}"
1593       end
1595       @array = array.child
1596     end
1598     attr_accessor :array, :item
1599   end
1601   class AccessSlot < Node
1602     def args(idx)
1603       @index = idx
1604     end
1606     attr_reader :index
1607   end
1609   class SetSlot < Node
1610     def args(idx, val)
1611       @index, @value = idx, val
1612     end
1614     attr_reader :index, :value
1615   end
1617   class IVar < Node
1618     kind :ivar
1620     def normalize(name)
1621       fam = get(:family)
1622       if fam and idx = fam.find_ivar_index(name)
1623         ac = AccessSlot.new @compiler
1624         ac.args(idx)
1625         return ac
1626       end
1628       @name = name
1629       return self
1630     end
1632     attr_accessor :name
1634   end
1636   class IVarAssign < Node
1637     kind :iasgn
1639     def normalize(name, val=nil)
1640       fam = get(:family)
1641       if fam and idx = fam.find_ivar_index(name)
1642         ac = SetSlot.new @compiler
1643         ac.args(idx, val)
1644         return ac
1645       end
1647       @value = val
1648       @name = name
1649       return self
1650     end
1652     def optional
1653       []
1654     end
1656     def required
1657       [name]
1658     end
1660     attr_accessor :name, :value
1661   end
1663   class GVar < Node
1664     kind :gvar
1666     def args(name)
1667       @name = name
1668     end
1670     attr_accessor :name
1671   end
1673   class GVarAssign < Node
1674     kind :gasgn
1676     def args(name, value=nil)
1677       @name, @value = name, value
1678     end
1680     attr_accessor :name, :value
1682     def optional
1683       []
1684     end
1686     def required
1687       [name]
1688     end
1689   end
1691   class ConstFind < Node
1692     kind :const
1694     def args(name)
1695       @name = name
1696     end
1698     attr_accessor :name
1699   end
1701   class ConstAccess < Node
1702     kind :colon2
1704     def args(parent, name)
1705       @parent, @name = parent, name
1706     end
1708     attr_accessor :parent, :name
1710     def normalize(one, two=nil)
1711       if two
1712         args(one, two)
1713         node = self
1714       else
1715         node = ConstFind.new(@compiler)
1716         node.args(one)
1717       end
1719       return node
1720     end
1721   end
1723   class ConstAtTop < Node
1724     kind :colon3
1726     def args(name)
1727       @name = name
1728     end
1730     attr_accessor :name
1731   end
1733   class ConstSet < Node
1734     kind :cdecl
1736     def args(simp, val, complex)
1737       @from_top = false
1739       @value = val
1740       if simp
1741         @parent = nil
1742         @name = simp
1743       elsif complex.is? ConstAtTop
1744         @from_top = true
1745         @name = complex.name
1746       else
1747         @parent = complex.parent
1748         @name = complex.name
1749       end
1750     end
1752     attr_accessor :from_top, :parent, :value, :name
1753   end
1755   class ToArray < Node
1756     kind :to_ary
1758     def args(child)
1759       @child = child
1760     end
1762     attr_accessor :child
1763   end
1765   class SClass < ClosedScope
1766     kind :sclass
1768     def args(obj, body)
1769       @object, @body = obj, body
1770     end
1772     def consume(sexp)
1773       [convert(sexp[0]), super([sexp[1]])]
1774     end
1776     attr_accessor :object, :body
1777   end
1779   class Class < ClosedScope
1780     kind :class
1782     def args(name, parent, sup, body)
1783       @name, @parent, @superclass, @body = name, parent, sup, body
1784     end
1786     def consume(sexp)
1787       name = convert(sexp[0])
1788       sym = name.name
1790       if name.is? ConstFind or name.is? ConstAtTop
1791         parent = nil
1792       else
1793         parent = name.parent
1794       end
1796       # We have to set this before converting the body, because
1797       # we'll need to know it to use find_ivar_index properly.
1798       sup = sexp[1]
1799       if sup and sup[0] == :const
1800         @superclass_name = sup[1]
1801       else
1802         @superclass_name = nil
1803       end
1804       @name = sym
1806       @namespace = get(:namespace)
1808       body = set(:family => self, :namespace => sym) do
1809         super([sexp[2]])
1810       end
1812       [sym, parent, convert(sexp[1]), body]
1813     end
1815     attr_accessor :name, :parent, :superclass, :body
1817     def find_ivar_index(name)
1818       slot = super(name)
1819       if slot
1820         return slot
1821       elsif !@namespace
1822         if tbl = Bootstrap::HINTS[@name]
1823           return tbl[name]
1824         elsif @superclass_name
1825           if tbl = Bootstrap::HINTS[@superclass_name]
1826             return tbl[name]
1827           end
1828         end
1829       end
1831       return nil
1832     end
1834     def module_body?
1835       true
1836     end
1837   end
1839   class Module < ClosedScope
1840     kind :module
1842     def args(name, parent, body)
1843       @name, @parent, @body = name, parent, body
1844     end
1846     def consume(sexp)
1847       name = convert(sexp[0])
1848       sym = name.name
1850       if name.is? ConstFind
1851         parent = nil
1852       elsif name.is? ConstAtTop
1853         parent = name
1854       else
1855         parent = name.parent
1856       end
1858       body = set(:namespace, sym) do
1859         super([sexp[1]])
1860       end
1862       [sym, parent, body]
1863     end
1865     attr_accessor :name, :body, :parent
1867     def module_body?
1868       true
1869     end
1870   end
1872   class Begin < Node
1873     kind :begin
1875     def args(body)
1876       @body = body
1877     end
1879     attr_accessor :body
1880   end
1882   class RescueCondition < Node
1883     kind :resbody
1885     def args(cond, body, nxt)
1886       @body, @next = body, nxt
1887       if cond.nil?
1888         cf = ConstFind.new(@compiler)
1889         cf.args :StandardError
1890         @conditions = [cf]
1891       elsif cond.is? ArrayLiteral
1892         @conditions = cond.body
1893         @splat = nil
1894       elsif cond.is? Splat
1895         @conditions = nil
1896         @splat = cond.child
1897       elsif cond.is? ConcatArgs
1898         @conditions = cond.rest
1899         @splat = cond.array
1900       else
1901         raise Error, "Unknown rescue condition form"
1902       end
1904       if body.nil?
1905         @body = Nil.new(@compiler)
1906       end
1907     end
1909     attr_accessor :conditions, :splat, :body, :next
1910   end
1912   class Rescue < Node
1913     kind :rescue
1915     def args(body, res, els)
1916       @body, @rescue, @else = body, res, els
1917     end
1919     def consume(sexp)
1920       body, res, els = *sexp
1922       if res.nil?
1923         body = nil
1924         set(:in_rescue) do
1925           res = convert(body)
1926         end
1927         els = nil
1928       elsif els.nil?
1929         if body.first == :resbody
1930           body = nil
1932           els = convert(res)
1934           set(:in_rescue) do
1935             res = convert(body)
1936           end
1937         else
1938           body = convert(body)
1939           set(:in_rescue) do
1940             res = convert(res)
1941           end
1942           els = nil
1943         end
1944       else
1945         body = convert(body)
1946         set(:in_rescue) do
1947           res = convert(res)
1948         end
1949         els = convert(els)
1950       end
1952       [body, res, els]
1953     end
1955     attr_accessor :body, :rescue, :else
1956   end
1958   class Defined < Node
1959     kind :defined
1961     def consume(sexp)
1962       expr = sexp[0]
1963       if expr[0] == :call
1964         expr[1] = convert(expr[1])
1965       end
1967       sexp
1968     end
1970     def args(expr)
1971       @expression = expr
1972     end
1974     attr_accessor :expression
1975   end
1977   class Ensure < Node
1978     kind :ensure
1980     def consume(sexp)
1981       opts = {}
1982       set(:in_ensure, opts) do
1983         sexp[0] = convert(sexp[0])
1984       end
1986       # Propagate did_return up to an outer ensure
1987       if ens = get(:in_ensure)
1988         ens[:did_return] = opts[:did_return]
1989         outer = true
1990       else
1991         outer = false
1992       end
1994       [sexp[0], convert(sexp[1]), opts[:did_return], outer]
1995     end
1997     def args(body, ens, ret, outer)
1998       @body, @ensure = body, ens
1999       @did_return = ret
2000       @outer_ensure = outer
2002       if @in_block = get(:iter)
2003         @check_var, _ = get(:scope).find_local :@lre
2004       end
2006       # Handle a 'bug' in parsetree
2007       if @ensure == [:nil]
2008         @ensure = nil
2009       end
2010     end
2012     attr_accessor :body, :ensure, :did_return, :outer_ensure
2013   end
2015   class Return < Node
2016     kind :return
2018     def args(val=nil)
2019       @value = val
2020       @in_rescue = get(:in_rescue)
2022       if ens = get(:in_ensure)
2023         ens[:did_return] = true
2024         @in_ensure = true
2025       else
2026         @in_ensure = false
2027       end
2029       if @in_block = get(:iter)
2030         @check_var, _ = get(:scope).find_local :@lre
2031       end
2032     end
2034     attr_accessor :value, :in_rescue, :in_ensure, :in_block, :check_var
2035   end
2037   class MAsgn < Node
2038     kind :masgn
2040     def args(assigns, splat, source=:bogus)
2041       if source == :bogus  # Only two args supplied, therefore no assigns
2042         @assigns = nil
2043         @splat = assigns
2044         @source = splat
2045       else
2046         @assigns, @splat, @source = assigns, splat, source
2047       end
2049       @in_block = false
2050     end
2052     attr_accessor :assigns, :splat, :source, :in_block
2054     def empty?
2055       @assigns.nil? and (@splat.equal?(true) or @splat.nil?)
2056     end
2058     def optional
2059       return [] if splat.equal?(true) or splat.nil?
2060       splat.required
2061     end
2063     def required
2064       return [] if assigns.nil?
2065       assigns.body.map { |i| i.kind_of?(MAsgn) ? i.required : i.name }.flatten
2066     end
2067   end
2069   class Define < ClosedScope
2070     kind :defn
2072     def consume(sexp)
2073       name, body = sexp
2074       scope = set(:iter => false, :in_ensure => false) do
2075         super([body])
2076       end
2078       body = scope.block.body
2079       args = body.shift
2081       if body.first.is? BlockAsArgument
2082         ba = body.shift
2083       else
2084         ba = nil
2085       end
2087       args.block_arg = ba
2089       return [name, scope, args]
2090     end
2092     def args(name, body, args)
2093       @name, @body, @arguments = name, expand(body), args
2094     end
2096     attr_accessor :name, :body, :arguments
2097   end
2099   class DefineSingleton < Define
2100     kind :defs
2102     def consume(sexp)
2103       object = sexp.shift
2104       out = super(sexp)
2105       out.unshift convert(object)
2107       return out
2108     end
2110     def args(obj, name, body, args)
2111       @object = obj
2113       super(name, body, args)
2114     end
2116     attr_accessor :object
2117   end
2119   class MethodCall < Node
2121     def initialize(comp)
2122       super(comp)
2123       @block = nil
2124       scope = get(:scope)
2125       if scope.is? Class
2126         @scope = :class
2127       elsif scope.is? Module
2128         @scope = :module
2129       elsif scope.is? Script
2130         @scope = :script
2131       else
2132         @scope = :method
2133       end
2134     end
2136     def block=(obj)
2137       if obj.kind_of? Iter
2138         @check_var, _ = get(:scope).find_local :@lre
2139       end
2141       @block = obj
2142     end
2144     attr_reader :block, :check_var
2145     attr_accessor :scope
2146   end
2148   class Call < MethodCall
2149     kind :call
2151     # Args could be an array, splat or argscat
2152     def collapse_args
2153       @in_block = get(:iter)
2155       return unless @arguments
2157       if @arguments.is? ArrayLiteral
2158         @arguments = @arguments.body
2159         @argcount = @arguments.size
2160       else
2161         @argcount = nil
2162       end
2163     end
2165     # Rubinius.compile_if is easiest to detect here; if it is found,
2166     # we throw immediately to unwind this processing branch back to
2167     # wherever it is that the conditional compiler wants us to go.
2168     # See plugins.rb.
2169     def consume(sexp)
2170       use_plugin self, :conditional_compilation, sexp
2171       super(sexp)
2172     end
2174     def args(object, meth, args=nil)
2175       @object, @method, @arguments = object, meth, args
2177       collapse_args()
2178     end
2180     attr_accessor :object, :method, :arguments, :argcount
2181     attr_reader :in_block
2183     def no_args?
2184       @arguments.nil? or @arguments.empty?
2185     end
2187     def static_args?
2188       @arguments.nil? or @arguments.kind_of? Array
2189     end
2191     def fcall?
2192       false
2193     end
2195     def call?
2196       true
2197     end
2199     def argcount
2200       if @arguments.nil?
2201         return 0
2202       elsif @arguments.kind_of? Array
2203         return @arguments.size
2204       end
2206       return nil
2207     end
2208   end
2210   class FCall < Call
2211     kind :fcall
2213     def normalize(meth, args=nil)
2214       @method, @arguments = meth, args
2216       collapse_args()
2218       return detect_special_forms()
2219     end
2221     attr_accessor :method, :arguments
2223     def detect_special_forms
2224       # Detect ivar as index.
2225       if @method == :ivar_as_index
2226         args = @arguments
2227         if args.size == 1 and args[0].is? ImplicitHash
2228           family = get(:family)
2229           hsh = args[0].body
2230           0.step(hsh.size-1, 2) do |i|
2231             family.add_ivar_as_slot hsh[i].value, hsh[i+1].value
2232           end
2234           return nil
2235         end
2236       end
2237       return self
2238     end
2240     def fcall?
2241       true
2242     end
2244     def call?
2245       false
2246     end
2247   end
2249   class VCall < FCall
2250     kind :vcall
2252     def normalize(meth)
2253       if get(:eval)
2254         scope = get(:scope)
2256         if get(:iter)
2257           var, dep = scope.find_local meth, true, false
2258         else
2259           var, dep = scope.find_local meth, false, false
2260         end
2262         if var
2263           lv = LocalAccess.new(@compiler)
2264           lv.from_variable(var, dep)
2265           return lv
2266         end
2267       end
2269       super(meth)
2270     end
2272     def args(meth)
2273       @method = meth
2274       @arguments = nil
2276       collapse_args()
2277     end
2279     attr_accessor :method
2280   end
2282   class PostExe < FCall
2283     kind :postexe
2284     # Treat a :postexe node as if it were a call to at_exit
2285     def self.create(compiler, sexp)
2286       sexp = [:fcall, :at_exit]
2287       super(compiler, sexp)
2288     end
2289   end
2291   class AttrAssign < Call
2292     kind :attrasgn
2294     def args(obj, meth, args=nil)
2295       @object, @method = obj, meth
2296       @arguments = args
2298       # Strange. nil is passed when it's self. Whatevs.
2299       @object = Self.new @compiler if @object.nil?
2301       if @method.to_s[-1] != ?=
2302         @method = "#{@method}=".to_sym
2303       end
2305       collapse_args()
2307       # NOTE: []= has special semantics. It can be passed any number of arguments,
2308       # NOTE: PushArgs is for syntax h[*s] = 3, we have to handle it special
2310       # When we're in an masgn, there are no arguments
2311       return unless @arguments
2313       if @arguments.kind_of? Array
2314         @rhs_expression = @arguments.pop
2315       elsif @arguments.is? PushArgs
2316         @rhs_expression = nil
2317       else
2318         raise Error, "unknown argument form to attrassgn"
2319       end
2320     end
2322     def optional
2323       []
2324     end
2326     def required
2327       ["#{@object}.#{@method}"]
2328     end
2329   end
2331   class Super < Call
2332     kind :super
2334     def args(args=nil)
2335       @method = get(:scope)
2336       @arguments = args
2338       collapse_args()
2339     end
2341     attr_accessor :arguments
2342   end
2344   class ZSuper < Super
2345     kind :zsuper
2347     def args
2348       @method = get(:scope)
2349     end
2350   end
2352   class Yield < Call
2353     kind :yield
2355     def args(args, direct=false)
2356       if direct and args.kind_of? ArrayLiteral
2357         @arguments = args.body
2358       elsif args.kind_of? DynamicArguments
2359         @arguments = args
2360       elsif args
2361         @arguments = [args]
2362       else
2363         @arguments = []
2364       end
2365     end
2367     attr_accessor :arguments
2368   end
2370   class BlockAsArgument < Node
2371     kind :block_arg
2373     def args(name, position=nil)
2374       @name = name
2376       scope = get(:scope)
2378       @variable, @depth = scope.find_local name
2379       @variable.in_locals!
2380     end
2382     attr_accessor :name, :variable, :depth
2383   end
2385   class Loop < Node
2386     def args(body)
2387       @body = body
2388     end
2389   end
2391   class IterArgs < Node
2392     kind :iter_args
2394     def args(child)
2395       @child = child
2396     end
2398     def names
2399       return [] if @child.nil?
2401       if @child.is? LocalAssignment
2402         [@child.name]
2403       else
2404         @child.assigns.body.map { |i| i.name }
2405       end
2406     end
2408     def arity
2409       case @child
2410       when nil
2411         return -1
2412       when Fixnum
2413         return 0
2414       else
2415         optional.empty? ? required.size : -(required.size + optional.size)
2416       end
2417     end
2419     def optional
2420       case @child
2421       when Fixnum, nil
2422         []
2423       else
2424         @child.optional
2425       end
2426     end
2428     def required
2429       return [] if @child.nil?
2430       @child.required
2431     end
2433     attr_accessor :child
2434   end
2436   class Iter < Node
2437     kind :iter
2439     def consume(sexp)
2440       # Conditional compilation support. If a conditional section is
2441       # matched as compilable, :iter is thrown to be caught here. We
2442       # strip out this unnecessary surrounding block including its
2443       # Newline and replace it with our contents. The condition may
2444       # seem a bit strange but it is because the catch returns nil
2445       # if :iter _is_ thrown, otherwise it returns the block value
2446       # as normal.
2447       unless catch(:iter) { sexp[0] = convert(sexp[0]) }
2448         throw :newline, convert(sexp[2])
2449       end
2451       c = sexp[0]
2453       # Get rid of the linked list of dasgn_curr's at the top
2454       # of a block in at iter.
2455       if sexp.length > 2   # Fix for empty block
2456         first = sexp[2][1]
2457         if first.kind_of?(Array) and first[0] == :dasgn_curr
2458           if first[2].nil? or first[2][0] == :dasgn_curr
2459             sexp[2].delete_at(1)
2460           end
2461         end
2462       end
2464       if c.is? FCall and c.method == :loop
2465         sexp[1] = convert(sexp[1])
2466         sexp[2] = convert(sexp[2])
2467         return sexp
2468       end
2470       set(:iter) do
2472         @locals = get(:scope).new_block_scope do
2473           set(:iter_args) do
2474             sexp[1] = convert([:iter_args, sexp[1]])
2475           end
2477           sexp[2] = convert(sexp[2])
2478         end
2479       end
2481       sexp
2482     end
2484     def normalize(c, a, b)
2485       @arguments, @body = a, expand(b)
2487       if c.is? FCall and c.method == :loop
2488         n = Loop.new(@compiler)
2489         n.args(b)
2490         return n
2491       end
2493       c.block = self
2495       return c
2496     end
2498     attr_accessor :arguments, :body, :locals
2499   end
2501   class For < Iter
2502     kind :for
2504     # [[:newline, 1, "(eval)", [:dot2, [:lit, 1], [:lit, 2]]], [:lasgn, :x, 0]]
2505     # should become
2506     # [[:call, [:newline, 1, "(eval)", [:dot2, [:lit, 1], [:lit, 2]]], :each], [:lasgn, :x, 0] ]
2507     def self.create(compiler, sexp)
2508       # sexp[0] is :for
2509       # sexp[1] is the enumeration for each
2510       # sexp[2] is the arguments
2511       # sexp[3] is the body, if any
2512       sexp = [sexp[0], [:call, sexp[1], :each], sexp[2], sexp[3]]
2513       super(compiler, sexp)
2514     end
2516     def consume(sexp)
2517       converted = convert(sexp[0])
2518       sexp[0] = converted # enum for the 'each' call
2520       # 'declare' the vars outside the for.
2521       scope = get(:scope)
2523       vars = sexp[1]
2525       block = get(:iter)
2527       if vars.first == :masgn
2528         ary = vars[1]
2529         1.upto(ary.size - 1) do |i|
2530           scope.find_local ary[i][1], block if ary[i].first == :lasgn
2531         end
2532       else
2533         scope.find_local vars[1], block if vars.first == :lasgn
2534       end
2536       set(:iter) do
2537         @locals = get(:scope).new_block_scope do
2538           set(:iter_args) do
2539            sexp[1] = convert([:iter_args, sexp[1]]) # local var assignment
2540           end
2542           sexp[2] = convert(sexp[2]) # body
2543         end
2544       end
2546       sexp
2547     end
2549     def normalize(c, arguments, body)
2550       @arguments, @body = arguments, expand(body)
2552       c.block = self
2553       return c
2554     end
2555   end
2557   class BlockPass < Node
2558     kind :block_pass
2560     def normalize(blk, call)
2561       @block = blk
2563       call.block = self
2564       return call
2565     end
2567     attr_accessor :block
2568   end
2570   class ExecuteString < StringLiteral
2571     kind :xstr
2572   end
2574   # "#{foo.bar}"
2575   #
2576   # Evstrs appear as a part of a dstr, dynamic string.
2577   # The evstr part is the code to be evaluated while
2578   # the dstr puts the whole thing together.
2579   #
2580   # Interestingly, an evstr that only contains string
2581   # literals such as "#{'foo'}" is parsed to a plain
2582   # string literal. This is the same for dregx.
2583   class ToString < Node
2584     kind :evstr
2586     # Expected input is a sub-sexp that represents the
2587     # code to be run when evaluating or empty sexp.
2588     def consume(sexp)
2589       sexp = [[:str, ""]] if sexp.empty?
2590       super(sexp)
2591     end
2593     def args(child)
2594       @child = child
2595     end
2597     attr_accessor :child
2598   end
2600   class DynamicExecuteString < DynamicString
2601     kind :dxstr
2602   end
2604   class DynamicSymbol < Node
2605     kind :dsym
2607     def args(string)
2608       @string = string
2609     end
2610   end
2612   class Alias < Node
2613     kind :alias
2615     def args(current, name)
2616       @current, @new = current, name
2617     end
2619     attr_accessor :current, :new
2620   end
2622   class VAlias < Node
2623     kind :valias
2625     def args(current, name)
2626       @current, @new = current, name
2627     end
2629     attr_accessor :current, :new
2630   end
2632   class Range < Node
2633     kind :dot2
2635     def args(start, fin)
2636       @start, @finish = start, fin
2637     end
2639     attr_accessor :start, :finish
2640   end
2642   class RangeExclude < Range
2643     kind :dot3
2644   end
2646   class CVarAssign < Node
2647     kind :cvasgn
2649     def args(name, val)
2650       @name, @value = name, val
2651       @in_module = get(:scope).module_body?
2652     end
2654     attr_accessor :name, :value
2655   end
2657   class CVarDeclare < CVarAssign
2658     kind :cvdecl
2659   end
2661   class CVar < Node
2662     kind :cvar
2664     def args(name)
2665       @name = name
2666       @in_module = get(:scope).module_body?
2667     end
2669     attr_accessor :name
2670   end
2672   class File < Node
2673     kind :file
2674   end