Class: Peruby::Op::DereferenceExpression
- Defined in:
- lib/peruby/op/variable.rb
Overview
Dereference whose operand is an arbitrary expression, such as @$h{list}.
Instance Method Summary collapse
- #aggregate(env, kind, dereference: false) ⇒ Object
-
#initialize(kind, expression) ⇒ DereferenceExpression
constructor
A new instance of DereferenceExpression.
- #lvalue(env, _context) ⇒ Object
- #run(env, context) ⇒ Object
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
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 |