Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(748)

Unified Diff: chrome/renderer/module_system.cc

Issue 9812025: Implement lazy JS module initialisation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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,

Powered by Google App Engine
This is Rietveld 408576698