Temporary tag for this failure. Updated CI spec coming.
[rbx.git] / kernel / core / global.rb
blob38b7207686db8eae90de4a1310db0cc71aa8c2e5
1 # depends on: class.rb
3 ##
4 # Stores global variables and global variable aliases.
6 class GlobalVariables
7   def initialize
8     load_path = %w[.]
9     loaded_features = []
11     @internal = LookupTable.new(
12       :$; => nil,
13       :$/ => "\n",                # Input record separator
14       :$\ => nil,                 # Output record separator
15       :$> => STDOUT,
16       :$: => load_path,
17       :$LOAD_PATH => load_path,
18       :$" => loaded_features,
19       :$LOADED_FEATURES => loaded_features,
20       :$, => '',                  # Output field separator
21       :$stderr => STDERR,
22       :$stdout => STDOUT,
23       :$stdin => STDIN,
24       :$CONSOLE => STDOUT,
25       :$DEBUG => false,
26       :$SAFE => 0,
27       :$. => 0,    # TODO: Last line number of IO read.
28       :$_ => nil,  # HACK: bunk for now.
29       :$< => nil,  # HACK: should be ARGF
30       :$? => nil,  # Process status. nil until set
31       :$= => false # ignore case, whatever that is
32     )
34     @alias = LookupTable.new
35     @hooks = LookupTable.new
36   end
38   def key?(key)
39     @internal.key?(key) || @alias.key?(key)
40   end
42   def variables
43     @internal.keys + @alias.keys
44   end
46   def [](key)
47     if @internal.key? key
48       @internal[key]
49     elsif @hooks.key? key
50       @hooks[key][0].call
51     elsif @alias.key? key
52       @internal[@alias[key]]
53     end
54   end
56   def []=(key, data)
57     if !@internal.key?(key) && alias_key = @alias[key] then
58       @internal[alias_key] = data
59     elsif @hooks.key? key then
60       @hooks[key][1].call(data)
61     else
62       @internal[key] = data
63     end
64   end
66   def add_alias(from, to)
67     if hook = @hooks[from]
68       @hooks[to] = hook
69     elsif alias_key = @alias[from] then
70       @alias[to] = alias_key
71     else
72       @alias[to] = from
73     end
74   end
76   def illegal_set
77     raise RuntimeError, "unable to set global"
78   end
79   
80   def set_hook(var, getter, setter)
81     unless getter.respond_to?(:call)
82       raise ArgumentError, "getter must respond to call"
83     end
84     
85     if setter.nil?
86       setter = method(:illegal_set)
87     elsif setter.respond_to?(:call)
88       raise ArgumentError, "setter must respond to call"
89     end
90     
91     @hooks[var] = [getter, setter]
92   end
93 end
95 Globals = GlobalVariables.new