Class: Red::DefinitionNode::Method::Instance
- Inherits:
-
Red::DefinitionNode::Method
- Object
- String
- Red::DefinitionNode
- Red::DefinitionNode::Method
- Red::DefinitionNode::Method::Instance
- Defined in:
- lib/red/nodes/definition_nodes.rb
Overview
def args_and_contents_from(scope, function)
block = scope.assoc(:block) || scope
block_arg = block.delete(block.assoc(:block_arg)) || ([:block_arg, :block] if block.flatten.include?(:yield))
arguments = block.assoc(:args) ? block.assoc(:args)[1..-1] || [] : []
defaults = arguments.delete(arguments.assoc(:block))
splat_arg = arguments.pop.to_s[1..-1] if arguments.last && arguments.last.to_s.include?('*')
arguments = (block_arg ? arguments << block_arg.last : arguments).map {|arg| arg.red!}
block_given = "var blockGivenBool=(typeof(arguments[arguments.length-1])=='function')" if block_arg
args_array = "var blockGivenBool;var l=(blockGivenBool?arguments.length-1:arguments.length);#{splat_arg}=[];for(var i=#{block_arg ? arguments.size - 1 : arguments.size};i<l;++i){#{splat_arg}.push(arguments[i]);};var block=(blockGivenBool?arguments[arguments.length-1]:nil)" if splat_arg
contents = [block_given, args_array, defaults.red!(:as_argument_default => true), scope.red!(:force_return => function != 'initialize')].compact.reject {|x| x.empty? }
return [arguments, contents]
end
Instance Method Summary collapse
-
#initialize(function_name_sexp, scope_sexp, options) ⇒ Instance
constructor
[:defn, :foo, [:scope, [:block, [:args, (:my_arg1, :my_arg2, …, :‘*my_args’, (:block))], (:block_arg, :my_block), expression, expression, …]].
Methods inherited from String
#%, #*, #+, #<<, #<=>, #==, #=~, #[], #[]=, #capitalize, #capitalize!, #casecmp, #center, #chomp, #chomp!, #chop, #chop!, #concat, #count, #crypt, #delete, #delete!, #downcase, #downcase!, #each, #each_byte, #each_line, #empty?, #eql?, #gsub, #gsub!, #hash, #hex, #include?, #index, #insert, #inspect, #intern, #length, #ljust, #lstrip, #lstrip!, #match, #next, #next!, #oct, #replace, #reverse, #reverse!, #rindex, #rjust, #rstrip, #rstrip!, #scan, #size, #slice, #slice!, #split, #squeeze, #strip, #strip!, #strip_scripts, #sub, #sub!, #succ, #succ!, #sum, #swapcase, #swapcase!, #to_f, #to_i, #to_s, #to_str, #to_sym, #tr, #tr!, #tr_s, #tr_s!, #upcase, #upcase!, #upto
Constructor Details
#initialize(function_name_sexp, scope_sexp, options) ⇒ Instance
- :defn, :foo, [:scope, [:block, [:args, (:my_arg1, :my_arg2, …, :‘*my_args’, (:block))], (:block_arg, :my_block), expression, expression, …]
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# File 'lib/red/nodes/definition_nodes.rb', line 86 def initialize(function_name_sexp, scope_sexp, ) return if @@red_import && !@@red_methods.include?(function_name_sexp) function = (METHOD_ESCAPE[function_name_sexp] || function_name_sexp).red! @@red_function = function block_sexp = scope_sexp.assoc(:block) block_arg_sexp = block_sexp.delete(block_sexp.assoc(:block_arg)) || ([:block_arg, :_block] if block_sexp.flatten.include?(:yield)) @@red_block_arg = block_arg_sexp.last if block_arg_sexp argument_sexps = block_sexp.assoc(:args)[1..-1] || [] defaults_sexp = argument_sexps.delete(argument_sexps.assoc(:block)) splat_arg = argument_sexps.pop.to_s[1..-1] if argument_sexps.last && argument_sexps.last.to_s.include?('*') argument_sexps += [block_arg_sexp.last] if block_arg_sexp args_array = argument_sexps.map {|argument| argument.red! } maximum_args = args_array.length - (block_arg_sexp ? 1 : 0) minimum_args = maximum_args - (defaults_sexp ? defaults_sexp.flatten.select {|x| x == :lasgn}.length : 0) splatten_args = "for(var l=arguments.length,i=#{argument_sexps.size},#{splat_arg}=[];i<l;++i){#{splat_arg}.push(arguments[i]);}" if splat_arg && !block_arg_sexp splat_block = "for(var l=arguments.length,bg=m$block_given_bool(arguments[l-1]),l=bg?l-1:l,i=#{argument_sexps.size - 1},#{splat_arg}=[];i<l;++i){#{splat_arg}.push(arguments[i]);};var #{block_arg_sexp.last rescue :_block}=(bg?c$Proc.m$new(arguments[arguments.length-1]):nil)" if splat_arg && block_arg_sexp block_arg = "var z=arguments[arguments.length-1],bg=m$block_given_bool(z),#{block_arg_sexp.last rescue :_block}=bg?c$Proc.m$new(z):nil" if block_arg_sexp && !splat_arg args_checker = "$a(%s,%s,arguments,%s)" % [minimum_args, (splat_arg ? -1 : maximum_args), (splat_block || block_arg ? "bg?1:0" : "arguments[arguments.length-1]&&arguments[arguments.length-1].__block__?1:0")] if Red.debug && ![:new, :initialize].include?(function_name_sexp) defaults = defaults_sexp.red!(:as_argument_default => true) if defaults_sexp arguments = args_array.join(",") scope = scope_sexp.red!(:force_return => function != 'initialize') contents = [(splatten_args || splat_block || block_arg), args_checker, defaults, scope].compact.join(";") if [:as_class_eval] string = "_.m$%s=function(%s){%s;}" else string = "m$%s=function(%s){%s;}" end self << string % [function, arguments, contents] @@red_block_arg = nil @@red_function = nil end |