Sha256: 8d7e279055c788a9e14e18ecd5f428d1b869d7fd2c10f87ff050097f5651ef23

Contents?: true

Size: 1.14 KB

Versions: 13

Compression:

Stored size: 1.14 KB

Contents

require 'opal/nodes/base'

module Opal
  module Nodes
    # A node responsible for extracting a rest argument
    # (or splat argument)
    #
    # def m(*rest)
    #
    class RestargNode < Base
      handle :restarg

      def compile
        restarg_name = @sexp[1]
        return unless restarg_name
        var_name = variable(restarg_name.to_sym)

        add_temp var_name

        if @sexp.meta[:post]
          # post restarg case (in mlhs or in deoptimized arguments)
          # splat is always the last item in scope.working_arguments
          line "#{var_name} = #{scope.working_arguments};"
        else
          # inline restarg case
          offset = @sexp.meta[:offset]
          # restarg value should be taken directly from parameters
          line "var $args_len = arguments.length, $rest_len = $args_len - #{offset};"
          line "if ($rest_len < 0) { $rest_len = 0; }"
          line "#{var_name} = new Array($rest_len);"
          line "for (var $arg_idx = #{offset}; $arg_idx < $args_len; $arg_idx++) {"
          line "  #{var_name}[$arg_idx - #{offset}] = arguments[$arg_idx];"
          line "}"
        end
      end
    end
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
opal-0.10.6 lib/opal/nodes/args/restarg.rb
opal-0.10.6.beta lib/opal/nodes/args/restarg.rb
opal-0.10.5 lib/opal/nodes/args/restarg.rb
opal-0.10.4 lib/opal/nodes/args/restarg.rb
opal-0.10.3 lib/opal/nodes/args/restarg.rb
opal-0.10.2 lib/opal/nodes/args/restarg.rb
opal-0.10.1 lib/opal/nodes/args/restarg.rb
opal-0.10.0 lib/opal/nodes/args/restarg.rb
opal-0.10.0.rc2 lib/opal/nodes/args/restarg.rb
opal-0.10.0.rc1 lib/opal/nodes/args/restarg.rb
opal-0.10.0.beta5 lib/opal/nodes/args/restarg.rb
opal-0.10.0.beta4 lib/opal/nodes/args/restarg.rb
opal-0.10.0.beta3 lib/opal/nodes/args/restarg.rb