8.7.1 GetValue

2010-04-18

mixed GetValue(R:Reference)

Get the current value of whatever R is pointing to.

Code: (abstract ecma)
function GetValue(R){
if (Type(R) != 'Reference') return R;
var base = GetBase(R);
if (IsUnresolvableReference(R)) throw ReferenceError;
if (IsPropertyReference(R)) {
if (HasPrimitiveBase(R)) {
var get = function(P){
var O = ToObject(base);
var desc = O.[[GetPropertyName]](P);
if (desc === undefined) return desc;
if (IsDataDescriptor(desc)) return desc.[[Value]];
var getter = desc.[[Get]];
if (getter === undefined) return getter;
return getter.[[Call]](base);
} else {
var get = base.[[Get]];
}
return get.[[Call]](base, GetReferencedName(R));
}
// base must be an environment record
return base.GetBindingValue(GetReferencedName(R), IsStrictReference(V));
}

The object in the inner function can only be made visible using accessors. Implementations are not forced to actually create an object there if they want to do it in a different way.