diff options
author | Adam Kocoloski <adam@cloudant.com> | 2011-08-15 15:45:15 -0400 |
---|---|---|
committer | Adam Kocoloski <adam@cloudant.com> | 2011-08-15 15:45:15 -0400 |
commit | 6ffe1675dd7b004e48891956a6bdbe32899ce80c (patch) | |
tree | 57326d9a498481e65bb0db38c66daf10896801f1 /couchjs/js/util.js | |
parent | 52ff89ff7996e839b9e2f91fd76184d362a8aeb0 (diff) | |
parent | fdd1a5d0bc48b49b0df5c9217beff9574011283c (diff) |
Merge branch '11554-merge-couchdb-1.1'
Diffstat (limited to 'couchjs/js/util.js')
-rw-r--r-- | couchjs/js/util.js | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/couchjs/js/util.js b/couchjs/js/util.js index b55480b9..e4386701 100644 --- a/couchjs/js/util.js +++ b/couchjs/js/util.js @@ -31,16 +31,16 @@ var resolveModule = function(names, mod, root) { } return resolveModule(names, { id : mod.id.slice(0, mod.id.lastIndexOf('/')), - parent : mod.parent.parent.parent, - current : mod.parent.parent.current + parent : mod.parent.parent, + current : mod.parent.current }); } else if (n == '.') { if (!mod.parent) { throw ["error", "invalid_require_path", 'Object has no parent '+JSON.stringify(mod.current)]; } return resolveModule(names, { - parent : mod.parent.parent, - current : mod.parent.current, + parent : mod.parent, + current : mod.current, id : mod.id }); } else if (root) { @@ -66,17 +66,28 @@ var Couch = { try { if (sandbox) { if (ddoc) { + if (!ddoc._module_cache) { + ddoc._module_cache = {}; + } var require = function(name, module) { module = module || {}; - var newModule = resolveModule(name.split('/'), module, ddoc); - var s = "function (module, exports, require) { " + newModule.current + " }"; - try { - var func = sandbox ? evalcx(s, sandbox) : eval(s); - func.apply(sandbox, [newModule, newModule.exports, function(name) {return require(name, newModule)}]); - } catch(e) { - throw ["error","compilation_error","Module require('"+name+"') raised error "+e.toSource()]; + var newModule = resolveModule(name.split('/'), module.parent, ddoc); + if (!ddoc._module_cache.hasOwnProperty(newModule.id)) { + // create empty exports object before executing the module, + // stops circular requires from filling the stack + ddoc._module_cache[newModule.id] = {}; + var s = "function (module, exports, require) { " + newModule.current + " }"; + try { + var func = sandbox ? evalcx(s, sandbox) : eval(s); + func.apply(sandbox, [newModule, newModule.exports, function(name) { + return require(name, newModule); + }]); + } catch(e) { + throw ["error","compilation_error","Module require('"+name+"') raised error "+e.toSource()]; + } + ddoc._module_cache[newModule.id] = newModule.exports; } - return newModule.exports; + return ddoc._module_cache[newModule.id]; } sandbox.require = require; } |