Class: Opal::Compiler
- Inherits:
-
Object
- Object
- Opal::Compiler
- Includes:
- Nodes::Closure::CompilerSupport
- Defined in:
- opal/lib/opal/compiler.rb
Overview
Constant Summary collapse
- INDENT =
Generated code gets indented with two spaces on each scope
' '
- COMPARE =
All compare method nodes - used to optimize performance of math comparisons
%w[< > <= >=].freeze
Instance Attribute Summary collapse
-
#case_stmt ⇒ Object
readonly
Current case_stmt.
-
#comments ⇒ Object
readonly
Comments from the source code.
-
#dynamic_cache_result ⇒ Object
Set if some rewritter caused a dynamic cache result, meaning it's not fit to be cached.
-
#eof_content ⇒ Object
readonly
Any content in END special construct.
-
#fragments ⇒ Array
readonly
All [Opal::Fragment] used to produce result.
-
#magic_comments ⇒ Object
readonly
Magic comment flags extracted from the leading comments.
-
#method_calls ⇒ Object
readonly
Method calls made in this file.
-
#result ⇒ String
readonly
The compiled ruby code.
-
#scope ⇒ Object
Current scope.
-
#source ⇒ Object
readonly
Access the source code currently processed.
-
#top_scope ⇒ Object
Top scope.
Class Method Summary collapse
-
.compiler_option(name, config = {}) ⇒ Object
Defines a compiler option.
- .module_name(path) ⇒ Object
Instance Method Summary collapse
-
#arity_check? ⇒ Boolean
adds an arity check to every method definition.
-
#async_await ⇒ Object
Enable async/await support and optionally enable auto-await.
-
#async_await_before_typecasting ⇒ Object
Enable async/await support and optionally enable auto-await.
- #async_await_set_to_regexp(set) ⇒ Object
-
#autoloads ⇒ Object
An array of things (requires, trees) which don't need to success in loading compile-time.
-
#compile ⇒ String
Compile some ruby code to a string.
-
#dynamic_require_severity ⇒ Object
how to handle dynamic requires (:error, :warning, :ignore).
-
#enable_file_source_embed? ⇒ Object
Embeds source code along compiled files.
-
#enable_source_location? ⇒ Object
Adds source_location for every method definition.
-
#error(msg, line = nil) ⇒ Object
This is called when a parsing/processing error occurs.
-
#esm? ⇒ Object
Encourage ESM semantics, eg.
-
#file ⇒ String
The filename to use for compiling this code.
- #fragment(str, scope, sexp = nil) ⇒ Object
- #freezing? ⇒ Boolean deprecated Deprecated.
- #handle_block_given_call(sexp) ⇒ Object
- #handlers ⇒ Object
-
#helper(name) ⇒ Object
Use the given helper.
-
#helpers ⇒ Set<Symbol>
Any helpers required by this file.
- #in_case ⇒ Object
-
#in_while ⇒ Object
Used when we enter a while statement.
-
#in_while? ⇒ Boolean
Returns true if the parser is curently handling a while sexp, false otherwise.
-
#indent ⇒ Object
To keep code blocks nicely indented, this will yield a block after adding an extra layer of indent, and then returning the resulting code after reverting the indent.
-
#initialize(source, options = {}) ⇒ Compiler
constructor
A new instance of Compiler.
-
#inline_operators? ⇒ Object
are operators compiled inline.
-
#irb? ⇒ Object
compile top level local vars with support for irb style vars.
-
#load? ⇒ Object
Instantly load a requirable module.
-
#marshal_dump ⇒ Object
Marshalling for cache shortpath.
- #marshal_load(src) ⇒ Object
-
#method_missing? ⇒ Boolean
adds method stubs for all used methods in file.
-
#no_export? ⇒ Object
Don't export this compile, even if ESM mode is enabled.
-
#option_value(name, config) ⇒ Object
Fetches and memoizes the value for an option.
- #parse ⇒ Object
-
#parse_comments? ⇒ Object
Adds comments for every method definition.
-
#parser_indent ⇒ Object
Instances of
Scope
can use this to determine the current scope indent. -
#process(sexp, level = :expr) ⇒ Object
Process the given sexp by creating a node instance, based on its type, and compiling it to fragments.
- #re_raise_with_location ⇒ Object
- #record_method_call(mid) ⇒ Object
-
#requirable? ⇒ Object
Prepare the code for future requires.
-
#required_trees ⇒ Object
An array of trees required in this file (typically by calling #require_tree).
-
#requires ⇒ Object
An array of requires used in this file.
-
#returns(sexp) ⇒ Object
The last sexps in method bodies, for example, need to be returned in the compiled javascript.
-
#s(type, *children) ⇒ Object
Create a new sexp using the given parts.
-
#source_map ⇒ Opal::SourceMap
Returns a source map that can be used in the browser to map back to original ruby code.
-
#unique_temp(name) ⇒ Object
Used to generate a unique id name per file.
-
#use_strict? ⇒ Object
Enables JavaScript's strict mode (i.e., adds 'use strict'; statement).
-
#warning(msg, line = nil) ⇒ Object
This is called when a parsing/processing warning occurs.
-
#with_temp ⇒ Object
Temporary varibales will be needed from time to time in the generated code, and this method will assign (or reuse) on while the block is yielding, and queue it back up once it is finished.
Methods included from Nodes::Closure::CompilerSupport
Constructor Details
#initialize(source, options = {}) ⇒ Compiler
Returns a new instance of Compiler.
253 254 255 256 257 258 259 260 261 262 263 264 |
# File 'opal/lib/opal/compiler.rb', line 253 def initialize(source, = {}) @source = source @indent = '' @unique = 0 @options = @comments = Hash.new([]) @case_stmt = nil @method_calls = Set.new @option_values = {} @magic_comments = {} @dynamic_cache_result = false end |
Instance Attribute Details
#case_stmt ⇒ Object (readonly)
Current case_stmt
232 233 234 |
# File 'opal/lib/opal/compiler.rb', line 232 def case_stmt @case_stmt end |
#comments ⇒ Object (readonly)
Comments from the source code
238 239 240 |
# File 'opal/lib/opal/compiler.rb', line 238 def comments @comments end |
#dynamic_cache_result ⇒ Object
Set if some rewritter caused a dynamic cache result, meaning it's not fit to be cached
251 252 253 |
# File 'opal/lib/opal/compiler.rb', line 251 def dynamic_cache_result @dynamic_cache_result end |
#eof_content ⇒ Object (readonly)
Any content in END special construct
235 236 237 |
# File 'opal/lib/opal/compiler.rb', line 235 def eof_content @eof_content end |
#fragments ⇒ Array (readonly)
Returns all [Opal::Fragment] used to produce result.
223 224 225 |
# File 'opal/lib/opal/compiler.rb', line 223 def fragments @fragments end |
#magic_comments ⇒ Object (readonly)
Magic comment flags extracted from the leading comments
244 245 246 |
# File 'opal/lib/opal/compiler.rb', line 244 def magic_comments @magic_comments end |
#method_calls ⇒ Object (readonly)
Method calls made in this file
241 242 243 |
# File 'opal/lib/opal/compiler.rb', line 241 def method_calls @method_calls end |
#result ⇒ String (readonly)
Returns The compiled ruby code.
220 221 222 |
# File 'opal/lib/opal/compiler.rb', line 220 def result @result end |
#scope ⇒ Object
Current scope
226 227 228 |
# File 'opal/lib/opal/compiler.rb', line 226 def scope @scope end |
#source ⇒ Object (readonly)
Access the source code currently processed
247 248 249 |
# File 'opal/lib/opal/compiler.rb', line 247 def source @source end |
#top_scope ⇒ Object
Top scope
229 230 231 |
# File 'opal/lib/opal/compiler.rb', line 229 def top_scope @top_scope end |
Class Method Details
.compiler_option(name, config = {}) ⇒ Object
Defines a compiler option.
68 69 70 71 |
# File 'opal/lib/opal/compiler.rb', line 68 def self.compiler_option(name, config = {}) method_name = config.fetch(:as, name) define_method(method_name) { option_value(name, config) } end |
.module_name(path) ⇒ Object
59 60 61 62 |
# File 'opal/lib/opal/compiler.rb', line 59 def self.module_name(path) path = File.join(File.dirname(path), File.basename(path).split('.').first) Pathname(path).cleanpath.to_s end |
Instance Method Details
#arity_check? ⇒ Boolean
adds an arity check to every method definition
118 |
# File 'opal/lib/opal/compiler.rb', line 118 compiler_option :arity_check, default: false, as: :arity_check? |
#async_await ⇒ Object
Enable async/await support and optionally enable auto-await.
Use either true, false, an Array of Symbols, a String containing names to auto-await separated by a comma or a Regexp.
Auto-await awaits provided methods by default as if .await was added to them automatically.
By default, the support is disabled (set to false).
If the config value is not set to false, any calls to #await will be translated to ES8 await keyword which makes the scope return a Promise and a containing scope will be async (instead of a value, it will return a Promise).
If the config value is an array, or a String separated by a comma, auto-await is also enabled.
A member of this collection can contain a wildcard character * in which case all methods containing a given substring will be awaited.
It can be used as a magic comment, examples:
# await: true
# await: *await*
# await: *await*, sleep, gets
217 |
# File 'opal/lib/opal/compiler.rb', line 217 compiler_option :await, default: false, as: :async_await, magic_comment: true |
#async_await_before_typecasting ⇒ Object
Enable async/await support and optionally enable auto-await.
Use either true, false, an Array of Symbols, a String containing names to auto-await separated by a comma or a Regexp.
Auto-await awaits provided methods by default as if .await was added to them automatically.
By default, the support is disabled (set to false).
If the config value is not set to false, any calls to #await will be translated to ES8 await keyword which makes the scope return a Promise and a containing scope will be async (instead of a value, it will return a Promise).
If the config value is an array, or a String separated by a comma, auto-await is also enabled.
A member of this collection can contain a wildcard character * in which case all methods containing a given substring will be awaited.
It can be used as a magic comment, examples:
# await: true
# await: *await*
# await: *await*, sleep, gets
329 |
# File 'opal/lib/opal/compiler.rb', line 329 compiler_option :await, default: false, as: :async_await, magic_comment: true |
#async_await_set_to_regexp(set) ⇒ Object
349 350 351 352 353 |
# File 'opal/lib/opal/compiler.rb', line 349 def async_await_set_to_regexp(set) set = set.map { |name| Regexp.escape(name.to_s).gsub('\*', '.*?') } set = set.join('|') /^(#{set})$/ end |
#autoloads ⇒ Object
An array of things (requires, trees) which don't need to success in loading compile-time.
512 513 514 |
# File 'opal/lib/opal/compiler.rb', line 512 def autoloads @autoloads ||= [] end |
#compile ⇒ String
Compile some ruby code to a string.
269 270 271 272 273 274 275 276 |
# File 'opal/lib/opal/compiler.rb', line 269 def compile parse @fragments = re_raise_with_location { process(@sexp).flatten } @fragments << fragment("\n", nil, s(:newline)) unless @fragments.last.code.end_with?("\n") @result = @fragments.map(&:code).join('') end |
#dynamic_require_severity ⇒ Object
how to handle dynamic requires (:error, :warning, :ignore)
136 |
# File 'opal/lib/opal/compiler.rb', line 136 compiler_option :dynamic_require_severity, default: :ignore, valid_values: %i[error warning ignore] |
#enable_file_source_embed? ⇒ Object
Embeds source code along compiled files
175 |
# File 'opal/lib/opal/compiler.rb', line 175 compiler_option :enable_file_source_embed, default: false, as: :enable_file_source_embed? |
#enable_source_location? ⇒ Object
Adds source_location for every method definition
170 |
# File 'opal/lib/opal/compiler.rb', line 170 compiler_option :enable_source_location, default: false, as: :enable_source_location? |
#error(msg, line = nil) ⇒ Object
This is called when a parsing/processing error occurs. This method simply appends the filename and curent line number onto the message and raises it.
358 359 360 361 362 |
# File 'opal/lib/opal/compiler.rb', line 358 def error(msg, line = nil) error = ::Opal::SyntaxError.new(msg) error.location = Opal::OpalBacktraceLocation.new(file, line) raise error end |
#esm? ⇒ Object
Encourage ESM semantics, eg. exporting run result
151 |
# File 'opal/lib/opal/compiler.rb', line 151 compiler_option :esm, default: false, as: :esm? |
#file ⇒ String
The filename to use for compiling this code. Used for FILE directives as well as finding relative require()
104 |
# File 'opal/lib/opal/compiler.rb', line 104 compiler_option :file, default: '(file)' |
#fragment(str, scope, sexp = nil) ⇒ Object
395 396 397 |
# File 'opal/lib/opal/compiler.rb', line 395 def fragment(str, scope, sexp = nil) Fragment.new(str, scope, sexp) end |
#freezing? ⇒ Boolean
stubs out #freeze and #frozen?
126 |
# File 'opal/lib/opal/compiler.rb', line 126 compiler_option :freezing, default: true, as: :freezing? |
#handle_block_given_call(sexp) ⇒ Object
597 598 599 600 601 602 603 604 605 606 |
# File 'opal/lib/opal/compiler.rb', line 597 def handle_block_given_call(sexp) @scope.uses_block! if @scope.block_name fragment("(#{@scope.block_name} !== nil)", scope, sexp) elsif (scope = @scope.find_parent_def) && scope.block_name fragment("(#{scope.block_name} !== nil)", scope, sexp) else fragment('false', scope, sexp) end end |
#handlers ⇒ Object
495 496 497 |
# File 'opal/lib/opal/compiler.rb', line 495 def handlers @handlers ||= Opal::Nodes::Base.handlers end |
#helper(name) ⇒ Object
Use the given helper
430 431 432 |
# File 'opal/lib/opal/compiler.rb', line 430 def helper(name) helpers << name end |
#helpers ⇒ Set<Symbol>
Any helpers required by this file. Used by Nodes::Top to reference runtime helpers that are needed. These are used to minify resulting javascript by keeping a reference to helpers used.
319 320 321 322 323 |
# File 'opal/lib/opal/compiler.rb', line 319 def helpers @helpers ||= Set.new( magic_comments[:helpers].to_s.split(',').map { |h| h.strip.to_sym } ) end |
#in_case ⇒ Object
469 470 471 472 473 474 475 |
# File 'opal/lib/opal/compiler.rb', line 469 def in_case return unless block_given? old = @case_stmt @case_stmt = {} yield @case_stmt = old end |
#in_while ⇒ Object
Used when we enter a while statement. This pushes onto the current scope's while stack so we know how to handle break, next etc.
461 462 463 464 465 466 467 |
# File 'opal/lib/opal/compiler.rb', line 461 def in_while return unless block_given? @while_loop = @scope.push_while result = yield @scope.pop_while result end |
#in_while? ⇒ Boolean
Returns true if the parser is curently handling a while sexp, false otherwise.
479 480 481 |
# File 'opal/lib/opal/compiler.rb', line 479 def in_while? @scope.in_while? end |
#indent ⇒ Object
To keep code blocks nicely indented, this will yield a block after adding an extra layer of indent, and then returning the resulting code after reverting the indent.
437 438 439 440 441 442 443 444 445 |
# File 'opal/lib/opal/compiler.rb', line 437 def indent indent = @indent @indent += INDENT @space = "\n#{@indent}" res = yield @indent = indent @space = "\n#{@indent}" res end |
#inline_operators? ⇒ Object
are operators compiled inline
163 |
# File 'opal/lib/opal/compiler.rb', line 163 compiler_option :inline_operators, default: true, as: :inline_operators? |
#irb? ⇒ Object
compile top level local vars with support for irb style vars
131 |
# File 'opal/lib/opal/compiler.rb', line 131 compiler_option :irb, default: false, as: :irb? |
#load? ⇒ Object
Instantly load a requirable module
146 |
# File 'opal/lib/opal/compiler.rb', line 146 compiler_option :load, default: false, as: :load? |
#marshal_dump ⇒ Object
Marshalling for cache shortpath
609 610 611 612 613 |
# File 'opal/lib/opal/compiler.rb', line 609 def marshal_dump [@options, @option_values, @source_map ||= source_map.cache, @magic_comments, @result, @required_trees, @requires, @autoloads] end |
#marshal_load(src) ⇒ Object
615 616 617 618 619 |
# File 'opal/lib/opal/compiler.rb', line 615 def marshal_load(src) @options, @option_values, @source_map, @magic_comments, @result, @required_trees, @requires, @autoloads = src end |
#method_missing? ⇒ Boolean
adds method stubs for all used methods in file
111 |
# File 'opal/lib/opal/compiler.rb', line 111 compiler_option :method_missing, default: true, as: :method_missing? |
#no_export? ⇒ Object
Don't export this compile, even if ESM mode is enabled. We use this internally in CLI, so that even if ESM output is desired, we would only have one default export.
158 |
# File 'opal/lib/opal/compiler.rb', line 158 compiler_option :no_export, default: false, as: :no_export? |
#option_value(name, config) ⇒ Object
Fetches and memoizes the value for an option.
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'opal/lib/opal/compiler.rb', line 74 def option_value(name, config) return @option_values[name] if @option_values.key? name default_value = config[:default] valid_values = config[:valid_values] magic_comment = config[:magic_comment] value = @options.fetch(name, default_value) if magic_comment && @magic_comments.key?(name) value = @magic_comments.fetch(name) end if valid_values && !valid_values.include?(value) raise( ArgumentError, "invalid value #{value.inspect} for option #{name.inspect} " \ "(valid values: #{valid_values.inspect})" ) end @option_values[name] = value end |
#parse ⇒ Object
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 |
# File 'opal/lib/opal/compiler.rb', line 278 def parse @buffer = ::Opal::Parser::SourceBuffer.new(file, 1) @buffer.source = @source @parser = Opal::Parser.default_parser sexp, comments, tokens = re_raise_with_location { @parser.tokenize(@buffer) } kind = case when requirable? :require when eval? :eval else :main end @sexp = sexp.tap { |i| i.[:kind] = kind } first_node = sexp.children.first if sexp.children.first.location @comments = ::Parser::Source::Comment.associate_locations(first_node, comments) @magic_comments = MagicComments.parse(first_node, comments) @eof_content = EofContent.new(tokens, @source).eof end |
#parse_comments? ⇒ Object
Adds comments for every method definition
185 |
# File 'opal/lib/opal/compiler.rb', line 185 compiler_option :parse_comments, default: false, as: :parse_comments? |
#parser_indent ⇒ Object
Instances of Scope
can use this to determine the current
scope indent. The indent is used to keep generated code easily
readable.
386 387 388 |
# File 'opal/lib/opal/compiler.rb', line 386 def parser_indent @indent end |
#process(sexp, level = :expr) ⇒ Object
Process the given sexp by creating a node instance, based on its type, and compiling it to fragments.
485 486 487 488 489 490 491 492 493 |
# File 'opal/lib/opal/compiler.rb', line 485 def process(sexp, level = :expr) return fragment('', scope) if sexp.nil? if handler = handlers[sexp.type] return handler.new(sexp, level, self).compile_to_fragments else error "Unsupported sexp: #{sexp.type}" end end |
#re_raise_with_location ⇒ Object
364 365 366 367 368 369 370 371 372 373 374 |
# File 'opal/lib/opal/compiler.rb', line 364 def re_raise_with_location yield rescue StandardError, ::Opal::SyntaxError => error opal_location = ::Opal.opal_location_from_error(error) opal_location.path = file opal_location.label ||= @source.lines[opal_location.line.to_i - 1].strip new_error = ::Opal::SyntaxError.new(error.) new_error.set_backtrace error.backtrace ::Opal.add_opal_location_to_error(opal_location, new_error) raise new_error end |
#record_method_call(mid) ⇒ Object
325 326 327 |
# File 'opal/lib/opal/compiler.rb', line 325 def record_method_call(mid) @method_calls << mid end |
#requirable? ⇒ Object
Prepare the code for future requires
141 |
# File 'opal/lib/opal/compiler.rb', line 141 compiler_option :requirable, default: false, as: :requirable? |
#required_trees ⇒ Object
An array of trees required in this file (typically by calling #require_tree)
506 507 508 |
# File 'opal/lib/opal/compiler.rb', line 506 def required_trees @required_trees ||= [] end |
#requires ⇒ Object
An array of requires used in this file
500 501 502 |
# File 'opal/lib/opal/compiler.rb', line 500 def requires @requires ||= [] end |
#returns(sexp) ⇒ Object
The last sexps in method bodies, for example, need to be returned
in the compiled javascript. Due to syntax differences between
javascript any ruby, some sexps need to be handled specially. For
example, if
statemented cannot be returned in javascript, so
instead the "truthy" and "falsy" parts of the if statement both
need to be returned instead.
Sexps that need to be returned are passed to this method, and the
alterned/new sexps are returned and should be used instead. Most
sexps can just be added into a s(:return) sexp
, so that is the
default action if no special case is required.
527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 |
# File 'opal/lib/opal/compiler.rb', line 527 def returns(sexp) return returns s(:nil) unless sexp case sexp.type when :undef # undef :method_name always returns nil returns sexp.updated(:begin, [sexp, s(:nil)]) when :break, :next, :redo, :retry sexp when :yield sexp.updated(:returnable_yield, nil) when :when *when_sexp, then_sexp = *sexp sexp.updated(nil, [*when_sexp, returns(then_sexp)]) when :rescue body_sexp, *resbodies, else_sexp = *sexp resbodies = resbodies.map do |resbody| returns(resbody) end if else_sexp else_sexp = returns(else_sexp) end sexp.updated( nil, [ returns(body_sexp), *resbodies, else_sexp ] ) when :resbody klass, lvar, body = *sexp sexp.updated(nil, [klass, lvar, returns(body)]) when :ensure rescue_sexp, ensure_body = *sexp sexp = sexp.updated(nil, [returns(rescue_sexp), ensure_body]) sexp.updated(:js_return, [sexp]) when :begin, :kwbegin # Wrapping last expression with s(:js_return, ...) *rest, last = *sexp sexp.updated(nil, [*rest, returns(last)]) when :while, :until, :while_post, :until_post sexp when :return, :js_return, :returnable_yield sexp when :xstr sexp.updated(nil, [s(:js_return, *sexp.children)]) when :if cond, true_body, false_body = *sexp sexp.updated( nil, [ cond, returns(true_body), returns(false_body) ] ).tap { |s| s.[:returning] = true } else if sexp.type == :send && sexp.children[1] == :debugger # debugger is a statement, so it doesn't return a value # and returning it is invalid. Therefore we update it # to do `debugger; return nil`. sexp.updated(:begin, [sexp, s(:js_return, s(:nil))]) else sexp.updated(:js_return, [sexp]) end end end |
#s(type, *children) ⇒ Object
Create a new sexp using the given parts.
391 392 393 |
# File 'opal/lib/opal/compiler.rb', line 391 def s(type, *children) ::Opal::AST::Node.new(type, children) end |
#source_map ⇒ Opal::SourceMap
Returns a source map that can be used in the browser to map back to original ruby code.
309 310 311 312 |
# File 'opal/lib/opal/compiler.rb', line 309 def source_map # We only use @source_map if compiler is cached. @source_map || ::Opal::SourceMap::File.new(@fragments, file, @source, @result) end |
#unique_temp(name) ⇒ Object
Used to generate a unique id name per file. These are used mainly to name method bodies for methods that use blocks.
401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 |
# File 'opal/lib/opal/compiler.rb', line 401 def unique_temp(name) name = name.to_s if name && !name.empty? name = name .to_s .gsub('<=>', '$lt_eq_gt') .gsub('===', '$eq_eq_eq') .gsub('==', '$eq_eq') .gsub('=~', '$eq_tilde') .gsub('!~', '$excl_tilde') .gsub('!=', '$not_eq') .gsub('<=', '$lt_eq') .gsub('>=', '$gt_eq') .gsub('=', '$eq') .gsub('?', '$ques') .gsub('!', '$excl') .gsub('/', '$slash') .gsub('%', '$percent') .gsub('+', '$plus') .gsub('-', '$minus') .gsub('<', '$lt') .gsub('>', '$gt') .gsub(/[^\w\$]/, '$') end unique = (@unique += 1) "#{'$' unless name.start_with?('$')}#{name}$#{unique}" end |
#use_strict? ⇒ Object
Enables JavaScript's strict mode (i.e., adds 'use strict'; statement)
180 |
# File 'opal/lib/opal/compiler.rb', line 180 compiler_option :use_strict, default: false, as: :use_strict?, magic_comment: true |
#warning(msg, line = nil) ⇒ Object
This is called when a parsing/processing warning occurs. This method simply appends the filename and curent line number onto the message and issues a warning.
379 380 381 |
# File 'opal/lib/opal/compiler.rb', line 379 def warning(msg, line = nil) warn "warning: #{msg} -- #{file}:#{line}" end |
#with_temp ⇒ Object
Temporary varibales will be needed from time to time in the generated code, and this method will assign (or reuse) on while the block is yielding, and queue it back up once it is finished. Variables are queued once finished with to save the numbers of variables needed at runtime.
452 453 454 455 456 457 |
# File 'opal/lib/opal/compiler.rb', line 452 def with_temp tmp = @scope.new_temp res = yield tmp @scope.queue_temp tmp res end |