Sha256: ea93d13e8579e953c7ebccdcadc1e4261eead61eaa4cc820268714715e9c044a

Contents?: true

Size: 1.99 KB

Versions: 6

Compression:

Stored size: 1.99 KB

Contents

# frozen_string_literal: true

module RubyNext
  module Language
    module KernelEval
      refine Kernel do
        def eval(source, bind = nil, *args)
          new_source = ::RubyNext::Language::Runtime.transform(
            source,
            using: bind&.receiver == TOPLEVEL_BINDING.receiver || bind&.receiver&.is_a?(Module)
          )
          RubyNext.debug_source(new_source, "(#{caller_locations(1, 1).first})")
          super new_source, bind, *args
        end
      end
    end

    module InstanceEval # :nodoc:
      refine Object do
        def instance_eval(*args, &block)
          return super(*args, &block) if block_given?

          source = args.shift
          new_source = ::RubyNext::Language::Runtime.transform(source, using: false)
          RubyNext.debug_source(new_source, "(#{caller_locations(1, 1).first})")
          super new_source, *args
        end
      end
    end

    module ClassEval
      refine Module do
        def module_eval(*args, &block)
          return super(*args, &block) if block_given?

          source = args.shift
          new_source = ::RubyNext::Language::Runtime.transform(source, using: false)
          RubyNext.debug_source(new_source, "(#{caller_locations(1, 1).first})")
          super new_source, *args
        end

        def class_eval(*args, &block)
          return super(*args, &block) if block_given?

          source = args.shift
          new_source = ::RubyNext::Language::Runtime.transform(source, using: false)
          RubyNext.debug_source(new_source, "(#{caller_locations(1, 1).first})")
          super new_source, *args
        end
      end
    end

    # Refinements for `eval`-like methods.
    # Transpiling eval is only possible if we do not use local from the binding,
    # because we cannot access the binding of caller (without non-production ready hacks).
    #
    # This module is meant mainly for testing purposes.
    module Eval
      include InstanceEval
      include ClassEval
      include KernelEval
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
ruby-next-core-0.9.0.pre lib/ruby-next/language/eval.rb
ruby-next-core-0.8.0 lib/ruby-next/language/eval.rb
ruby-next-core-0.7.0 lib/ruby-next/language/eval.rb
ruby-next-core-0.6.0 lib/ruby-next/language/eval.rb
ruby-next-core-0.5.3 lib/ruby-next/language/eval.rb
ruby-next-core-0.5.2 lib/ruby-next/language/eval.rb