mirror of https://github.com/svaarala/duktape.git
Sami Vaarala
11 years ago
1 changed files with 129 additions and 0 deletions
@ -0,0 +1,129 @@ |
|||
/* |
|||
* A module environment is isolated from the global environment. Variable |
|||
* and function declarations do not pollute the global object (although |
|||
* plain assignments do). In the current implementation a module is wrapped |
|||
* inside a temporary function which provides the scope for the module. |
|||
*/ |
|||
|
|||
/*=== |
|||
before global require |
|||
module: global-module |
|||
exports: global-exports |
|||
myVar1: global-myVar1 |
|||
myVar2: global-myVar2 |
|||
myVar3: global-myVar3 |
|||
foo: global-foo |
|||
mod: object [object Object] |
|||
mod.name: test1 |
|||
mod.foo: bar |
|||
after global require |
|||
module: global-module |
|||
exports: global-exports |
|||
myVar1: global-myVar1 |
|||
myVar2: global-myVar2 |
|||
myVar3: module-myVar3 |
|||
foo: global-foo |
|||
before module require |
|||
module: global-module |
|||
exports: global-exports |
|||
myVar1: global-myVar1 |
|||
myVar2: global-myVar2 |
|||
myVar3: global-myVar3 |
|||
foo: global-foo |
|||
mod: object [object Object] |
|||
mod.name: test2 |
|||
mod.foo: bar |
|||
after module require |
|||
module: global-module |
|||
exports: global-exports |
|||
myVar1: global-myVar1 |
|||
myVar2: global-myVar2 |
|||
myVar3: module-myVar3 |
|||
foo: global-foo |
|||
===*/ |
|||
|
|||
// These shouldn't get overwritten.
|
|||
var module; |
|||
var exports; |
|||
var myVar1; |
|||
var myVar2; |
|||
var foo; |
|||
|
|||
// This is ovwritten because module doesn't declare a variable
|
|||
var myVar3; |
|||
|
|||
// Temp
|
|||
var mod; |
|||
|
|||
function initVars() { |
|||
module = 'global-module'; |
|||
exports = 'global-exports'; |
|||
myVar1 = 'global-myVar1'; |
|||
myVar2 = 'global-myVar2'; |
|||
myVar3 = 'global-myVar3'; |
|||
foo = 'global-foo'; |
|||
} |
|||
|
|||
function dumpVars() { |
|||
print('module:', module); |
|||
print('exports:', exports); |
|||
print('myVar1:', myVar1); |
|||
print('myVar2:', myVar2); |
|||
print('myVar3:', myVar3); |
|||
print('foo:', foo); |
|||
} |
|||
|
|||
Duktape.find = function (id) { |
|||
var ret; |
|||
|
|||
if (id === 'test1' || id === 'test2') { |
|||
ret = 'var myVar1;\n' + // declared inside the module
|
|||
'exports.name = "' + id + '";\n' + // goes into exports
|
|||
'exports = "module-exports";\n' + // overwrites module exports, not global, does not affect exports.name getting exported
|
|||
'this.foo = "bar";\n' + // 'this' is bound to the original exports table, so 'foo' gets exported
|
|||
'require = "module-require";\n' + // overwrite module require, not global
|
|||
'myVar1 = "module-myVar1";\n' + // writes to local variable, not global
|
|||
'function myVar2() {}\n' + // declared inside module
|
|||
'myVar3 = "module-myVar3";\n' // not declared locally, *set to global variable*
|
|||
; |
|||
//print(ret);
|
|||
return ret; |
|||
} |
|||
throw new Error('cannot find module: ' + id); |
|||
}; |
|||
|
|||
function moduleEnvironmentTest() { |
|||
var mod; |
|||
mod = require('test2'); |
|||
print('mod:', typeof mod, mod); |
|||
print('mod.name:', mod.name); |
|||
print('mod.foo:', mod.foo); |
|||
print('after module require'); |
|||
dumpVars(); |
|||
} |
|||
|
|||
/* Using a require() from a global program. */ |
|||
print('before global require'); |
|||
initVars(); |
|||
dumpVars(); |
|||
try { |
|||
mod = require('test1'); |
|||
} catch (e) { |
|||
print('global require failed:', e); |
|||
print(e.stack); |
|||
} |
|||
print('mod:', typeof mod, mod); |
|||
print('mod.name:', mod.name); |
|||
print('mod.foo:', mod.foo); |
|||
print('after global require'); |
|||
dumpVars(); |
|||
|
|||
initVars(); |
|||
print('before module require'); |
|||
dumpVars(); |
|||
|
|||
try { |
|||
moduleEnvironmentTest(); |
|||
} catch (e) { |
|||
print(e); |
|||
} |
Loading…
Reference in new issue