Sha256: f3a6c941f074677cf6433f585c02f2c9bcc729f497c78738e79083cac3c5784b

Contents?: true

Size: 1.09 KB

Versions: 7

Compression:

Stored size: 1.09 KB

Contents

# frozen_string_literal: true
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
      children :name

      def compile
        return unless name

        add_temp 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 "#{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 "#{name} = new Array($rest_len);"
          line "for (var $arg_idx = #{offset}; $arg_idx < $args_len; $arg_idx++) {"
          line "  #{name}[$arg_idx - #{offset}] = arguments[$arg_idx];"
          line "}"
        end
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
opal-0.11.4 lib/opal/nodes/args/restarg.rb
opal-0.11.3 lib/opal/nodes/args/restarg.rb
opal-0.11.2 lib/opal/nodes/args/restarg.rb
opal-0.11.1 lib/opal/nodes/args/restarg.rb
opal-0.11.1.pre lib/opal/nodes/args/restarg.rb
opal-0.11.0 lib/opal/nodes/args/restarg.rb
opal-0.11.0.rc1 lib/opal/nodes/args/restarg.rb