/*
 * Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/licenses/publicdomain/
 */

function strictThis() { 'use strict'; return this; }

/* Check that calls of flat closure slots get the right |this|. */
function flat(g) {
    function h() { return g(); }
    return h;
}
assertEq(flat(strictThis)(), undefined);

/* Check that calls up upvars get the right |this|. */
function upvar(f) {
    function h() {
        return f(); 
    }
    return h();
}
assertEq(upvar(strictThis), undefined);

/* Check that calls to with-object properties get an appropriate 'this'. */
var obj = { f: strictThis };
with (obj) {
    /* 
     * The method won't compile anything containing a 'with', but it can
     * compile 'g'.
     */
    function g() { return f(); }
    assertEq(g(), obj);
}

reportCompare(true, true);