Class: Opal::Nodes::IterNode
Instance Attribute Summary
Attributes inherited from NodeWithArgs
#arity, #original_args, #used_kwargs
Attributes inherited from ScopeNode
#await_encountered, #block_name, #catch_return, #defs, #gvars, #has_break, #has_retry, #identity, #ivars, #locals, #methods, #mid, #name, #parent, #rescue_else_sexp, #scope_name
Attributes inherited from Base
#compiler, #sexp, #type
Instance Method Summary
collapse
#compile_arity_check, #initialize, #parameters_code
Methods inherited from ScopeNode
#accepts_using?, #add_arg, #add_proto_ivar, #add_scope_gvar, #add_scope_ivar, #add_scope_local, #add_scope_temp, #class?, #class_scope?, #collect_refinements_temps, #current_rescue, #def?, #def_in_class?, #defines_lambda, #find_parent_def, #gen_retry_id, #has_local?, #has_rescue_else?, #has_temp?, #identify!, #in_ensure, #in_ensure?, #in_resbody, #in_resbody?, #in_rescue, #in_scope, #in_while?, #initialize, #is_lambda!, #iter?, #lambda?, #lambda_definition?, #module?, #new_refinements_temp, #new_temp, #next_temp, #pop_while, #push_while, #queue_temp, #refinements_temp, #sclass?, #scope_locals, #super_chain, #to_vars, #top?, #top_scope, #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_resbody, #in_resbody?, #in_rescue, #in_while?, #initialize, #process, #push, #recv, #recv?, #s, #scope, #source_location, #stmt, #stmt?, #top_scope, 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
124
125
126
|
# File 'opal/lib/opal/nodes/iter.rb', line 124
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
61
62
63
64
65
66
67
68
69
70
71
72
|
# File 'opal/lib/opal/nodes/iter.rb', line 13
def compile
is_lambda! if scope.lambda_definition?
inline_params = nil
to_vars = identity = body_code = nil
in_scope do
identity = scope.identify!
add_temp "self = #{identity}.$$s == null ? this : #{identity}.$$s"
inline_params = process(inline_args)
compile_arity_check
body_code = stmt(returned_body)
to_vars = scope.to_vars
line body_code
if scope.catch_return
unshift "try {\n"
line '} catch ($returner) { if ($returner === Opal.returner) { return $returner.$v }'
push ' throw $returner; }'
end
end
unshift to_vars
if await_encountered
unshift "(#{identity} = async function(", inline_params, '){'
else
unshift "(#{identity} = function(", inline_params, '){'
end
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
74
75
76
77
78
79
80
81
82
83
|
# File 'opal/lib/opal/nodes/iter.rb', line 74
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
128
129
130
131
132
|
# File 'opal/lib/opal/nodes/iter.rb', line 128
def contains_break?
finder = Opal::Rewriters::BreakFinder.new
finder.process(@sexp)
finder.found_break?
end
|
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
# File 'opal/lib/opal/nodes/iter.rb', line 85
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
113
114
115
|
# File 'opal/lib/opal/nodes/iter.rb', line 113
def has_top_level_mlhs_arg?
original_args.children.any? { |arg| arg.type == :mlhs }
end
|
#has_trailing_comma_in_args? ⇒ Boolean
117
118
119
120
121
122
|
# File 'opal/lib/opal/nodes/iter.rb', line 117
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
109
110
111
|
# File 'opal/lib/opal/nodes/iter.rb', line 109
def returned_body
compiler.returns(body || s(:nil))
end
|