Index: chrome/renderer/module_system.cc |
diff --git a/chrome/renderer/module_system.cc b/chrome/renderer/module_system.cc |
index 0e9912e6e1771cc37207be71500b9f10f68b0cd0..8d45dfe1f45c7c186b7b61ecfcce588e9265a698 100644 |
--- a/chrome/renderer/module_system.cc |
+++ b/chrome/renderer/module_system.cc |
@@ -8,43 +8,9 @@ |
namespace { |
-const char* kLazyObjectSource = "lazy_object_source"; |
-const char* kLazyObjectName = "lazy_object_name"; |
-const char* kLazyObject = "lazy_object"; |
- |
-v8::Handle<v8::Object> EvaluateLazySource(v8::Handle<v8::Object> object) { |
- v8::HandleScope handle_scope; |
- v8::Handle<v8::Value> source_value = |
- object->GetHiddenValue(v8::String::New(kLazyObjectSource)); |
- CHECK(!source_value.IsEmpty()); |
- v8::Handle<v8::String> source = v8::Handle<v8::String>::Cast(source_value); |
- v8::Handle<v8::Value> name = |
- object->GetHiddenValue(v8::String::New(kLazyObjectName)); |
- CHECK(!name.IsEmpty()); |
- CHECK(name->IsString()); |
- v8::Handle<v8::Script> script = v8::Script::New(source, name); |
- v8::Handle<v8::Value> result = script->Run(); |
- CHECK(result->IsObject()); |
- return handle_scope.Close(v8::Handle<v8::Object>::Cast(result)); |
-} |
- |
-v8::Handle<v8::Value> LazyObjectGetter( |
- const v8::Local<v8::String> property, |
- const v8::AccessorInfo& info) { |
- v8::HandleScope handle_scope; |
- v8::Handle<v8::Object> object = info.Holder(); |
- v8::Handle<v8::String> lazy_object_name = v8::String::New(kLazyObject); |
- v8::Handle<v8::Value> lazy_object_value = |
- object->GetHiddenValue(lazy_object_name); |
- CHECK(lazy_object_value.IsEmpty() || lazy_object_value->IsObject()); |
- v8::Handle<v8::Object> lazy_object = |
- v8::Handle<v8::Object>::Cast(lazy_object_value); |
- if (lazy_object.IsEmpty()) { |
- lazy_object = EvaluateLazySource(object); |
- object->SetHiddenValue(lazy_object_name, lazy_object); |
- } |
- return handle_scope.Close(lazy_object->Get(property)); |
-} |
+const char* kModuleSystem = "module_system"; |
+const char* kModuleName = "module_name"; |
+const char* kModuleField = "module_field"; |
} // namespace |
@@ -114,17 +80,42 @@ void ModuleSystem::RunString(const std::string& code, const std::string& name) { |
} |
// static |
-v8::Handle<v8::Object> ModuleSystem::CreateLazyObject( |
- const std::string& source_name, v8::Handle<v8::String> source) { |
+v8::Handle<v8::Value> ModuleSystem::GetterRouter( |
not at google - send to devlin
2012/03/22 00:35:53
RequireLazyField?
koz (OOO until 15th September)
2012/03/22 01:13:01
Yes, or even better - LazyFieldAccessor.
|
+ v8::Local<v8::String> property, const v8::AccessorInfo& info) { |
+ CHECK(!info.Data().IsEmpty()); |
+ CHECK(info.Data()->IsObject()); |
+ v8::HandleScope handle_scope; |
+ v8::Handle<v8::Object> parameters = v8::Handle<v8::Object>::Cast(info.Data()); |
+ v8::Handle<v8::Value> module_system_value = |
+ parameters->Get(v8::String::New(kModuleSystem)); |
+ ModuleSystem* module_system = static_cast<ModuleSystem*>( |
+ v8::Handle<v8::External>::Cast(module_system_value)->Value()); |
+ |
+ v8::Handle<v8::Object> module = module_system->RequireForJsInner( |
+ parameters->Get(v8::String::New(kModuleName))->ToString())->ToObject(); |
+ |
+ v8::Handle<v8::String> field = |
+ parameters->Get(v8::String::New(kModuleField))->ToString(); |
+ |
+ return handle_scope.Close(module->Get(field)); |
+} |
+ |
+void ModuleSystem::SetLazyField(v8::Handle<v8::Object> object, |
+ const std::string& field, |
+ const std::string& module_name, |
+ const std::string& module_field) { |
v8::HandleScope handle_scope; |
- v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); |
- object_template->SetNamedPropertyHandler(LazyObjectGetter, NULL); |
- v8::Handle<v8::Object> object = object_template->NewInstance(); |
- object->SetHiddenValue(v8::String::New(kLazyObjectSource), source); |
- object->SetHiddenValue(v8::String::New(kLazyObjectName), |
- v8::String::New(source_name.c_str())); |
- |
- return handle_scope.Close(object); |
+ v8::Handle<v8::Object> parameters = v8::Object::New(); |
+ parameters->Set(v8::String::New(kModuleName), |
+ v8::String::New(module_name.c_str())); |
+ parameters->Set(v8::String::New(kModuleField), |
+ v8::String::New(module_field.c_str())); |
+ parameters->Set(v8::String::New(kModuleSystem), v8::External::New(this)); |
+ |
+ object->SetAccessor(v8::String::New(field.c_str()), |
+ &ModuleSystem::GetterRouter, |
+ NULL, |
+ parameters); |
} |
v8::Handle<v8::Value> ModuleSystem::RunString(v8::Handle<v8::String> code, |