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 |