-
Notifications
You must be signed in to change notification settings - Fork 609
/
dispatch.cpp
44 lines (35 loc) · 1.24 KB
/
dispatch.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
#include "dispatch.hpp"
#include "arguments.hpp"
#include "lookup_data.hpp"
#include "global_cache.hpp"
#include "builtin/module.hpp"
#include "builtin/class.hpp"
#include "builtin/symbol.hpp"
#include "builtin/executable.hpp"
namespace rubinius {
Object* Dispatch::send(STATE, CallFrame* call_frame, Arguments& args,
MethodMissingReason reason)
{
LookupData lookup(args.recv(), args.recv()->lookup_begin(state), G(sym_protected));
return send(state, call_frame, lookup, args, reason);
}
Object* Dispatch::send(STATE, CallFrame* call_frame, LookupData& lookup,
Arguments& args, MethodMissingReason reason)
{
Symbol* original_name = name;
if(!GlobalCache::resolve(state, name, *this, lookup)) {
state->vm()->set_method_missing_reason(reason);
method_missing = true;
lookup.min_visibility = G(sym_private);
if(!GlobalCache::resolve(state, G(sym_method_missing), *this, lookup)) {
Exception::internal_error(state, call_frame, "no method_missing");
return 0;
}
method_missing = true;
}
if(method_missing) {
args.unshift(state, original_name);
}
return method->execute(state, call_frame, method, module, args);
}
}