2020-09-18 22:13:48 +02:00
// This file was procedurally generated from the following sources:
// - src/function-forms/forbidden-ext-indirect-access-prop-caller.case
// - src/function-forms/forbidden-extensions/bullet-two/func-expr.template
/ * - - -
description : Forbidden extension , o . caller ( function expression )
esid : sec - definitions - runtime - semantics - evaluation
flags : [ generated , noStrict ]
info : |
FunctionExpression : function ( FormalParameters ) { FunctionBody }
2020-10-09 19:42:27 +02:00
If an implementation extends any function object with an own property named "caller" the value of
that property , as observed using [ [ Get ] ] or [ [ GetOwnProperty ] ] , must not be a strict function
object . If it is an accessor property , the function that is the value of the property ' s [ [ Get ] ]
attribute must never return a strict function when called .
2020-09-18 22:13:48 +02:00
-- - * /
2020-10-09 19:42:27 +02:00
var CALLER _OWN _PROPERTY _DOES _NOT _EXIST = Symbol ( ) ;
2020-09-18 22:13:48 +02:00
function inner ( ) {
2020-10-09 19:42:27 +02:00
// This property may exist, but is forbidden from having a value that is a strict function object
return inner . hasOwnProperty ( "caller" )
? inner . caller
: CALLER _OWN _PROPERTY _DOES _NOT _EXIST ;
2020-09-18 22:13:48 +02:00
}
var callCount = 0 ;
var f ;
f = function ( ) {
"use strict" ;
2020-10-09 19:42:27 +02:00
// This and the following conditional value is set in the test's .case file.
// For every test that has a "true" value here, there is a
// corresponding test that has a "false" value here.
// They are generated from two different case files, which use
// the same templates.
let descriptor = Object . getOwnPropertyDescriptor ( inner , "caller" ) ;
if ( descriptor && descriptor . configurable && false ) {
Object . defineProperty ( inner , "caller" , { } ) ;
}
var result = inner ( ) ;
if ( descriptor && descriptor . configurable && false ) {
assert . sameValue ( result , 1 , 'If this test defined an own "caller" property on the inner function, then it should be accessible and should return the value it was set to.' ) ;
}
// "CALLER_OWN_PROPERTY_DOES_NOT_EXIST" is from
// forbidden-ext-indirect-access-prop-caller.case
//
// If the function object "inner" has an own property
// named "caller", then its value will be returned.
//
// If the function object "inner" DOES NOT have an
// own property named "caller", then the symbol
// CALLER_OWN_PROPERTY_DOES_NOT_EXIST will be returned.
if ( result !== CALLER _OWN _PROPERTY _DOES _NOT _EXIST ) {
assert . notSameValue ( result , f ) ;
}
2020-09-25 17:23:33 +02:00
callCount ++ ;
2020-09-18 22:13:48 +02:00
} ;
2020-10-09 19:42:27 +02:00
f ( ) ;
assert . sameValue ( callCount , 1 , 'body evaluated' ) ;