Class: Opal::Nodes::IterNode
Instance Attribute Summary
Attributes inherited from NodeWithArgs
#arity, #original_args, #used_kwargs
Attributes inherited from ScopeNode
#block_name, #catch_return, #defs, #gvars, #has_break, #identity, #ivars, #locals, #methods, #mid, #name, #parent, #rescue_else_sexp, #scope_name, #uses_super, #uses_zuper
Attributes inherited from Base
#compiler, #type
Instance Method Summary
collapse
#compile_arity_check, #initialize, #parameters_code
Methods inherited from ScopeNode
#add_arg, #add_proto_ivar, #add_scope_gvar, #add_scope_ivar, #add_scope_local, #add_scope_temp, #class?, #class_scope?, #def?, #def_in_class?, #find_parent_def, #has_local?, #has_rescue_else?, #has_temp?, #identify!, #in_ensure, #in_ensure?, #in_scope, #in_while?, #initialize, #iter?, #module?, #new_temp, #next_temp, #pop_while, #push_while, #queue_temp, #sclass?, #super_chain, #to_vars, #top?, #uses_block!, #uses_block?
Methods inherited from Base
#add_gvar, #add_ivar, #add_local, #add_temp, #children, children, #class_variable_owner, #class_variable_owner_nesting_level, #comments, #compile_to_fragments, #error, #expr, #expr?, #expr_or_nil, #fragment, handle, handlers, #has_rescue_else?, #helper, #in_ensure, #in_ensure?, #in_while?, #initialize, #process, #push, #recv, #recv?, #s, #scope, #stmt, #stmt?, truthy_optimize?, #unshift, #while_loop, #with_temp, #wrap
Methods included from Helpers
#conditional_send, #current_indent, #empty_line, #indent, #js_falsy, #js_truthy, #js_truthy_optimize, #line, #mid_to_jsid, #property, #valid_name?
Instance Method Details
#arity_check_node ⇒ Object
112
113
114
|
# File 'opal/lib/opal/nodes/iter.rb', line 112
def arity_check_node
s(:iter_arity_check, original_args)
end
|
#compile ⇒ Object
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
# File 'opal/lib/opal/nodes/iter.rb', line 13
def compile
inline_params = nil
to_vars = identity = body_code = nil
in_scope do
identity = scope.identify!
add_temp "self = #{identity}.$$s || this"
inline_params = process(inline_args)
compile_arity_check
body_code = stmt(returned_body)
to_vars = scope.to_vars
end
line body_code
unshift to_vars
unshift "(#{identity} = function(", inline_params, '){'
push "}, #{identity}.$$s = self,"
push " #{identity}.$$brk = $brk," if contains_break?
push " #{identity}.$$arity = #{arity},"
if compiler.arity_check?
push " #{identity}.$$parameters = #{parameters_code},"
end
if has_top_level_mlhs_arg?
push " #{identity}.$$has_top_level_mlhs_arg = true,"
end
if has_trailing_comma_in_args?
push " #{identity}.$$has_trailing_comma_in_args = true,"
end
push " #{identity})"
end
|
#compile_block_arg ⇒ Object
62
63
64
65
66
67
68
69
70
71
|
# File 'opal/lib/opal/nodes/iter.rb', line 62
def compile_block_arg
if block_arg
scope.block_name = block_arg
scope.add_temp block_arg
scope_name = scope.identify!
line "#{block_arg} = #{scope_name}.$$p || nil;"
line "if (#{block_arg}) #{scope_name}.$$p = null;"
end
end
|
#contains_break? ⇒ Boolean
116
117
118
119
120
|
# File 'opal/lib/opal/nodes/iter.rb', line 116
def contains_break?
finder = Opal::Rewriters::BreakFinder.new
finder.process(@sexp)
finder.found_break?
end
|
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
# File 'opal/lib/opal/nodes/iter.rb', line 73
def
valid_args = []
caught_blank_argument = false
args.children.each do |arg|
arg_name = arg.children.first
if arg_name == :_
unless caught_blank_argument
caught_blank_argument = true
valid_args << arg
end
else
valid_args << arg
end
end
@sexp = @sexp.updated(
nil, [
args.updated(nil, valid_args),
body
]
)
end
|
#has_top_level_mlhs_arg? ⇒ Boolean
101
102
103
|
# File 'opal/lib/opal/nodes/iter.rb', line 101
def has_top_level_mlhs_arg?
original_args.children.any? { |arg| arg.type == :mlhs }
end
|
#has_trailing_comma_in_args? ⇒ Boolean
105
106
107
108
109
110
|
# File 'opal/lib/opal/nodes/iter.rb', line 105
def has_trailing_comma_in_args?
if original_args.loc && original_args.loc.expression
args_source = original_args.loc.expression.source
args_source.match(/,\s*\|/)
end
end
|
#returned_body ⇒ Object
97
98
99
|
# File 'opal/lib/opal/nodes/iter.rb', line 97
def returned_body
compiler.returns(body || s(:nil))
end
|