/* When encoding any value (val) using JSON.stringigy(), encoding begins
 * with a dummy wrapper object:
 *
 *   { "": val }
 *
 * This seems to be a purely internal matter but is not: the wrapper
 * object is accessible to a replacement function.
 */

var val;
var t;

/*===
replacer
desc: true true true foo
object
foo

foo
===*/

// Here the wrapper object is: { "": "foo" }

try {
    val = "foo";
    t = JSON.stringify(val, function(k, v) {
        // this binding: holder object, i.e. the wrapper
        // k: key
        // v: value

        print("replacer");

	var pd = Object.getOwnPropertyDescriptor(this, '');
	print('desc:', pd.writable, pd.enumerable, pd.configurable, pd.value);

        print(typeof this);
        print(this['']);  // access the empty string key of the wrapper
        print(k);         // empty string
        print(v);         // 'foo'
    });
} catch (e) {
    print(e.name);
}

