Skip to content

Commit

Permalink
Implement the RegExp.prototype.flags getter
Browse files Browse the repository at this point in the history
TEST=mjsunit/harmony
BUG=v8:3751
LOG=N

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

Cr-Commit-Position: refs/heads/master@{#25762}
  • Loading branch information
mathiasbynens authored and Commit bot committed Dec 10, 2014
1 parent 059482b commit 33f0cf5
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 3 deletions.
3 changes: 2 additions & 1 deletion BUILD.gn
Expand Up @@ -243,7 +243,8 @@ action("js2c_experimental") {
"src/harmony-typedarray.js",
"src/harmony-classes.js",
"src/harmony-tostring.js",
"src/harmony-templates.js"
"src/harmony-templates.js",
"src/harmony-regexp.js"
]

outputs = [
Expand Down
3 changes: 2 additions & 1 deletion src/bootstrapper.cc
Expand Up @@ -2166,7 +2166,8 @@ bool Genesis::InstallExperimentalNatives() {
static const char* harmony_modules_natives[] = {NULL};
static const char* harmony_scoping_natives[] = {NULL};
static const char* harmony_object_literals_natives[] = {NULL};
static const char* harmony_regexps_natives[] = {NULL};
static const char* harmony_regexps_natives[] = {
"native harmony-regexp.js", NULL};
static const char* harmony_arrow_functions_natives[] = {NULL};
static const char* harmony_numeric_literals_natives[] = {NULL};
static const char* harmony_tostring_natives[] = {"native harmony-tostring.js",
Expand Down
35 changes: 35 additions & 0 deletions src/harmony-regexp.js
@@ -0,0 +1,35 @@
// Copyright 2014 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.

'use strict';

var $RegExp = global.RegExp;

// -------------------------------------------------------------------

// ES6 draft 12-06-13, section 21.2.5.3
// + https://bugs.ecmascript.org/show_bug.cgi?id=3423
function RegExpGetFlags() {
if (!IS_SPEC_OBJECT(this)) {
throw MakeTypeError('flags_getter_non_object',
[%ToString(this)]);
}
var result = '';
if (this.global) result += 'g';
if (this.ignoreCase) result += 'i';
if (this.multiline) result += 'm';
if (this.unicode) result += 'u';
if (this.sticky) result += 'y';
return result;
}

function ExtendRegExpPrototype() {
%CheckIsBootstrapping();

%DefineAccessorPropertyUnchecked($RegExp.prototype, 'flags', RegExpGetFlags,
null, DONT_ENUM | DONT_DELETE);
%SetNativeFlag(RegExpGetFlags);
}

ExtendRegExpPrototype();
1 change: 1 addition & 0 deletions src/messages.js
Expand Up @@ -52,6 +52,7 @@ var kMessages = {
apply_wrong_args: ["Function.prototype.apply: Arguments list has wrong type"],
toMethod_non_function: ["Function.prototype.toMethod was called on ", "%0", ", which is a ", "%1", " and not a function"],
toMethod_non_object: ["Function.prototype.toMethod: home object ", "%0", " is not an object"],
flags_getter_non_object: ["RegExp.prototype.flags getter called on non-object ", "%0"],
invalid_in_operator_use: ["Cannot use 'in' operator to search for '", "%0", "' in ", "%1"],
instanceof_function_expected: ["Expecting a function in instanceof check, but got ", "%0"],
instanceof_nonobject_proto: ["Function has non-object prototype '", "%0", "' in instanceof check"],
Expand Down
40 changes: 40 additions & 0 deletions test/mjsunit/harmony/regexp-flags.js
@@ -0,0 +1,40 @@
// Copyright 2014 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

delete RegExp.prototype.flags;
RegExp.prototype.flags = 'setter should be undefined';

assertEquals('', RegExp('').flags);
assertEquals('', /./.flags);
assertEquals('gimy', RegExp('', 'ygmi').flags);
assertEquals('gimy', /foo/ymig.flags);

// TODO(dslomov): When support for the `u` flag is added, uncomment the first
// line below and remove the second line.
//assertEquals(RegExp('', 'yumig').flags, 'gimuy');
assertThrows(function() { RegExp('', 'yumig').flags; }, SyntaxError);

var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, 'flags');
assertFalse(descriptor.configurable);
assertFalse(descriptor.enumerable);
assertInstanceof(descriptor.get, Function);
assertEquals(undefined, descriptor.set);

function testGenericFlags(object) {
return descriptor.get.call(object);
}

assertEquals('', testGenericFlags({}));
assertEquals('i', testGenericFlags({ ignoreCase: true }));
assertEquals('uy', testGenericFlags({ global: 0, sticky: 1, unicode: 1 }));
assertEquals('m', testGenericFlags({ __proto__: { multiline: true } }));
assertThrows(function() { testGenericFlags(); }, TypeError);
assertThrows(function() { testGenericFlags(undefined); }, TypeError);
assertThrows(function() { testGenericFlags(null); }, TypeError);
assertThrows(function() { testGenericFlags(true); }, TypeError);
assertThrows(function() { testGenericFlags(false); }, TypeError);
assertThrows(function() { testGenericFlags(''); }, TypeError);
assertThrows(function() { testGenericFlags(42); }, TypeError);
3 changes: 2 additions & 1 deletion tools/gyp/v8.gyp
Expand Up @@ -1637,7 +1637,8 @@
'../../src/harmony-tostring.js',
'../../src/harmony-typedarray.js',
'../../src/harmony-classes.js',
'../../src/harmony-templates.js'
'../../src/harmony-templates.js',
'../../src/harmony-regexp.js'
],
'libraries_bin_file': '<(SHARED_INTERMEDIATE_DIR)/libraries.bin',
'libraries_experimental_bin_file': '<(SHARED_INTERMEDIATE_DIR)/libraries-experimental.bin',
Expand Down

0 comments on commit 33f0cf5

Please sign in to comment.