forked from rubinius/rubinius
-
Notifications
You must be signed in to change notification settings - Fork 0
/
thread_state.cpp
61 lines (55 loc) · 1.86 KB
/
thread_state.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "builtin/exception.hpp"
#include "thread_state.hpp"
#include "builtin/variable_scope.hpp"
#include "builtin/fixnum.hpp"
#include "builtin/class.hpp"
namespace rubinius {
Object* ThreadState::as_object(STATE) {
switch(raise_reason_) {
case cException:
return raise_value_.get();
case cNone:
return Qnil;
default:
Exception* exc = Exception::create(state);
exc->change_class_to(state, G(exc_vm_internal));
exc->set_ivar(state, state->symbol("reason"), Fixnum::from(raise_reason_));
exc->set_ivar(state, state->symbol("value"), raise_value_.get());
exc->set_ivar(state, state->symbol("destination"), destination_scope_.get());
return exc;
}
}
void ThreadState::set_exception(STATE, Object* obj) {
if(obj->kind_of_p(state, G(exc_vm_internal))) {
Object* reason = obj->get_ivar(state, state->symbol("reason"));
raise_reason_ = (RaiseReason)as<Fixnum>(reason)->to_native();
raise_value_.set(obj->get_ivar(state, state->symbol("value")));
destination_scope_.set(
as<VariableScope>(obj->get_ivar(state, state->symbol("destination"))));
} else {
raise_reason_ = cException;
raise_value_.set(obj);
destination_scope_.set(Qnil);
}
}
void ThreadState::raise_exception(Exception* exc) {
raise_reason_ = cException;
raise_value_.set(exc);
destination_scope_.set(Qnil);
}
void ThreadState::raise_return(Object* value, VariableScope* dest) {
raise_reason_ = cReturn;
raise_value_.set(value);
destination_scope_.set(dest);
}
void ThreadState::raise_break(Object* value, VariableScope* dest) {
raise_reason_ = cBreak;
raise_value_.set(value);
destination_scope_.set(dest);
}
void ThreadState::raise_exit(Object* code) {
raise_reason_ = cExit;
raise_value_.set(code);
destination_scope_.set(Qnil);
}
}