class Minjs::ECMA262::StFunc

Base class of ECMA262 FunctionDeclaration / FunctionExpression element

@see www.ecma-international.org/ecma-262 ECMA262 13, 11.1.5

Attributes

args[R]
exe_context[RW]
name[R]
statements[R]
var_env[R]

Public Class Methods

new(var_env, name, args, statements, options = {}) click to toggle source
# File lib/minjs/ecma262/statement.rb, line 1539
def initialize(var_env, name, args, statements, options = {})
  @var_env = var_env
  @name = name
  @args = args #=> array
  @statements = statements #=> Prog
  @decl = options[:decl]
  @getter = options[:getter]
  @setter = options[:setter]
end

Public Instance Methods

==(obj) click to toggle source

compare object

# File lib/minjs/ecma262/statement.rb, line 1574
def ==(obj)
  self.class == obj.class and
    @name == obj.name and
    @args == obj.args and
    @statements == obj.statements
end
decl?() click to toggle source

Returns true if this object is function declaration

# File lib/minjs/ecma262/statement.rb, line 1610
def decl?
  @decl
end
deep_dup() click to toggle source

duplicate object @see Base#deep_dup

# File lib/minjs/ecma262/statement.rb, line 1556
def deep_dup
  self.class.new(@var_env, @name ? @name.deep_dup : nil,
                     @args.collect{|args|args.deep_dup},
                     @statements.deep_dup,
                     {decl: @decl, getter: @getter, setter: @setter})
end
enter(outer_exe_context) click to toggle source
# File lib/minjs/ecma262/statement.rb, line 1614
def enter(outer_exe_context)
  local_env = LexEnv.new_declarative_env(outer_exe_context.lex_env)
  var_env.record.binding.each do |k, v|
    local_env.record.create_mutable_binding(k, nil)
    val = v.delete(:value)
    local_env.record.set_mutable_binding(k, val, nil, v)
  end
  new_exe_context = ExeContext.new
  new_exe_context.lex_env = local_env
  new_exe_context.var_env = var_env
  new_exe_context
end
getter?() click to toggle source

Returns true if this object is setter in object

# File lib/minjs/ecma262/statement.rb, line 1600
def getter?
  @getter
end
left_hand_side_exp?() click to toggle source

@return [Boolean] true if expression is kind of LeftHandSideExpression.

# File lib/minjs/ecma262/statement.rb, line 1595
def left_hand_side_exp?
  true
end
priority() click to toggle source

@return [Fixnum] expression priority

# File lib/minjs/ecma262/statement.rb, line 1550
def priority
  PRIORITY_PRIMARY
end
setter?() click to toggle source

Returns true if this object is setter in object

# File lib/minjs/ecma262/statement.rb, line 1605
def setter?
  @setter
end
to_js(options = {}) click to toggle source

Returns a ECMAScript string containg the representation of element. @see Base#to_js

# File lib/minjs/ecma262/statement.rb, line 1583
def to_js(options = {})
  _args = @args.collect{|x|x.to_js(options)}.join(",")
  if @getter
    concat options, :get, @name, "()", "{", @statements, "}"
  elsif @setter
    concat options, :set, @name, '(', _args, ")", "{", @statements, "}"
  else
    concat options, :function, @name, '(', _args, ")", "{", @statements, "}"
  end
end
traverse(parent) { |parent, self| ... } click to toggle source

Traverses this children and itself with given block.

# File lib/minjs/ecma262/statement.rb, line 1564
def traverse(parent, &block)
  @name.traverse(self, &block) if @name
  @args.each do |arg|
    arg.traverse(self, &block)
  end
  @statements.traverse(self, &block)
  yield parent, self
end