mirror of
https://github.com/mistergibson/gxg-web-client.git
synced 2026-08-15 03:26:00 -07:00
175 lines
3.5 KiB
Ruby
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
|