Class: Peruby::Op::DereferenceExpression

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

Overview

Dereference whose operand is an arbitrary expression, such as @$h{list}.

Instance Method Summary collapse

Methods inherited from Base

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

Constructor Details

#initialize(kind, expression) ⇒ DereferenceExpression

Returns a new instance of DereferenceExpression.



217
218
219
220
# File 'lib/peruby/op/variable.rb', line 217

def initialize(kind, expression)
  @kind = kind
  @expression = expression
end

Instance Method Details

#aggregate(env, kind, dereference: false) ⇒ Object

Raises:



238
239
240
241
242
243
244
245
246
# File 'lib/peruby/op/variable.rb', line 238

def aggregate(env, kind, dereference: false)
  raise PerlError, 'Invalid nested dereference' if dereference

  value = target(env)
  expected = kind == :array ? PerlArray : PerlHash
  raise PerlError, "Not a #{kind.to_s.upcase} reference" unless value.is_a?(expected)

  value
end

#lvalue(env, _context) ⇒ Object



234
235
236
# File 'lib/peruby/op/variable.rb', line 234

def lvalue(env, _context)
  target(env)
end

#run(env, context) ⇒ Object



222
223
224
225
226
227
228
229
230
231
232
# File 'lib/peruby/op/variable.rb', line 222

def run(env, context)
  value = target(env)
  return value.get if @kind == :scalar && context != :list
  return [value] if @kind == :scalar
  return value.list if context == :list && value.is_a?(PerlHash)
  return value.list if context == :list && value.is_a?(PerlArray)
  return value.cells.dup if context == :list && value.respond_to?(:cells)
  return value.size if value.respond_to?(:size)

  value
end