Bug 790349 - Define keywords with a higher-order macro. r=jorendorff

--HG--
extra : rebase_source : 728450bd46473d7d741c119ecfcf4c3c3f98cbad
This commit is contained in:
Jeff Walden 2012-09-10 13:27:18 -07:00
parent a546087964
commit de64264fdd
5 changed files with 99 additions and 83 deletions

View File

@ -830,8 +830,8 @@ ifneq (,$(IMPORT_LIBRARY))
endif
$(MAKE) -C shell install
# Extra dependancies and rules for auto-generated headers
host_jskwgen.$(OBJ_SUFFIX): jsversion.h jskeyword.tbl
# Extra dependencies and rules for auto-generated headers
host_jskwgen.$(OBJ_SUFFIX): jsversion.h vm/Keywords.h
# Use CURDIR to avoid finding a jsautokw.h in the source tree (from a
# previous build?) via VPATH when we're building in a separate tree.

View File

@ -32,6 +32,7 @@
#include "frontend/Parser.h"
#include "frontend/TokenStream.h"
#include "vm/Keywords.h"
#include "vm/RegExpObject.h"
#include "vm/StringBuffer.h"
@ -46,10 +47,10 @@ using namespace js::frontend;
using namespace js::unicode;
static const KeywordInfo keywords[] = {
#define JS_KEYWORD(keyword, type, op, version) \
#define KEYWORD_INFO(keyword, name, type, op, version) \
{js_##keyword##_str, type, op, version},
#include "jskeyword.tbl"
#undef JS_KEYWORD
FOR_EACH_JAVASCRIPT_KEYWORD(KEYWORD_INFO)
#undef KEYWORD_INFO
};
const KeywordInfo *

View File

@ -1,75 +0,0 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* vim: set sw=4 ts=8 et tw=80:
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
JS_KEYWORD(false, TOK_FALSE, JSOP_FALSE, JSVERSION_DEFAULT)
JS_KEYWORD(true, TOK_TRUE, JSOP_TRUE, JSVERSION_DEFAULT)
JS_KEYWORD(null, TOK_NULL, JSOP_NULL, JSVERSION_DEFAULT)
/* ES5 Keywords. */
JS_KEYWORD(break, TOK_BREAK, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(case, TOK_CASE, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(catch, TOK_CATCH, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(continue, TOK_CONTINUE, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(debugger, TOK_DEBUGGER, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(default, TOK_DEFAULT, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(delete, TOK_DELETE, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(do, TOK_DO, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(else, TOK_ELSE, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(finally, TOK_FINALLY, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(for, TOK_FOR, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(function, TOK_FUNCTION, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(if, TOK_IF, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(in, TOK_IN, JSOP_IN, JSVERSION_DEFAULT)
JS_KEYWORD(instanceof, TOK_INSTANCEOF, JSOP_INSTANCEOF,JSVERSION_DEFAULT)
JS_KEYWORD(new, TOK_NEW, JSOP_NEW, JSVERSION_DEFAULT)
JS_KEYWORD(return, TOK_RETURN, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(switch, TOK_SWITCH, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(this, TOK_THIS, JSOP_THIS, JSVERSION_DEFAULT)
JS_KEYWORD(throw, TOK_THROW, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(try, TOK_TRY, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(typeof, TOK_TYPEOF, JSOP_TYPEOF, JSVERSION_DEFAULT)
JS_KEYWORD(var, TOK_VAR, JSOP_DEFVAR, JSVERSION_DEFAULT)
JS_KEYWORD(void, TOK_VOID, JSOP_VOID, JSVERSION_DEFAULT)
JS_KEYWORD(while, TOK_WHILE, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(with, TOK_WITH, JSOP_NOP, JSVERSION_DEFAULT)
/* ES5 reserved keywords reserved in all code. */
JS_KEYWORD(class, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(enum, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(extends, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(super, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
/*
* ES5 reserved keywords with long-implemented behavior, allowed in our
* implementation to ease code migration.
*/
#if JS_HAS_CONST
JS_KEYWORD(const, TOK_CONST, JSOP_DEFCONST, JSVERSION_DEFAULT)
#else
JS_KEYWORD(const, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
#endif
#if JS_HAS_BLOCK_SCOPE
JS_KEYWORD(let, TOK_LET, JSOP_NOP, JSVERSION_1_7)
#else
JS_KEYWORD(let, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_1_7)
#endif
#if JS_HAS_GENERATORS
JS_KEYWORD(yield, TOK_YIELD, JSOP_NOP, JSVERSION_1_7)
#else
JS_KEYWORD(yield, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_1_7)
#endif
JS_KEYWORD(export, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(import, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
/* ES5 future reserved keywords in strict mode. */
JS_KEYWORD(implements, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(interface, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(package, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(private, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(protected, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(public, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
JS_KEYWORD(static, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)

View File

@ -15,10 +15,12 @@
#include "jsversion.h"
#include "vm/Keywords.h"
const char * const keyword_list[] = {
#define JS_KEYWORD(keyword, type, op, version) #keyword,
#include "jskeyword.tbl"
#undef JS_KEYWORD
#define KEYWORD_STRING(keyword, name, type, op, version) #keyword,
FOR_EACH_JAVASCRIPT_KEYWORD(KEYWORD_STRING)
#undef KEYWORD_STRING
};
struct gen_opt {

88
js/src/vm/Keywords.h Normal file
View File

@ -0,0 +1,88 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* vim: set sw=4 ts=8 et tw=80:
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* A higher-order macro for enumerating keyword tokens. */
#ifndef Keywords_h_
#define Keywords_h_
#include "jsversion.h"
#if JS_HAS_CONST
# define FOR_CONST_KEYWORD(macro) \
macro(const, const_, TOK_CONST, JSOP_DEFCONST, JSVERSION_DEFAULT)
#else
# define FOR_CONST_KEYWORD(macro) \
macro(const, const_, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
#endif
#if JS_HAS_BLOCK_SCOPE
# define FOR_LET_KEYWORD(macro) \
macro(let, let, TOK_LET, JSOP_NOP, JSVERSION_1_7)
#else
# define FOR_LET_KEYWORD(macro) \
macro(let, let, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_1_7)
#endif
#if JS_HAS_GENERATORS
# define FOR_YIELD_KEYWORD(macro) \
macro(yield, yield, TOK_YIELD, JSOP_NOP, JSVERSION_1_7)
#else
# define FOR_YIELD_KEYWORD(macro) \
macro(yield, yield, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_1_7)
#endif
#define FOR_EACH_JAVASCRIPT_KEYWORD(macro) \
macro(false, false_, TOK_FALSE, JSOP_FALSE, JSVERSION_DEFAULT) \
macro(true, true_, TOK_TRUE, JSOP_TRUE, JSVERSION_DEFAULT) \
macro(null, null, TOK_NULL, JSOP_NULL, JSVERSION_DEFAULT) \
/* ES5 Keywords. */ \
macro(break, break_, TOK_BREAK, JSOP_NOP, JSVERSION_DEFAULT) \
macro(case, case_, TOK_CASE, JSOP_NOP, JSVERSION_DEFAULT) \
macro(catch, catch_, TOK_CATCH, JSOP_NOP, JSVERSION_DEFAULT) \
macro(continue, continue_, TOK_CONTINUE, JSOP_NOP, JSVERSION_DEFAULT) \
macro(debugger, debugger, TOK_DEBUGGER, JSOP_NOP, JSVERSION_DEFAULT) \
macro(default, default_, TOK_DEFAULT, JSOP_NOP, JSVERSION_DEFAULT) \
macro(delete, delete_, TOK_DELETE, JSOP_NOP, JSVERSION_DEFAULT) \
macro(do, do_, TOK_DO, JSOP_NOP, JSVERSION_DEFAULT) \
macro(else, else_, TOK_ELSE, JSOP_NOP, JSVERSION_DEFAULT) \
macro(finally, finally_, TOK_FINALLY, JSOP_NOP, JSVERSION_DEFAULT) \
macro(for, for_, TOK_FOR, JSOP_NOP, JSVERSION_DEFAULT) \
macro(function, function, TOK_FUNCTION, JSOP_NOP, JSVERSION_DEFAULT) \
macro(if, if_, TOK_IF, JSOP_NOP, JSVERSION_DEFAULT) \
macro(in, in, TOK_IN, JSOP_IN, JSVERSION_DEFAULT) \
macro(instanceof, instanceof, TOK_INSTANCEOF, JSOP_INSTANCEOF,JSVERSION_DEFAULT) \
macro(new, new_, TOK_NEW, JSOP_NEW, JSVERSION_DEFAULT) \
macro(return, return_, TOK_RETURN, JSOP_NOP, JSVERSION_DEFAULT) \
macro(switch, switch_, TOK_SWITCH, JSOP_NOP, JSVERSION_DEFAULT) \
macro(this, this_, TOK_THIS, JSOP_THIS, JSVERSION_DEFAULT) \
macro(throw, throw_, TOK_THROW, JSOP_NOP, JSVERSION_DEFAULT) \
macro(try, try_, TOK_TRY, JSOP_NOP, JSVERSION_DEFAULT) \
macro(typeof, typeof, TOK_TYPEOF, JSOP_TYPEOF, JSVERSION_DEFAULT) \
macro(var, var, TOK_VAR, JSOP_DEFVAR, JSVERSION_DEFAULT) \
macro(void, void_, TOK_VOID, JSOP_VOID, JSVERSION_DEFAULT) \
macro(while, while_, TOK_WHILE, JSOP_NOP, JSVERSION_DEFAULT) \
macro(with, with, TOK_WITH, JSOP_NOP, JSVERSION_DEFAULT) \
/* ES5 reserved keywords reserved in all code. */ \
macro(class, class_, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
macro(enum, enum_, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
macro(export, export, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
macro(extends, extends, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
macro(import, import, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
macro(super, super, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
/* ES5 future reserved keywords in strict mode. */ \
macro(implements, implements, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
macro(interface, interface, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
macro(package, package, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
macro(private, private_, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
macro(protected, protected_, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
macro(public, public_, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
macro(static, static_, TOK_STRICT_RESERVED, JSOP_NOP, JSVERSION_DEFAULT) \
/* Various conditional keywords. */ \
FOR_CONST_KEYWORD(macro) \
FOR_LET_KEYWORD(macro) \
FOR_YIELD_KEYWORD(macro)
#endif /* Keywords_h_ */