// Copyright 2015 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Flags: --harmony-regexps --harmony-unicode-regexps var r1 = /abc/gi; assertEquals("abc", r1.source); assertTrue(r1.global); assertTrue(r1.ignoreCase); assertFalse(r1.multiline); assertFalse(r1.sticky); assertFalse(r1.unicode); // Internal slot of prototype is not read. var r2 = { __proto__: r1 }; assertThrows(function() { r2.source; }, TypeError); assertThrows(function() { r2.global; }, TypeError); assertThrows(function() { r2.ignoreCase; }, TypeError); assertThrows(function() { r2.multiline; }, TypeError); assertThrows(function() { r2.sticky; }, TypeError); assertThrows(function() { r2.unicode; }, TypeError); var r3 = /I/; var string = "iIiIi"; var expected = "iXiIi"; assertFalse(r3.global); assertFalse(r3.ignoreCase); assertEquals("", r3.flags); assertEquals(expected, string.replace(r3, "X")); var get_count = 0; Object.defineProperty(r3, "global", { get: function() { get_count++; return true; } }); Object.defineProperty(r3, "ignoreCase", { get: function() { get_count++; return true; } }); assertTrue(r3.global); assertEquals(1, get_count); assertTrue(r3.ignoreCase); assertEquals(2, get_count); // Overridden flag getters affects the flags getter. assertEquals("gi", r3.flags); assertEquals(4, get_count); // Overridden flag getters do not affect the internal flags. assertEquals(expected, string.replace(r3, "X")); assertEquals(4, get_count); function testName(name) { // TODO(littledan): For web compatibility, we don't throw an exception, // but ES2015 expects an exception to be thrown from this getter. assertEquals(undefined, RegExp.prototype[name]); assertEquals( "get " + name, Object.getOwnPropertyDescriptor(RegExp.prototype, name).get.name); } testName("global"); testName("ignoreCase"); testName("multiline"); testName("source"); testName("sticky"); testName("unicode");