From ab4fde0fc72ee30c296c4070a763b476ca8bebc3 Mon Sep 17 00:00:00 2001 From: guybedford Date: Wed, 10 Jun 2015 14:46:30 +0200 Subject: [PATCH 1/2] implement bulk re-exports for instantiate setter perf --- src/codegeneration/InstantiateModuleTransformer.js | 14 +++++++++----- third_party/es6-module-loader/loader.js | 11 ++++++++++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/codegeneration/InstantiateModuleTransformer.js b/src/codegeneration/InstantiateModuleTransformer.js index 5d640be3e..d3320ad69 100644 --- a/src/codegeneration/InstantiateModuleTransformer.js +++ b/src/codegeneration/InstantiateModuleTransformer.js @@ -349,12 +349,14 @@ export class InstantiateModuleTransformer extends ModuleTransformer { // then do export bindings of re-exported dependencies if (externalExportBindings) { + let reexports = {}; externalExportBindings.forEach(({exportName, importName}) => { - let statement = importName === null ? - parseStatement `$__export(${exportName}, $__m);` : - parseStatement `$__export(${exportName}, $__m.${importName});`; - setterStatements.push(statement); + reexports[exportName] = importName === null ? + parseExpression `$__m` : parseExpression `$__m.${importName}`; }); + setterStatements.push( + parseStatement `$__export(${createObjectLiteral(reexports)})` + ); } // create local module bindings @@ -368,10 +370,12 @@ export class InstantiateModuleTransformer extends ModuleTransformer { // exported dependencies if (exportStarBinding) { setterStatements = setterStatements.concat(parseStatements ` + var exportObj = {}; Object.keys($__m).forEach(function(p) { if (p !== 'default' && !$__exportNames[p]) - $__export(p, $__m[p]); + exportObj[p] = $__m[p]; }); + $__export(exportObj); `); let exportNames = {}; diff --git a/third_party/es6-module-loader/loader.js b/third_party/es6-module-loader/loader.js index 3aa944fd7..e1b720d9f 100644 --- a/third_party/es6-module-loader/loader.js +++ b/third_party/es6-module-loader/loader.js @@ -687,7 +687,16 @@ function logloads(loads) { // NB This should be an Object.defineProperty, but that is very slow. // By disaling this module write-protection we gain performance. // It could be useful to allow an option to enable or disable this. - moduleObj[name] = value; + + // bulk export object + if (typeof name == 'object') { + for (var p in name) + moduleObj[p] = name[p]; + } + // single export name / value pair + else { + moduleObj[name] = value; + } for (var i = 0, l = module.importers.length; i < l; i++) { var importerModule = module.importers[i]; From 7abe36f441f73ca7752186f593b980c3a5cb9372 Mon Sep 17 00:00:00 2001 From: guybedford Date: Thu, 11 Jun 2015 12:45:56 +0200 Subject: [PATCH 2/2] use Object.create(null), indenting --- src/codegeneration/InstantiateModuleTransformer.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/codegeneration/InstantiateModuleTransformer.js b/src/codegeneration/InstantiateModuleTransformer.js index d3320ad69..01c3d9880 100644 --- a/src/codegeneration/InstantiateModuleTransformer.js +++ b/src/codegeneration/InstantiateModuleTransformer.js @@ -349,28 +349,26 @@ export class InstantiateModuleTransformer extends ModuleTransformer { // then do export bindings of re-exported dependencies if (externalExportBindings) { - let reexports = {}; + let reexports = Object.create(null); externalExportBindings.forEach(({exportName, importName}) => { reexports[exportName] = importName === null ? parseExpression `$__m` : parseExpression `$__m.${importName}`; }); setterStatements.push( - parseStatement `$__export(${createObjectLiteral(reexports)})` - ); + parseStatement `$__export(${createObjectLiteral(reexports)})`); } // create local module bindings if (moduleBinding) { setterStatements.push( - parseStatement `${id(moduleBinding)} = $__m;` - ); + parseStatement `${id(moduleBinding)} = $__m;`); } // finally run export * if applying to this dependency, for not-already // exported dependencies if (exportStarBinding) { setterStatements = setterStatements.concat(parseStatements ` - var exportObj = {}; + var exportObj = Object.create(null); Object.keys($__m).forEach(function(p) { if (p !== 'default' && !$__exportNames[p]) exportObj[p] = $__m[p];