| Index: src/bootstrapper.cc
|
| diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc
|
| index 6e6c2c639c3708d0e42af10cf5ad61c62c445a4e..ff685724a49bd269b836dba953d4c904de55e9a7 100644
|
| --- a/src/bootstrapper.cc
|
| +++ b/src/bootstrapper.cc
|
| @@ -1344,33 +1344,40 @@ bool Genesis::InstallNatives() {
|
| }
|
|
|
|
|
| -static void InstallCustomCallGenerator(
|
| - Handle<JSFunction> holder_function,
|
| - CallStubCompiler::CustomGeneratorOwner owner_flag,
|
| - const char* function_name,
|
| - int id) {
|
| - Handle<JSObject> owner;
|
| - if (owner_flag == CallStubCompiler::FUNCTION) {
|
| - owner = Handle<JSObject>::cast(holder_function);
|
| - } else {
|
| - ASSERT(owner_flag == CallStubCompiler::INSTANCE_PROTOTYPE);
|
| - owner = Handle<JSObject>(
|
| - JSObject::cast(holder_function->instance_prototype()));
|
| +static Handle<JSObject> ResolveCustomCallGeneratorHolder(
|
| + Handle<Context> global_context,
|
| + const char* holder_expr) {
|
| + Handle<GlobalObject> global(global_context->global());
|
| + const char* period_pos = strchr(holder_expr, '.');
|
| + if (period_pos == NULL) {
|
| + return Handle<JSObject>::cast(
|
| + GetProperty(global, Factory::LookupAsciiSymbol(holder_expr)));
|
| }
|
| + ASSERT_EQ(".prototype", period_pos);
|
| + Vector<const char> property(holder_expr, period_pos - holder_expr);
|
| + Handle<JSFunction> function = Handle<JSFunction>::cast(
|
| + GetProperty(global, Factory::LookupSymbol(property)));
|
| + return Handle<JSObject>(JSObject::cast(function->prototype()));
|
| +}
|
| +
|
| +
|
| +static void InstallCustomCallGenerator(Handle<JSObject> holder,
|
| + const char* function_name,
|
| + int id) {
|
| Handle<String> name = Factory::LookupAsciiSymbol(function_name);
|
| - Handle<JSFunction> function(JSFunction::cast(owner->GetProperty(*name)));
|
| + Handle<JSFunction> function(JSFunction::cast(holder->GetProperty(*name)));
|
| function->shared()->set_function_data(Smi::FromInt(id));
|
| }
|
|
|
|
|
| void Genesis::InstallCustomCallGenerators() {
|
| HandleScope scope;
|
| -#define INSTALL_CALL_GENERATOR(holder_fun, owner_flag, fun_name, name) \
|
| - { \
|
| - Handle<JSFunction> holder(global_context()->holder_fun##_function()); \
|
| - const int id = CallStubCompiler::k##name##CallGenerator; \
|
| - InstallCustomCallGenerator(holder, CallStubCompiler::owner_flag, \
|
| - #fun_name, id); \
|
| +#define INSTALL_CALL_GENERATOR(holder_expr, fun_name, name) \
|
| + { \
|
| + Handle<JSObject> holder = ResolveCustomCallGeneratorHolder( \
|
| + global_context(), #holder_expr); \
|
| + const int id = CallStubCompiler::k##name##CallGenerator; \
|
| + InstallCustomCallGenerator(holder, #fun_name, id); \
|
| }
|
| CUSTOM_CALL_IC_GENERATORS(INSTALL_CALL_GENERATOR)
|
| #undef INSTALL_CALL_GENERATOR
|
|
|