module RubyRunJs::ConversionHelper

Public Instance Methods

convert_to_js_type(builtin, obj) click to toggle source
# File lib/ruby_run_js/conversion.rb, line 155
def convert_to_js_type(builtin, obj)
  if obj.js_type != :Native
    return obj
  end

  case obj.class
  when Integer
    obj.to_f
  when Array
    builtin.new_array_with_items(obj.map { |i| convert_to_js_type(builtin, i) } )
  when Hash
    # @type [Hash]
    result = builtin.new_object()
    obj.each_pair do |k, v|
      result.put(to_string(convert_to_js_type(builtin, k)), convert_to_js_type(builtin, v))
    end
    result
  else
    raise make_error('TypeError', 'Could not convert to js type!')
  end
end
to_boolean(value) click to toggle source
# File lib/ruby_run_js/conversion.rb, line 12
def to_boolean(value)
  type = value.js_type
  return false if [:Null, :Undefined].include?(type)
  return value if type == :Boolean
  return !value.zero? && !value.nan? if type == :Number
  return !value.empty? if type == :String

  true
end
to_int32(value) click to toggle source
# File lib/ruby_run_js/conversion.rb, line 72
def to_int32(value)
  number = to_number(value)
  return 0 if number.nan? || number.infinite? != nil

  int32 = number.to_i % 2**32

  int32 >= 2**31 ? int32 - 2**32 : int32
end
to_integer(value) click to toggle source
# File lib/ruby_run_js/conversion.rb, line 61
def to_integer(value)
  number = to_number(value)
  return 0 if number.nan?

  if number.infinite? != nil
    return number.infinite? > 0 ? 10**20 : -10**20
  end

  number.to_i
end
to_number(value) click to toggle source
# File lib/ruby_run_js/conversion.rb, line 22
def to_number(value)
  type = value.js_type
  return Float::NAN if type == :Undefined
  return 0.0 if type == :Null
  return (value ? 1.0 : 0.0) if type == :Boolean
  return value if type == :Number
  return value.to_f if value.is_a?(Numeric)

  if type == :String
    s = value.strip
    return 0.0 if s.empty?

    if s[0, 3].include?('x') || s[0, 3].include?('X')
      begin
        num = Integer(s)
      rescue
        return Float::NAN
      end
      return num.to_f
    end

    if s == '+Infinity' || s == 'Infinity'
      return Float::INFINITY
    end
    if s == '-Infinity'
      return -Float::INFINITY
    end

    begin
      num = Float(s)
    rescue
      return Float::NAN
    end
    return num
  end

  to_number(to_primitive(value, 'Number'))
end
to_object(value, builtin) click to toggle source
# File lib/ruby_run_js/conversion.rb, line 138
def to_object(value, builtin)
  case value.js_type
  when :Object
    return value
  when :Boolean
    builtin.new_boolean(value)
  when :String
    builtin.new_string(value)
  when :Number
    builtin.new_number(value)
  when :Null, :Undefined
    raise make_error('TypeError', 'undefined or null cannot be converted to object')
  else
    raise 'Unknown Js Type: ' + value.js_type.to_s
  end
end
to_primitive(value, hint = nil) click to toggle source
# File lib/ruby_run_js/conversion.rb, line 5
def to_primitive(value, hint = nil)
  return value if is_primitive(value)
  return value.to_f if value.is_a?(Integer)

  value.default_value(hint)
end
to_string(value) click to toggle source
# File lib/ruby_run_js/conversion.rb, line 95
def to_string(value)
  type = value.js_type
  case type
  when :String
    return value
  when :Null
    return 'null'
  when :Undefined
    return 'undefined'
  when :Boolean
    return value ? 'true' : 'false'
  when :Number
    return 'NaN' if value.nan?

    return '0' if value == 0

    prefix = ''
    if value < 0
      prefix = '-'
      value = -value
    end

    return prefix + 'Infinity' if value.infinite? != nil

    if value < 1e-6 || value >= 1e21
      frac, exponent = value.to_s.split('e')
      exp = exponent.to_i
      return prefix + frac + (exp < 0 ? 'e' : '-e') + exp.to_s
    elsif value < 1e-4
      frac, exponent = value.to_s.split('e-')
      base = '0.' + '0' * (exponent.to_i - 1) + frac.sub(/[-\.]/, '')
      return prefix + base
    elsif value == value.to_i
      return prefix + value.to_i.to_s
    end
    prefix + value.to_s
  when :Object
    to_string(to_primitive(value, 'String'))
  else
    value.to_s
  end
end
to_uint16(value) click to toggle source
# File lib/ruby_run_js/conversion.rb, line 88
def to_uint16(value)
  number = to_number(value)
  return 0 if number.nan? || number.infinite? != nil

  number.abs.to_i % 2**16
end
to_uint32(value) click to toggle source
# File lib/ruby_run_js/conversion.rb, line 81
def to_uint32(value)
  number = to_number(value)
  return 0 if number.nan? || number.infinite? != nil

  number.abs.to_i % 2**32
end