Split function block scoping into a separate flag
In an initial attempt to implement sloppy mode lexical bindings, functions were made lexically scoped in sloppy mode. However, the ES2015 spec says that they need an additional hoisted var binding, and further, it's not clear when we'll implement that behavior or whether it's web-compatible. This patch splits off function block scoping into a new, separate flag called --harmony_sloppy_function. This change will enable the possibility of testing and shipping this feature separately from other block scoping-related features which don't have the same risks. BUG=v8:4285 R=adamk LOG=N Review URL: https://codereview.chromium.org/1282093002 Cr-Commit-Position: refs/heads/master@{#30122}
This commit is contained in:
parent
43655380bd
commit
1ebf0d7c5d
@ -1840,6 +1840,7 @@ EMPTY_NATIVE_FUNCTIONS_FOR_FEATURE(harmony_regexps)
|
||||
EMPTY_NATIVE_FUNCTIONS_FOR_FEATURE(harmony_arrow_functions)
|
||||
EMPTY_NATIVE_FUNCTIONS_FOR_FEATURE(harmony_tostring)
|
||||
EMPTY_NATIVE_FUNCTIONS_FOR_FEATURE(harmony_sloppy)
|
||||
EMPTY_NATIVE_FUNCTIONS_FOR_FEATURE(harmony_sloppy_function)
|
||||
EMPTY_NATIVE_FUNCTIONS_FOR_FEATURE(harmony_sloppy_let)
|
||||
EMPTY_NATIVE_FUNCTIONS_FOR_FEATURE(harmony_unicode_regexps)
|
||||
EMPTY_NATIVE_FUNCTIONS_FOR_FEATURE(harmony_rest_parameters)
|
||||
@ -1876,6 +1877,7 @@ EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_array_includes)
|
||||
EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_arrow_functions)
|
||||
EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_proxies)
|
||||
EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_sloppy)
|
||||
EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_sloppy_function)
|
||||
EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_sloppy_let)
|
||||
EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_rest_parameters)
|
||||
EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_spreadcalls)
|
||||
@ -2558,6 +2560,7 @@ bool Genesis::InstallExperimentalNatives() {
|
||||
static const char* harmony_tostring_natives[] = {"native harmony-tostring.js",
|
||||
nullptr};
|
||||
static const char* harmony_sloppy_natives[] = {nullptr};
|
||||
static const char* harmony_sloppy_function_natives[] = {nullptr};
|
||||
static const char* harmony_sloppy_let_natives[] = {nullptr};
|
||||
static const char* harmony_unicode_regexps_natives[] = {nullptr};
|
||||
static const char* harmony_rest_parameters_natives[] = {nullptr};
|
||||
|
@ -185,17 +185,18 @@ DEFINE_IMPLICATION(es_staging, harmony)
|
||||
DEFINE_BOOL(legacy_const, true, "legacy semantics for const in sloppy mode")
|
||||
|
||||
// Features that are still work in progress (behind individual flags).
|
||||
#define HARMONY_INPROGRESS(V) \
|
||||
V(harmony_modules, "harmony modules") \
|
||||
V(harmony_regexps, "harmony regular expression extensions") \
|
||||
V(harmony_proxies, "harmony proxies") \
|
||||
V(harmony_sloppy, "harmony features in sloppy mode") \
|
||||
V(harmony_sloppy_let, "harmony let in sloppy mode") \
|
||||
V(harmony_unicode_regexps, "harmony unicode regexps") \
|
||||
V(harmony_reflect, "harmony Reflect API") \
|
||||
V(harmony_destructuring, "harmony destructuring") \
|
||||
V(harmony_sharedarraybuffer, "harmony sharedarraybuffer") \
|
||||
V(harmony_atomics, "harmony atomics") \
|
||||
#define HARMONY_INPROGRESS(V) \
|
||||
V(harmony_modules, "harmony modules") \
|
||||
V(harmony_regexps, "harmony regular expression extensions") \
|
||||
V(harmony_proxies, "harmony proxies") \
|
||||
V(harmony_sloppy, "harmony features in sloppy mode") \
|
||||
V(harmony_sloppy_function, "harmony sloppy function block scoping") \
|
||||
V(harmony_sloppy_let, "harmony let in sloppy mode") \
|
||||
V(harmony_unicode_regexps, "harmony unicode regexps") \
|
||||
V(harmony_reflect, "harmony Reflect API") \
|
||||
V(harmony_destructuring, "harmony destructuring") \
|
||||
V(harmony_sharedarraybuffer, "harmony sharedarraybuffer") \
|
||||
V(harmony_atomics, "harmony atomics") \
|
||||
V(harmony_simd, "harmony simd")
|
||||
|
||||
// Features that are complete (but still behind --harmony/es-staging flag).
|
||||
|
@ -912,6 +912,7 @@ Parser::Parser(ParseInfo* info)
|
||||
set_allow_natives(FLAG_allow_natives_syntax || info->is_native());
|
||||
set_allow_harmony_arrow_functions(FLAG_harmony_arrow_functions);
|
||||
set_allow_harmony_sloppy(FLAG_harmony_sloppy);
|
||||
set_allow_harmony_sloppy_function(FLAG_harmony_sloppy_function);
|
||||
set_allow_harmony_sloppy_let(FLAG_harmony_sloppy_let);
|
||||
set_allow_harmony_rest_parameters(FLAG_harmony_rest_parameters);
|
||||
set_allow_harmony_spreadcalls(FLAG_harmony_spreadcalls);
|
||||
@ -2224,8 +2225,10 @@ Statement* Parser::ParseFunctionDeclaration(
|
||||
VariableMode mode =
|
||||
is_strong(language_mode())
|
||||
? CONST
|
||||
: (is_strict(language_mode()) || allow_harmony_sloppy()) &&
|
||||
!scope_->is_declaration_scope() ? LET : VAR;
|
||||
: (is_strict(language_mode()) || allow_harmony_sloppy_function()) &&
|
||||
!scope_->is_declaration_scope()
|
||||
? LET
|
||||
: VAR;
|
||||
VariableProxy* proxy = NewUnresolved(name, mode);
|
||||
Declaration* declaration =
|
||||
factory()->NewFunctionDeclaration(proxy, mode, fun, scope_, pos);
|
||||
|
@ -108,6 +108,7 @@ class ParserBase : public Traits {
|
||||
allow_natives_(false),
|
||||
allow_harmony_arrow_functions_(false),
|
||||
allow_harmony_sloppy_(false),
|
||||
allow_harmony_sloppy_function_(false),
|
||||
allow_harmony_sloppy_let_(false),
|
||||
allow_harmony_rest_parameters_(false),
|
||||
allow_harmony_spreadcalls_(false),
|
||||
@ -125,6 +126,7 @@ class ParserBase : public Traits {
|
||||
ALLOW_ACCESSORS(natives);
|
||||
ALLOW_ACCESSORS(harmony_arrow_functions);
|
||||
ALLOW_ACCESSORS(harmony_sloppy);
|
||||
ALLOW_ACCESSORS(harmony_sloppy_function);
|
||||
ALLOW_ACCESSORS(harmony_sloppy_let);
|
||||
ALLOW_ACCESSORS(harmony_rest_parameters);
|
||||
ALLOW_ACCESSORS(harmony_spreadcalls);
|
||||
@ -798,6 +800,7 @@ class ParserBase : public Traits {
|
||||
bool allow_natives_;
|
||||
bool allow_harmony_arrow_functions_;
|
||||
bool allow_harmony_sloppy_;
|
||||
bool allow_harmony_sloppy_function_;
|
||||
bool allow_harmony_sloppy_let_;
|
||||
bool allow_harmony_rest_parameters_;
|
||||
bool allow_harmony_spreadcalls_;
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
// Test for conflicting variable bindings.
|
||||
|
||||
// Flags: --no-legacy-const --harmony-sloppy --harmony-sloppy-let
|
||||
// Flags: --no-legacy-const --harmony-sloppy --harmony-sloppy-let --harmony-sloppy-function
|
||||
|
||||
function CheckException(e) {
|
||||
var string = e.toString();
|
||||
|
@ -25,7 +25,7 @@
|
||||
// (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-sloppy --no-legacy-const --harmony-sloppy-let
|
||||
// Flags: --harmony-sloppy --no-legacy-const --harmony-sloppy-let --harmony-sloppy-function
|
||||
|
||||
// Test temporal dead zone semantics of let bound variables in
|
||||
// function and block scopes.
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
// Test for conflicting variable bindings.
|
||||
|
||||
// Flags: --harmony-sloppy
|
||||
// Flags: --harmony-sloppy --harmony-sloppy-function
|
||||
|
||||
function AssertEqualsStrictAndSloppy(value, code) {
|
||||
assertEquals(value, eval("(function() {" + code + "})()"));
|
||||
|
@ -25,7 +25,7 @@
|
||||
// (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: --allow-natives-syntax --harmony-sloppy --no-legacy-const --harmony-sloppy-let
|
||||
// Flags: --allow-natives-syntax --harmony-sloppy --no-legacy-const --harmony-sloppy-let --harmony-sloppy-function
|
||||
// Test functionality of block scopes.
|
||||
|
||||
// Hoisting of var declarations.
|
||||
|
Loading…
Reference in New Issue
Block a user