Re-enable spec/library for full CI runs.
[rbx.git] / kernel / core / block_environment.rb
blob8da4844589d3c91129be91f5ce1a07a1deabd357
2 ##
3 # Describes the environment a block was created in.  BlockEnvironment is used
4 # to create a BlockContext.
6 class BlockEnvironment
7   ivar_as_index :__ivars__ => 0, :home => 1, :initial_ip => 2, :last_ip => 3,
8     :post_send => 4, :home_block => 5, :local_count => 6, :metadata_container => 7, :method => 8
9   def __ivars__   ; @__ivars__   ; end
10   def home        ; @home        ; end
11   def initial_ip  ; @initial_ip  ; end
12   def last_ip     ; @last_ip     ; end
13   def post_send   ; @post_send   ; end
14   def home_block  ; @home_block  ; end
15   def local_count ; @local_count ; end
16   def method      ; @method      ; end
18   attr_accessor :proc_environment
19   def from_proc?
20     @proc_environment
21   end
23   def home_block=(block)
24     @home_block = block
25   end
27   def initial_ip=(ip)
28     @initial_ip = ip
29   end
31   def last_ip=(ip)
32     @last_ip = ip
33   end
35   def metadata_container
36     @metadata_container
37   end
39   def under_context(context, cmethod)
40     if context.__kind_of__ BlockContext
41       home = context.home
42     else
43       home = context
44     end
46     @home = home
47     @home_block = context
48     @method = cmethod
49     @local_count = cmethod.local_count
51     @initial_ip = 0
52     @last_ip = 0x10000000 # 2**28
53     @post_send = 0
54     return self
55   end
57   ##
58   # Holds a Tuple of additional metadata.
59   # First field of the tuple holds a boolean indicating if the context is from
60   # eval
61   def metadata_container=(tup)
62     @metadata_container = tup
63   end
65   def from_eval?
66     @metadata_container and @metadata_container[0]
67   end
69   def from_eval!
70     @metadata_container = Tuple.new(1) unless @metadata_container
71     @metadata_container[0] = true
72   end
74   ##
75   # The CompiledMethod object that we were called from
77   def method=(tup)
78     @method = tup
79   end
81   def home=(home)
82     @home = home
83   end
85   def scope=(tup)
86     @scope = tup
87   end
89   def make_independent
90     @home = @home.dup
91     @home_block = @home_block.dup
92     @method = @method.dup
93   end
95   def redirect_to(obj)
96     env = dup
97     env.make_independent
98     env.home.receiver = obj
99     return env
100   end
102   def call_on_instance(obj, *args)
103     obj = redirect_to(obj)
104     obj.call(*args)
105   end
107   def disable_long_return!
108     @post_send = nil
109   end
111   def arity
112     method.required
113   end
115   # Static scope for constant lookup
116   def constant_scope=(scope)
117     @constant_scope = scope
118   end
120   def constant_scope
121     @constant_scope ||= @method.staticscope
122   end