зеркало из https://github.com/mozilla/gecko-dev.git
Bug 570551 - Don't use shared-permanent properties to implement RegExp instance properties. r=jorendorff
This commit is contained in:
Родитель
5613624c45
Коммит
dc6aab728a
|
@ -138,18 +138,24 @@ const char *const js_common_atom_names[] = {
|
||||||
js_eval_str, /* evalAtom */
|
js_eval_str, /* evalAtom */
|
||||||
js_fileName_str, /* fileNameAtom */
|
js_fileName_str, /* fileNameAtom */
|
||||||
js_get_str, /* getAtom */
|
js_get_str, /* getAtom */
|
||||||
|
js_global_str, /* globalAtom */
|
||||||
|
js_ignoreCase_str, /* ignoreCaseAtom */
|
||||||
js_index_str, /* indexAtom */
|
js_index_str, /* indexAtom */
|
||||||
js_input_str, /* inputAtom */
|
js_input_str, /* inputAtom */
|
||||||
js_iterator_str, /* iteratorAtom */
|
js_iterator_str, /* iteratorAtom */
|
||||||
|
js_lastIndex_str, /* lastIndexAtom */
|
||||||
js_length_str, /* lengthAtom */
|
js_length_str, /* lengthAtom */
|
||||||
js_lineNumber_str, /* lineNumberAtom */
|
js_lineNumber_str, /* lineNumberAtom */
|
||||||
js_message_str, /* messageAtom */
|
js_message_str, /* messageAtom */
|
||||||
|
js_multiline_str, /* multilineAtom */
|
||||||
js_name_str, /* nameAtom */
|
js_name_str, /* nameAtom */
|
||||||
js_next_str, /* nextAtom */
|
js_next_str, /* nextAtom */
|
||||||
js_noSuchMethod_str, /* noSuchMethodAtom */
|
js_noSuchMethod_str, /* noSuchMethodAtom */
|
||||||
js_proto_str, /* protoAtom */
|
js_proto_str, /* protoAtom */
|
||||||
js_set_str, /* setAtom */
|
js_set_str, /* setAtom */
|
||||||
|
js_source_str, /* sourceAtom */
|
||||||
js_stack_str, /* stackAtom */
|
js_stack_str, /* stackAtom */
|
||||||
|
js_sticky_str, /* stickyAtom */
|
||||||
js_toLocaleString_str, /* toLocaleStringAtom */
|
js_toLocaleString_str, /* toLocaleStringAtom */
|
||||||
js_toSource_str, /* toSourceAtom */
|
js_toSource_str, /* toSourceAtom */
|
||||||
js_toString_str, /* toStringAtom */
|
js_toString_str, /* toStringAtom */
|
||||||
|
@ -224,12 +230,16 @@ const char js_eval_str[] = "eval";
|
||||||
const char js_fileName_str[] = "fileName";
|
const char js_fileName_str[] = "fileName";
|
||||||
const char js_get_str[] = "get";
|
const char js_get_str[] = "get";
|
||||||
const char js_getter_str[] = "getter";
|
const char js_getter_str[] = "getter";
|
||||||
|
const char js_global_str[] = "global";
|
||||||
|
const char js_ignoreCase_str[] = "ignoreCase";
|
||||||
const char js_index_str[] = "index";
|
const char js_index_str[] = "index";
|
||||||
const char js_input_str[] = "input";
|
const char js_input_str[] = "input";
|
||||||
const char js_iterator_str[] = "__iterator__";
|
const char js_iterator_str[] = "__iterator__";
|
||||||
|
const char js_lastIndex_str[] = "lastIndex";
|
||||||
const char js_length_str[] = "length";
|
const char js_length_str[] = "length";
|
||||||
const char js_lineNumber_str[] = "lineNumber";
|
const char js_lineNumber_str[] = "lineNumber";
|
||||||
const char js_message_str[] = "message";
|
const char js_message_str[] = "message";
|
||||||
|
const char js_multiline_str[] = "multiline";
|
||||||
const char js_name_str[] = "name";
|
const char js_name_str[] = "name";
|
||||||
const char js_next_str[] = "next";
|
const char js_next_str[] = "next";
|
||||||
const char js_noSuchMethod_str[] = "__noSuchMethod__";
|
const char js_noSuchMethod_str[] = "__noSuchMethod__";
|
||||||
|
@ -237,7 +247,9 @@ const char js_object_str[] = "object";
|
||||||
const char js_proto_str[] = "__proto__";
|
const char js_proto_str[] = "__proto__";
|
||||||
const char js_setter_str[] = "setter";
|
const char js_setter_str[] = "setter";
|
||||||
const char js_set_str[] = "set";
|
const char js_set_str[] = "set";
|
||||||
|
const char js_source_str[] = "source";
|
||||||
const char js_stack_str[] = "stack";
|
const char js_stack_str[] = "stack";
|
||||||
|
const char js_sticky_str[] = "sticky";
|
||||||
const char js_toSource_str[] = "toSource";
|
const char js_toSource_str[] = "toSource";
|
||||||
const char js_toString_str[] = "toString";
|
const char js_toString_str[] = "toString";
|
||||||
const char js_toLocaleString_str[] = "toLocaleString";
|
const char js_toLocaleString_str[] = "toLocaleString";
|
||||||
|
|
|
@ -250,18 +250,24 @@ struct JSAtomState {
|
||||||
JSAtom *evalAtom;
|
JSAtom *evalAtom;
|
||||||
JSAtom *fileNameAtom;
|
JSAtom *fileNameAtom;
|
||||||
JSAtom *getAtom;
|
JSAtom *getAtom;
|
||||||
|
JSAtom *globalAtom;
|
||||||
|
JSAtom *ignoreCaseAtom;
|
||||||
JSAtom *indexAtom;
|
JSAtom *indexAtom;
|
||||||
JSAtom *inputAtom;
|
JSAtom *inputAtom;
|
||||||
JSAtom *iteratorAtom;
|
JSAtom *iteratorAtom;
|
||||||
|
JSAtom *lastIndexAtom;
|
||||||
JSAtom *lengthAtom;
|
JSAtom *lengthAtom;
|
||||||
JSAtom *lineNumberAtom;
|
JSAtom *lineNumberAtom;
|
||||||
JSAtom *messageAtom;
|
JSAtom *messageAtom;
|
||||||
|
JSAtom *multilineAtom;
|
||||||
JSAtom *nameAtom;
|
JSAtom *nameAtom;
|
||||||
JSAtom *nextAtom;
|
JSAtom *nextAtom;
|
||||||
JSAtom *noSuchMethodAtom;
|
JSAtom *noSuchMethodAtom;
|
||||||
JSAtom *protoAtom;
|
JSAtom *protoAtom;
|
||||||
JSAtom *setAtom;
|
JSAtom *setAtom;
|
||||||
|
JSAtom *sourceAtom;
|
||||||
JSAtom *stackAtom;
|
JSAtom *stackAtom;
|
||||||
|
JSAtom *stickyAtom;
|
||||||
JSAtom *toLocaleStringAtom;
|
JSAtom *toLocaleStringAtom;
|
||||||
JSAtom *toSourceAtom;
|
JSAtom *toSourceAtom;
|
||||||
JSAtom *toStringAtom;
|
JSAtom *toStringAtom;
|
||||||
|
@ -393,12 +399,16 @@ extern const char js_eval_str[];
|
||||||
extern const char js_fileName_str[];
|
extern const char js_fileName_str[];
|
||||||
extern const char js_get_str[];
|
extern const char js_get_str[];
|
||||||
extern const char js_getter_str[];
|
extern const char js_getter_str[];
|
||||||
|
extern const char js_global_str[];
|
||||||
|
extern const char js_ignoreCase_str[];
|
||||||
extern const char js_index_str[];
|
extern const char js_index_str[];
|
||||||
extern const char js_input_str[];
|
extern const char js_input_str[];
|
||||||
extern const char js_iterator_str[];
|
extern const char js_iterator_str[];
|
||||||
|
extern const char js_lastIndex_str[];
|
||||||
extern const char js_length_str[];
|
extern const char js_length_str[];
|
||||||
extern const char js_lineNumber_str[];
|
extern const char js_lineNumber_str[];
|
||||||
extern const char js_message_str[];
|
extern const char js_message_str[];
|
||||||
|
extern const char js_multiline_str[];
|
||||||
extern const char js_name_str[];
|
extern const char js_name_str[];
|
||||||
extern const char js_namespace_str[];
|
extern const char js_namespace_str[];
|
||||||
extern const char js_next_str[];
|
extern const char js_next_str[];
|
||||||
|
@ -410,8 +420,10 @@ extern const char js_qualifier_str[];
|
||||||
extern const char js_send_str[];
|
extern const char js_send_str[];
|
||||||
extern const char js_setter_str[];
|
extern const char js_setter_str[];
|
||||||
extern const char js_set_str[];
|
extern const char js_set_str[];
|
||||||
|
extern const char js_source_str[];
|
||||||
extern const char js_space_str[];
|
extern const char js_space_str[];
|
||||||
extern const char js_stack_str[];
|
extern const char js_stack_str[];
|
||||||
|
extern const char js_sticky_str[];
|
||||||
extern const char js_stago_str[];
|
extern const char js_stago_str[];
|
||||||
extern const char js_star_str[];
|
extern const char js_star_str[];
|
||||||
extern const char js_starQualifier_str[];
|
extern const char js_starQualifier_str[];
|
||||||
|
|
|
@ -5128,19 +5128,53 @@ lastIndex_setter(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
|
||||||
return SetRegExpLastIndex(cx, obj, lastIndex);
|
return SetRegExpLastIndex(cx, obj, lastIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define REGEXP_PROP_ATTRS (JSPROP_PERMANENT | JSPROP_SHARED)
|
static JSBool
|
||||||
#define RO_REGEXP_PROP_ATTRS (REGEXP_PROP_ATTRS | JSPROP_READONLY)
|
regexp_resolve(JSContext *cx, JSObject *obj, jsid id, uintN flags, JSObject **objp)
|
||||||
|
{
|
||||||
|
JS_ASSERT(obj->isRegExp());
|
||||||
|
|
||||||
static JSPropertySpec regexp_props[] = {
|
if (!JSID_IS_ATOM(id))
|
||||||
{"source", 0, RO_REGEXP_PROP_ATTRS, source_getter, NULL},
|
return JS_TRUE;
|
||||||
{"global", 0, RO_REGEXP_PROP_ATTRS, global_getter, NULL},
|
|
||||||
{"ignoreCase", 0, RO_REGEXP_PROP_ATTRS, ignoreCase_getter, NULL},
|
if (id == ATOM_TO_JSID(cx->runtime->atomState.lastIndexAtom)) {
|
||||||
{"lastIndex", 0, REGEXP_PROP_ATTRS, lastIndex_getter,
|
if (!js_DefineNativeProperty(cx, obj, id, JSVAL_VOID,
|
||||||
lastIndex_setter},
|
lastIndex_getter, lastIndex_setter,
|
||||||
{"multiline", 0, RO_REGEXP_PROP_ATTRS, multiline_getter, NULL},
|
JSPROP_PERMANENT | JSPROP_SHARED, 0, 0, NULL)) {
|
||||||
{"sticky", 0, RO_REGEXP_PROP_ATTRS, sticky_getter, NULL},
|
return JS_FALSE;
|
||||||
{0,0,0,0,0}
|
}
|
||||||
};
|
*objp = obj;
|
||||||
|
return JS_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct LazyProp {
|
||||||
|
const char *name;
|
||||||
|
uint16 atomOffset;
|
||||||
|
JSPropertyOp getter;
|
||||||
|
} props[] = {
|
||||||
|
{ js_source_str, ATOM_OFFSET(source), source_getter },
|
||||||
|
{ js_global_str, ATOM_OFFSET(global), global_getter },
|
||||||
|
{ js_ignoreCase_str, ATOM_OFFSET(ignoreCase), ignoreCase_getter },
|
||||||
|
{ js_multiline_str, ATOM_OFFSET(multiline), multiline_getter },
|
||||||
|
{ js_sticky_str, ATOM_OFFSET(sticky), sticky_getter }
|
||||||
|
};
|
||||||
|
|
||||||
|
for (size_t i = 0; i < JS_ARRAY_LENGTH(props); i++) {
|
||||||
|
const LazyProp &lazy = props[i];
|
||||||
|
JSAtom *atom = OFFSET_TO_ATOM(cx->runtime, lazy.atomOffset);
|
||||||
|
if (id == ATOM_TO_JSID(atom)) {
|
||||||
|
if (!js_DefineNativeProperty(cx, obj, id, JSVAL_VOID,
|
||||||
|
lazy.getter, NULL,
|
||||||
|
JSPROP_PERMANENT | JSPROP_SHARED | JSPROP_READONLY,
|
||||||
|
0, 0, NULL)) {
|
||||||
|
return JS_FALSE;
|
||||||
|
}
|
||||||
|
*objp = obj;
|
||||||
|
return JS_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return JS_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* RegExp class static properties and their Perl counterparts:
|
* RegExp class static properties and their Perl counterparts:
|
||||||
|
@ -5266,12 +5300,11 @@ DEFINE_STATIC_SETTER(static_multiline_setter,
|
||||||
return false;
|
return false;
|
||||||
res->multiline = JSVAL_TO_BOOLEAN(*vp))
|
res->multiline = JSVAL_TO_BOOLEAN(*vp))
|
||||||
|
|
||||||
#define REGEXP_STATIC_PROP_ATTRS (REGEXP_PROP_ATTRS | JSPROP_ENUMERATE)
|
const uint8 REGEXP_STATIC_PROP_ATTRS = JSPROP_PERMANENT | JSPROP_SHARED | JSPROP_ENUMERATE;
|
||||||
#define RO_REGEXP_STATIC_PROP_ATTRS (REGEXP_STATIC_PROP_ATTRS | JSPROP_READONLY)
|
const uint8 RO_REGEXP_STATIC_PROP_ATTRS = REGEXP_STATIC_PROP_ATTRS | JSPROP_READONLY;
|
||||||
|
|
||||||
static JSPropertySpec regexp_static_props[] = {
|
static JSPropertySpec regexp_static_props[] = {
|
||||||
{"input", 0, REGEXP_STATIC_PROP_ATTRS, static_input_getter,
|
{"input", 0, REGEXP_STATIC_PROP_ATTRS, static_input_getter, static_input_setter},
|
||||||
static_input_setter},
|
|
||||||
{"multiline", 0, REGEXP_STATIC_PROP_ATTRS, static_multiline_getter,
|
{"multiline", 0, REGEXP_STATIC_PROP_ATTRS, static_multiline_getter,
|
||||||
static_multiline_setter},
|
static_multiline_setter},
|
||||||
{"lastMatch", 0, RO_REGEXP_STATIC_PROP_ATTRS, static_lastMatch_getter, NULL},
|
{"lastMatch", 0, RO_REGEXP_STATIC_PROP_ATTRS, static_lastMatch_getter, NULL},
|
||||||
|
@ -5366,12 +5399,12 @@ regexp_trace(JSTracer *trc, JSObject *obj)
|
||||||
|
|
||||||
JSClass js_RegExpClass = {
|
JSClass js_RegExpClass = {
|
||||||
js_RegExp_str,
|
js_RegExp_str,
|
||||||
JSCLASS_HAS_PRIVATE |
|
JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE |
|
||||||
JSCLASS_HAS_RESERVED_SLOTS(JSObject::REGEXP_FIXED_RESERVED_SLOTS) |
|
JSCLASS_HAS_RESERVED_SLOTS(JSObject::REGEXP_FIXED_RESERVED_SLOTS) |
|
||||||
JSCLASS_MARK_IS_TRACE | JSCLASS_HAS_CACHED_PROTO(JSProto_RegExp),
|
JSCLASS_MARK_IS_TRACE | JSCLASS_HAS_CACHED_PROTO(JSProto_RegExp),
|
||||||
JS_PropertyStub, JS_PropertyStub,
|
JS_PropertyStub, JS_PropertyStub,
|
||||||
JS_PropertyStub, JS_PropertyStub,
|
JS_PropertyStub, JS_PropertyStub,
|
||||||
JS_EnumerateStub, JS_ResolveStub,
|
JS_EnumerateStub, reinterpret_cast<JSResolveOp>(regexp_resolve),
|
||||||
JS_ConvertStub, regexp_finalize,
|
JS_ConvertStub, regexp_finalize,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
regexp_call, NULL,
|
regexp_call, NULL,
|
||||||
|
@ -5718,8 +5751,7 @@ JSObject *
|
||||||
js_InitRegExpClass(JSContext *cx, JSObject *obj)
|
js_InitRegExpClass(JSContext *cx, JSObject *obj)
|
||||||
{
|
{
|
||||||
JSObject *proto = js_InitClass(cx, obj, NULL, &js_RegExpClass, RegExp, 1,
|
JSObject *proto = js_InitClass(cx, obj, NULL, &js_RegExpClass, RegExp, 1,
|
||||||
regexp_props, regexp_methods,
|
NULL, regexp_methods, regexp_static_props, NULL);
|
||||||
regexp_static_props, NULL);
|
|
||||||
if (!proto)
|
if (!proto)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче