Class: Opal::Nodes::ResBodyNode
- Inherits:
-
Base
- Object
- Base
- Opal::Nodes::ResBodyNode
show all
- Defined in:
- opal/lib/opal/nodes/rescue.rb
Constant Summary
Constants included
from Helpers
Helpers::BASIC_IDENTIFIER_RULES, Helpers::ES3_RESERVED_WORD_EXCLUSIVE, Helpers::ES51_RESERVED_WORD, Helpers::IMMUTABLE_PROPS, Helpers::PROTO_SPECIAL_METHODS, Helpers::PROTO_SPECIAL_PROPS
Instance Attribute Summary
Attributes inherited from Base
#compiler, #type
Instance Method Summary
collapse
Methods inherited from Base
#add_gvar, #add_ivar, #add_local, #add_temp, children, #children, #compile_to_fragments, #error, #expr, #expr?, #expr_or_nil, #fragment, handle, handlers, #helper, #in_while?, #initialize, #process, #push, #recv, #recv?, #s, #scope, #stmt, #stmt?, #unshift, #while_loop, #with_temp, #wrap
Methods included from Helpers
#current_indent, #empty_line, #indent, #ivar, #js_falsy, #js_truthy, #js_truthy_optimize, #line, #lvar_to_js, #mid_to_jsid, #property, #valid_ivar_name?, #valid_name?, #variable
Instance Method Details
#compile ⇒ Object
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
# File 'opal/lib/opal/nodes/rescue.rb', line 98
def compile
push "if ("
if rescue_exprs.empty?
push "true"
else
push "Opal.rescue($err, ["
rescue_exprs.each_with_index do |rexpr, idx|
push ', ' unless idx == 0
push expr(rexpr)
end
push "])"
end
push ") {"
if variable = rescue_variable
variable[2] = s(:js_tmp, '$err')
push expr(variable), ';'
end
line "try {"
indent do
line process(rescue_body, @level)
end
line "} finally {"
indent do
line 'Opal.gvars["!"] = Opal.exceptions.pop() || Opal.nil;'
end
line "}"
line "}"
end
|
#rescue_body ⇒ Object
145
146
147
148
149
|
# File 'opal/lib/opal/nodes/rescue.rb', line 145
def rescue_body
body_code = (body || s(:nil))
body_code = compiler.returns(body_code) if !stmt?
body_code
end
|
#rescue_exprs ⇒ Object
139
140
141
142
143
|
# File 'opal/lib/opal/nodes/rescue.rb', line 139
def rescue_exprs
exprs = args.dup
exprs.pop if rescue_variable?(exprs.last)
exprs.children
end
|
#rescue_variable ⇒ Object
135
136
137
|
# File 'opal/lib/opal/nodes/rescue.rb', line 135
def rescue_variable
rescue_variable?(args.last) ? args.last.dup : nil
end
|
#rescue_variable?(variable) ⇒ Boolean
131
132
133
|
# File 'opal/lib/opal/nodes/rescue.rb', line 131
def rescue_variable?(variable)
Sexp === variable and [:lasgn, :iasgn].include?(variable.type)
end
|