Implement the RegExp.prototype.flags
getter
TEST=mjsunit/harmony BUG=v8:3751 LOG=N Review URL: https://codereview.chromium.org/770333005 Cr-Commit-Position: refs/heads/master@{#25762}
This commit is contained in:
parent
059482b70d
commit
33f0cf5acd
3
BUILD.gn
3
BUILD.gn
@ -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 = [
|
||||
|
@ -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",
|
||||
|
35
src/harmony-regexp.js
Normal file
35
src/harmony-regexp.js
Normal file
@ -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();
|
@ -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"],
|
||||
|
40
test/mjsunit/harmony/regexp-flags.js
Normal file
40
test/mjsunit/harmony/regexp-flags.js
Normal file
@ -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);
|
@ -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',
|
||||
|
Loading…
Reference in New Issue
Block a user