Split off a separate --harmony_sloppy_let flag
authorlittledan <littledan@chromium.org>
Sat, 25 Jul 2015 00:05:08 +0000 (17:05 -0700)
committerCommit bot <commit-bot@chromium.org>
Sat, 25 Jul 2015 00:05:18 +0000 (00:05 +0000)
--harmony_sloppy includes behavior to turn on sloppy mode lexical
bindings. Before this patch, it also included a way to parse let
which is likely web-incompatible (let is disallowed as an
identifier). This patch splits off the let parsing from the more
general block scoping code, so that block scoping can be developed
independently.

R=adamk
LOG=N
BUG=v8:3305

Review URL: https://codereview.chromium.org/1255013002

Cr-Commit-Position: refs/heads/master@{#29855}

14 files changed:
src/bootstrapper.cc
src/flag-definitions.h
src/parser.cc
src/preparser.h
test/cctest/test-parsing.cc
test/mjsunit/harmony/block-conflicts-sloppy.js
test/mjsunit/harmony/block-const-assign-sloppy.js
test/mjsunit/harmony/block-for-sloppy.js
test/mjsunit/harmony/block-leave-sloppy.js
test/mjsunit/harmony/block-let-crankshaft-sloppy.js
test/mjsunit/harmony/block-let-declaration-sloppy.js
test/mjsunit/harmony/block-let-semantics-sloppy.js
test/mjsunit/harmony/block-scoping-sloppy.js
test/mjsunit/harmony/block-scoping-top-level-sloppy.js

index db05e3e8dfe0e26ab94235db1a0fdd7a40e4e6a8..71b61e6b52c573e4f64ea64926dee37a9d4c3b0b 100644 (file)
@@ -1864,6 +1864,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_let)
 EMPTY_NATIVE_FUNCTIONS_FOR_FEATURE(harmony_unicode)
 EMPTY_NATIVE_FUNCTIONS_FOR_FEATURE(harmony_unicode_regexps)
 EMPTY_NATIVE_FUNCTIONS_FOR_FEATURE(harmony_computed_property_names)
@@ -1900,6 +1901,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_let)
 EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_unicode)
 EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_computed_property_names)
 EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_rest_parameters)
@@ -2578,6 +2580,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_let_natives[] = {nullptr};
   static const char* harmony_unicode_natives[] = {nullptr};
   static const char* harmony_unicode_regexps_natives[] = {nullptr};
   static const char* harmony_computed_property_names_natives[] = {nullptr};
index 787537e59d46b765a9b6f7ae3c57229ab4d0d57d..9c1b214ab9bb3c974820a389e05b644a279784b6 100644 (file)
@@ -191,6 +191,7 @@ DEFINE_BOOL(legacy_const, true, "legacy semantics for const in sloppy mode")
   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")             \
@@ -240,6 +241,7 @@ HARMONY_SHIPPING(FLAG_SHIPPING_FEATURES)
 
 // Feature dependencies.
 DEFINE_IMPLICATION(harmony_unicode_regexps, harmony_unicode)
+DEFINE_IMPLICATION(harmony_sloppy_let, harmony_sloppy)
 
 
 // Flags for experimental implementation features.
index 8d1bd881a63e7fed137d767fe508f454dfc04baf..027880cd0504454cd8f53e1947f89407fbb4671c 100644 (file)
@@ -913,6 +913,7 @@ Parser::Parser(ParseInfo* info)
   set_allow_harmony_modules(!info->is_native() && FLAG_harmony_modules);
   set_allow_harmony_arrow_functions(FLAG_harmony_arrow_functions);
   set_allow_harmony_sloppy(FLAG_harmony_sloppy);
+  set_allow_harmony_sloppy_let(FLAG_harmony_sloppy_let);
   set_allow_harmony_unicode(FLAG_harmony_unicode);
   set_allow_harmony_computed_property_names(
       FLAG_harmony_computed_property_names);
@@ -4459,6 +4460,7 @@ PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser(
     SET_ALLOW(harmony_modules);
     SET_ALLOW(harmony_arrow_functions);
     SET_ALLOW(harmony_sloppy);
+    SET_ALLOW(harmony_sloppy_let);
     SET_ALLOW(harmony_unicode);
     SET_ALLOW(harmony_computed_property_names);
     SET_ALLOW(harmony_rest_params);
index e652a1f1bbef90f477db5680a8f6c939d4e11f38..18a0162913d1774a8c1d3077c1e073f7a0a3762b 100644 (file)
@@ -101,6 +101,7 @@ class ParserBase : public Traits {
         allow_natives_(false),
         allow_harmony_arrow_functions_(false),
         allow_harmony_sloppy_(false),
+        allow_harmony_sloppy_let_(false),
         allow_harmony_computed_property_names_(false),
         allow_harmony_rest_params_(false),
         allow_harmony_spreadcalls_(false),
@@ -118,6 +119,7 @@ class ParserBase : public Traits {
   ALLOW_ACCESSORS(natives);
   ALLOW_ACCESSORS(harmony_arrow_functions);
   ALLOW_ACCESSORS(harmony_sloppy);
+  ALLOW_ACCESSORS(harmony_sloppy_let);
   ALLOW_ACCESSORS(harmony_computed_property_names);
   ALLOW_ACCESSORS(harmony_rest_params);
   ALLOW_ACCESSORS(harmony_spreadcalls);
@@ -504,7 +506,7 @@ class ParserBase : public Traits {
   }
 
   bool allow_let() {
-    return is_strict(language_mode()) || allow_harmony_sloppy();
+    return is_strict(language_mode()) || allow_harmony_sloppy_let();
   }
 
   // Report syntax errors.
@@ -797,6 +799,7 @@ class ParserBase : public Traits {
   bool allow_natives_;
   bool allow_harmony_arrow_functions_;
   bool allow_harmony_sloppy_;
+  bool allow_harmony_sloppy_let_;
   bool allow_harmony_computed_property_names_;
   bool allow_harmony_rest_params_;
   bool allow_harmony_spreadcalls_;
index 703f74d947cdaba3fb1da8f9cea83a0c0c6226ac..5c78f43dd037db63e2eaff331153d26d36d07dcd 100644 (file)
@@ -1431,6 +1431,7 @@ enum ParserFlag {
   kAllowHarmonyArrowFunctions,
   kAllowHarmonyRestParameters,
   kAllowHarmonySloppy,
+  kAllowHarmonySloppyLet,
   kAllowHarmonyUnicode,
   kAllowHarmonyComputedPropertyNames,
   kAllowHarmonySpreadCalls,
@@ -1461,6 +1462,7 @@ void SetParserFlags(i::ParserBase<Traits>* parser,
   parser->set_allow_harmony_spreadcalls(
       flags.Contains(kAllowHarmonySpreadCalls));
   parser->set_allow_harmony_sloppy(flags.Contains(kAllowHarmonySloppy));
+  parser->set_allow_harmony_sloppy_let(flags.Contains(kAllowHarmonySloppyLet));
   parser->set_allow_harmony_unicode(flags.Contains(kAllowHarmonyUnicode));
   parser->set_allow_harmony_computed_property_names(
       flags.Contains(kAllowHarmonyComputedPropertyNames));
@@ -6841,7 +6843,8 @@ TEST(LetSloppy) {
   };
   // clang-format on
 
-  static const ParserFlag always_flags[] = {kAllowHarmonySloppy};
+  static const ParserFlag always_flags[] = {kAllowHarmonySloppy,
+                                            kAllowHarmonySloppyLet};
   RunParserSyncTest(context_data, data, kSuccess, NULL, 0, always_flags,
                     arraysize(always_flags));
 }
index 25694edc5b0857f1a3b67ff0c6f4f99fe7e00915..14dc24219ac85868710ac01ebe73f363aa7851de 100644 (file)
@@ -4,7 +4,7 @@
 
 // Test for conflicting variable bindings.
 
-// Flags: --no-legacy-const --harmony-sloppy
+// Flags: --no-legacy-const --harmony-sloppy --harmony-sloppy-let
 
 function CheckException(e) {
   var string = e.toString();
index 56300a8db106a6ec988190d443626cf2e752ffba..d8e62f6d89cb91b2fdf6405952491c787e94aafb 100644 (file)
@@ -26,7 +26,7 @@
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 // Flags: --harmony-computed-property-names
-// Flags: --no-legacy-const --harmony-sloppy
+// Flags: --no-legacy-const --harmony-sloppy --harmony-sloppy-let
 
 // Test that we throw early syntax errors in harmony mode
 // when using an immutable binding in an assigment or with
index 374c450fa08de4b24d2745c8dcc06f9f2529c38d..eee8e0b5cdc73198914debb77e9ab2b395b8c58f 100644 (file)
@@ -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: --no-legacy-const --harmony-sloppy
+// Flags: --no-legacy-const --harmony-sloppy --harmony-sloppy-let
 
 function props(x) {
   var array = [];
index 23e9fa16edd7503415a72ac6ab15ab1fccf4dd17..fe21341c2e1106a1681e676f2c1d2dce72660511 100644 (file)
@@ -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: --no-legacy-const --harmony-sloppy
+// Flags: --no-legacy-const --harmony-sloppy --harmony-sloppy-let
 
 // We want to test the context chain shape.  In each of the tests cases
 // below, the outer with is to force a runtime lookup of the identifier 'x'
index ed8c815f3b8468d3736695c7138219bb77469d26..dc5cdfb5b70a2d35ee43bec60594fb719c4fd5db 100644 (file)
@@ -26,7 +26,7 @@
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 // Flags: --allow-natives-syntax
-// Flags: --no-legacy-const --harmony-sloppy
+// Flags: --no-legacy-const --harmony-sloppy --harmony-sloppy-let
 
 // Check that the following functions are optimizable.
 var functions = [ f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14,
index e5913f8c08cdf89376f45cfed5af21313acfad67..9fdc4bd5a7df97e3c7d1e0d1092e04d06f332b20 100644 (file)
@@ -27,7 +27,7 @@
 
 // Test let declarations in various settings.
 
-// Flags: --no-legacy-const --harmony-sloppy
+// Flags: --no-legacy-const --harmony-sloppy --harmony-sloppy-let
 
 // Global
 let x;
index 35aad30b1b1de55d24a0233263c2c855514468ab..33fdc45251db68fcd49dfec59723ba8b1d640ada 100644 (file)
@@ -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
+// Flags: --harmony-sloppy --no-legacy-const --harmony-sloppy-let
 
 // Test temporal dead zone semantics of let bound variables in
 // function and block scopes.
index 19d1e9afa62ec4c896e5b07f4a9cdf7bb6af4865..d1975dfafcaffec18c5164e99cbd62bc387a83ec 100644 (file)
@@ -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
+// Flags: --allow-natives-syntax --harmony-sloppy --no-legacy-const --harmony-sloppy-let
 // Test functionality of block scopes.
 
 // Hoisting of var declarations.
index f86e1a16afb383593adcfdb07191a96617d6c57c..74492c4ca669fcbf4c32e61366dc5277aa4bdc18 100644 (file)
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 // Flags: --min-preparse-length=0
-// Flags: --no-legacy-const --harmony-sloppy
+// Flags: --no-legacy-const --harmony-sloppy --harmony-sloppy-let
 
 let xxx = 1;
 let f = undefined;