Class: Peruby::Op::GlobalDeclare

Inherits:
Base
  • Object
show all
Defined in:
lib/peruby/op/variable.rb

Overview

Package variable declaration through our.

Instance Method Summary collapse

Methods inherited from Base

#argument_cells, #local_slot, #lvalue, #run_subroutine, #to_callable, #warning_directive?

Constructor Details

#initialize(sigil, name, initializer) ⇒ GlobalDeclare

Returns a new instance of GlobalDeclare.



488
489
490
491
492
# File 'lib/peruby/op/variable.rb', line 488

def initialize(sigil, name, initializer)
  @sigil = sigil
  @name = name
  @initializer = initializer
end

Instance Method Details

#run(env, context) ⇒ Object



494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
# File 'lib/peruby/op/variable.rb', line 494

def run(env, context)
  target = env.fetch(@sigil, @name)
  bind_alias(env, target)
  return target.get unless @initializer

  values = @initializer.run(env, @sigil == :scalar ? :scalar : :list)
  if target.is_a?(Scalar)
    target.set(values)
  elsif target.is_a?(PerlArray)
    target.cells.replace(values.map(&:copy))
  else
    target.cells.clear
    values.each_slice(2) { |key, value| target.slot(Conv.to_str(key&.get)).set(value&.get) }
  end
  context == :list && target.respond_to?(:list) ? target.list : values
end