Make reserved identifiers a strict warning, not an error (240317, r=shaver).

This commit is contained in:
brendan%mozilla.org 2005-01-12 05:18:17 +00:00
Родитель 38e3d448d9
Коммит 33a75c4caa
4 изменённых файлов: 53 добавлений и 23 удалений

Просмотреть файл

@ -3669,7 +3669,6 @@ PrimaryExpr(JSContext *cx, JSTokenStream *ts, JSTreeContext *tc)
{ {
JSTokenType tt; JSTokenType tt;
JSParseNode *pn, *pn2, *pn3; JSParseNode *pn, *pn2, *pn3;
char *badWord;
#if JS_HAS_GETTER_SETTER #if JS_HAS_GETTER_SETTER
JSAtom *atom; JSAtom *atom;
JSRuntime *rt; JSRuntime *rt;
@ -4032,15 +4031,6 @@ PrimaryExpr(JSContext *cx, JSTokenStream *ts, JSTreeContext *tc)
case TOK_EXPORT: case TOK_EXPORT:
case TOK_IMPORT: case TOK_IMPORT:
#endif #endif
case TOK_RESERVED:
badWord = js_DeflateString(cx, CURRENT_TOKEN(ts).ptr,
(size_t) CURRENT_TOKEN(ts).pos.end.index
- CURRENT_TOKEN(ts).pos.begin.index);
js_ReportCompileErrorNumber(cx, ts, JSREPORT_TS | JSREPORT_ERROR,
JSMSG_RESERVED_ID, badWord);
JS_free(cx, badWord);
return NULL;
case TOK_ERROR: case TOK_ERROR:
/* The scanner or one of its subroutines reported the error. */ /* The scanner or one of its subroutines reported the error. */
return NULL; return NULL;

Просмотреть файл

@ -75,6 +75,8 @@
#define RESERVE_JAVA_KEYWORDS #define RESERVE_JAVA_KEYWORDS
#define RESERVE_ECMA_KEYWORDS #define RESERVE_ECMA_KEYWORDS
#define MAX_KEYWORD_LENGTH 12
static struct keyword { static struct keyword {
const char *name; const char *name;
JSTokenType tokentype; /* JSTokenType */ JSTokenType tokentype; /* JSTokenType */
@ -176,10 +178,13 @@ JSBool
js_InitScanner(JSContext *cx) js_InitScanner(JSContext *cx)
{ {
struct keyword *kw; struct keyword *kw;
size_t length;
JSAtom *atom; JSAtom *atom;
for (kw = keywords; kw->name; kw++) { for (kw = keywords; kw->name; kw++) {
atom = js_Atomize(cx, kw->name, strlen(kw->name), ATOM_PINNED); length = strlen(kw->name);
JS_ASSERT(length <= MAX_KEYWORD_LENGTH);
atom = js_Atomize(cx, kw->name, length, ATOM_PINNED);
if (!atom) if (!atom)
return JS_FALSE; return JS_FALSE;
ATOM_SET_KEYWORD(atom, kw); ATOM_SET_KEYWORD(atom, kw);
@ -1267,8 +1272,20 @@ retry:
if (!hadUnicodeEscape && ATOM_KEYWORD(atom)) { if (!hadUnicodeEscape && ATOM_KEYWORD(atom)) {
struct keyword *kw = ATOM_KEYWORD(atom); struct keyword *kw = ATOM_KEYWORD(atom);
if (JS_VERSION_IS_ECMA(cx) || if (kw->tokentype == TOK_RESERVED) {
kw->version <= (cx->version & JSVERSION_MASK)) { char buf[MAX_KEYWORD_LENGTH + 1];
js_DeflateStringToBuffer(buf, TOKENBUF_BASE(),
TOKENBUF_LENGTH());
if (!js_ReportCompileErrorNumber(cx, ts,
JSREPORT_TS |
JSREPORT_WARNING |
JSREPORT_STRICT,
JSMSG_RESERVED_ID, buf)) {
goto error;
}
} else if (JS_VERSION_IS_ECMA(cx) ||
kw->version <= (cx->version & JSVERSION_MASK)) {
tt = kw->tokentype; tt = kw->tokentype;
tp->t_op = (JSOp) kw->op; tp->t_op = (JSOp) kw->op;
goto out; goto out;

Просмотреть файл

@ -551,12 +551,13 @@ str_enumerate(JSContext *cx, JSObject *obj)
} }
static JSBool static JSBool
str_resolve(JSContext *cx, JSObject *obj, jsval id) str_resolve(JSContext *cx, JSObject *obj, jsval id, uintN flags,
JSObject **objp)
{ {
JSString *str, *str1; JSString *str, *str1;
jsint slot; jsint slot;
if (!JSVAL_IS_INT(id)) if (!JSVAL_IS_INT(id) || (flags & JSRESOLVE_ASSIGNING))
return JS_TRUE; return JS_TRUE;
str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj)); str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
@ -572,15 +573,16 @@ str_resolve(JSContext *cx, JSObject *obj, jsval id)
STRING_ELEMENT_ATTRS, NULL)) { STRING_ELEMENT_ATTRS, NULL)) {
return JS_FALSE; return JS_FALSE;
} }
*objp = obj;
} }
return JS_TRUE; return JS_TRUE;
} }
JSClass js_StringClass = { JSClass js_StringClass = {
js_String_str, js_String_str,
JSCLASS_HAS_PRIVATE, JSCLASS_HAS_PRIVATE | JSCLASS_NEW_RESOLVE,
JS_PropertyStub, JS_PropertyStub, str_getProperty, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, str_getProperty, JS_PropertyStub,
str_enumerate, str_resolve, JS_ConvertStub, JS_FinalizeStub, str_enumerate, (JSResolveOp)str_resolve, JS_ConvertStub, JS_FinalizeStub,
JSCLASS_NO_OPTIONAL_MEMBERS JSCLASS_NO_OPTIONAL_MEMBERS
}; };
@ -2470,6 +2472,9 @@ js_NewDependentString(JSContext *cx, JSString *base, size_t start,
if (length == 0) if (length == 0)
return cx->runtime->emptyString; return cx->runtime->emptyString;
if (start == 0 && length == JSSTRING_LENGTH(base))
return base;
if (start > JSSTRDEP_START_MASK || if (start > JSSTRDEP_START_MASK ||
(start != 0 && length > JSSTRDEP_LENGTH_MASK)) { (start != 0 && length > JSSTRDEP_LENGTH_MASK)) {
return js_NewStringCopyN(cx, JSSTRING_CHARS(base) + start, length, return js_NewStringCopyN(cx, JSSTRING_CHARS(base) + start, length,
@ -2815,10 +2820,22 @@ js_InflateString(JSContext *cx, const char *bytes, size_t length)
return NULL; return NULL;
INFLATE_STRING_BODY INFLATE_STRING_BODY
return chars; return chars;
} }
#define DEFLATE_STRING_BODY \
for (i = 0; i < length; i++) \
bytes[i] = (char) chars[i]; \
bytes[i] = 0;
void
js_DeflateStringToBuffer(char *bytes, const jschar *chars, size_t length)
{
size_t i;
DEFLATE_STRING_BODY
}
/* /*
* May be called with null cx by js_GetStringBytes, see below. * May be called with null cx by js_GetStringBytes, see below.
*/ */
@ -2832,9 +2849,8 @@ js_DeflateString(JSContext *cx, const jschar *chars, size_t length)
bytes = (char *) (cx ? JS_malloc(cx, size) : malloc(size)); bytes = (char *) (cx ? JS_malloc(cx, size) : malloc(size));
if (!bytes) if (!bytes)
return NULL; return NULL;
for (i = 0; i < length; i++)
bytes[i] = (char) chars[i]; DEFLATE_STRING_BODY
bytes[i] = 0;
return bytes; return bytes;
} }
@ -2906,7 +2922,7 @@ js_GetStringBytes(JSString *str)
*bytes == (char) JSSTRING_CHARS(str)[0]); *bytes == (char) JSSTRING_CHARS(str)[0]);
} else { } else {
bytes = js_DeflateString(NULL, JSSTRING_CHARS(str), bytes = js_DeflateString(NULL, JSSTRING_CHARS(str),
JSSTRING_LENGTH(str)); JSSTRING_LENGTH(str));
if (bytes) { if (bytes) {
if (JS_HashTableRawAdd(cache, hep, hash, str, bytes)) { if (JS_HashTableRawAdd(cache, hep, hash, str, bytes)) {
#ifdef DEBUG #ifdef DEBUG

Просмотреть файл

@ -439,6 +439,13 @@ js_DeflateString(JSContext *cx, const jschar *chars, size_t length);
extern void extern void
js_InflateStringToBuffer(jschar *chars, const char *bytes, size_t length); js_InflateStringToBuffer(jschar *chars, const char *bytes, size_t length);
/*
* Deflate JS chars to bytes into a buffer.
* 'bytes' must be large enough for 'length'+1 chars.
*/
extern void
js_DeflateStringToBuffer(char *bytes, const jschar *chars, size_t length);
/* /*
* Associate bytes with str in the deflated string cache, returning true on * Associate bytes with str in the deflated string cache, returning true on
* successful association, false on out of memory. * successful association, false on out of memory.