v8/test/mjsunit/harmony/module-resolution.js
rossberg@chromium.org 98db1a369d Implement proper module linking.
Specifically:

- In parser, check that all exports are defined.
- Move JSModule allocation from parser to scope resolution.
- Move JSModule linking from full codegen to scope resolution.
- Implement module accessors for exported value members.
- Allocate module contexts statically along with JSModules
  (to allow static linking), but chain them when module literal is evaluated.
- Make module contexts' extension slot refer to resp. JSModule
  (makes modules' ScopeInfo accessible from context).
- Some other tweaks to context handling in general.
- Make any code containing module literals (and thus embedding
  static references to JSModules) non-cacheable.

This enables accessing module instance objects as expected.
Import declarations are a separate feature and do not work yet.

R=mstarzinger@chromium.org
BUG=v8:1569
TEST=

Review URL: https://chromiumcodereview.appspot.com/10690043

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12010 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
2012-07-09 08:59:03 +00:00

153 lines
4.3 KiB
JavaScript

// Copyright 2012 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Flags: --harmony-modules --harmony-scoping
// Test basic module interface inference.
"use strict";
print("begin.")
export let x = print("0")
export module B = A.B
export module A {
export let x = print("1")
export let f = function() { return B.x }
export module B {
module BB = B
export BB, x
let x = print("2")
var y = print("3")
let Ax = A.x
try { A.y } catch (e) {} // throws
let Az = A.z // undefined
let Az2 = z // undefined
A.g() // hoisted
g() // hoisted
let ABx = A.B.x
let ABy = A.B.y
let Bx = B.x
let By = B.y
let BBx = BB.x
let BBy = BB.y
let Af = A.f
function f(x,y) { return x }
}
export let y = print("4")
export var z = print("4.1")
export function g() {}
let Ax = A.x
let Bx = B.x
let ABx = A.B.x
module C {
export let z = print("5")
export module D = B
// TODO(rossberg): turn these into proper negative test cases once we have
// suitable error messages.
// import C.z // multiple declarations
import x from B
}
module D {
// TODO(rossberg): Handle import *.
// import A.* // invalid forward import
}
module M {}
// TODO(rossberg): Handle import *.
// import M.* // invalid forward import
let Cz = C.z
let CDx = C.D.x
}
export module Imports {
module A1 {
export module A2 {}
}
module B {
// TODO(rossberg): Handle import *.
// import A1.*
// import A2.* // unbound variable A2
}
}
export module E {
export let xx = x
export y, B
let Bx = B.x
// TODO(rossberg): Handle import *.
// import A.*
module B = A.B
let y = A.y
}
export module M1 {
export module A2 = M2
}
export module M2 {
export module A1 = M1
}
// TODO(rossberg): turn these into proper negative test cases once we have
// suitable error messages.
// module W1 = W2.W
// module W2 = { export module W = W3 }
// module W3 = W1 // cyclic module definition
// module W1 = W2.W3
// module W2 = {
// export module W3 = W4
// export module W4 = W1
// } // cyclic module definition
// TODO(rossberg): Handle import *.
//module M3B = M3.B
//export module M3 {
// export module B { export let x = "" }
// module C1 = { import M3.* }
// module C2 = { import M3.B.* }
// module C3 = { import M3B.* }
// module C4 = { export x import B.* }
//// TODO(rossberg): turn these into proper negative test cases once we have
//// suitable error messages.
//// export module C5 = { import C5.* } // invalid forward import
//// export module C6 = { import M3.C6.* } // invalid forward import
//}
export module External at "external.js"
export module External1 = External
//export module ExternalA = External.A
export module InnerExternal {
export module E at "external.js"
}
export module External2 = InnerExternal.E
//export let xxx = InnerExternal.E.A.x
print("end.")