gxg-web-client/gxg/core/runtime.rb
2021-11-16 08:58:51 -08:00

175 lines
3.5 KiB
Ruby

# -*- encoding: us-ascii -*-
module Rubinius
module Runtime
def self.matches_when(array, receiver)
array.each { |x| return true if x === receiver }
false
end
def self.unwrap_block_arg(arg)
if arg.size == 1
elem = arg.at(0)
return elem if elem.kind_of?(Array)
end
arg
end
def self.find_constant_for_op_asign_or(name, scope)
name = Rubinius::Type.coerce_to_constant_name name
current, constant = scope.module, undefined
while current
if entry = current.constant_table.lookup(name)
constant = entry.constant
constant = constant.call if constant.kind_of?(Autoload)
return constant
end
current = current.direct_superclass
end
if instance_of?(Module)
if entry = Object.constant_table.lookup(name)
constant = entry.constant
constant = constant.call if constant.kind_of?(Autoload)
return constant
end
end
nil
end
def self.get_flip_flop(scope, index)
scope.flip_flops ||= {}
scope.flip_flops[index]
end
def self.set_flip_flop(scope, index, value)
scope.flip_flops ||= {}
scope.flip_flops[index] = value
end
def self.rbx_marshal_constant
name
end
def self.rbx_marshal_rational(obj)
Rubinius::Tuple[obj.numerator, obj.denominator]
end
def self.rbx_marshal_complex(obj)
Rubinius::Tuple[obj.real, obj.imaginary]
end
def self.get_encoding(name)
if defined?(Encoding)
Encoding.find name
else
name
end
end
def self.pre_exe
yield
end
def self.splat_hash_value(hash, value)
value = Rubinius::Type.coerce_to value, Hash, :to_hash
value.merge hash
end
def self.splat_hash_entry(hash, key, value)
hash[key] = value unless hash.key? key
hash
end
def self.keyword_object?(obj, optional)
hash = Rubinius::Type.try_convert obj, Hash, :to_hash
return unless hash
hs = hash.size
return [nil, hash] if hs == 0
kw = {}
t = Tuple.new hs
i = 0
hash.each do |key, value|
if key.instance_of? Symbol
kw[key] = value
else
return unless optional
t[i] = key
i += 1
end
end
if i == 0
[nil, kw]
elsif i == hs
[obj, kw]
else
nk = {}
j = 0
while j < i
k = t[j]
nk[k] = hash[k]
j += 1
end
[nk, kw]
end
end
def self.keywords_missing(hash)
keywords = CompiledCode.of_sender.keywords
missing = []
total = keywords.size
i = 0
while i < total
break unless keywords[i+1]
key = keywords[i]
missing << key unless hash.key? key
i += 2
end
msg = "missing keyword#{"s"if missing.size > 1}: #{missing.join(", ")}"
raise ArgumentError, msg
end
def self.keywords_extra(hash, kwrest)
keywords = CompiledCode.of_sender.keywords
total = keywords.size
i = 0
while i < total
hash.delete keywords[i]
i += 2
end
return hash if kwrest or hash.size == 0
msg = "unknown keyword#{"s" if hash.size > 1}: #{hash.keys.join(", ")}"
raise ArgumentError, msg
end
def self.unmarshal_rational(a, b)
Rational(a, b)
end
def self.unmarshal_complex(r, i)
Complex(r, i)
end
end
end