[Pkg-mozext-commits] [adblock-plus] 46/464: Now with reified token values.
David Prévot
taffit at moszumanska.debian.org
Tue Jul 22 20:44:01 UTC 2014
This is an automated email from the git hooks/post-receive script.
taffit pushed a commit to branch master
in repository adblock-plus.
commit 7fb0d069a53fea12f0967870dc931a3a010478d7
Author: Joshua Cranmer <Pidgeot18 at gmail.com>
Date: Mon Aug 3 18:22:53 2009 -0400
Now with reified token values.
---
jshydra.cpp | 93 +++---------------------------------------------------
jshydra_bridge.cpp | 11 +++++++
jshydra_tokens.h | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++
utils/cleanast.js | 27 ++++++++--------
utils/dumpast.js | 28 ++++++++++++----
5 files changed, 136 insertions(+), 110 deletions(-)
diff --git a/jshydra.cpp b/jshydra.cpp
index f0f235d..5cec7a2 100644
--- a/jshydra.cpp
+++ b/jshydra.cpp
@@ -29,95 +29,10 @@ typedef enum TokenValue {
} TokenValue;
TokenValue tokens[] = {
- NULLARY, /*TOK_EOF*/
- ERROR, /*TOK_EOL*/
- UNARY, /*TOK_SEMI*/
- LIST, /*TOK_COMMA*/
- BINARY, /*TOK_ASSIGN*/
- TERNARY, /*TOK_HOOK*/
- NAME, /*TOK_COLON*/
- BINARY, /*TOK_OR*/
- BINARY, /*TOK_AND*/
- BINARY, /*TOK_BITOR*/
- BINARY, /*TOK_BITXOR*/
- BINARY, /*TOK_BITAND*/
- BINARY, /*TOK_EQOP*/
- BINARY, /*TOK_RELOP*/
- BINARY, /*TOK_SHOP*/
- BINARY, /*TOK_PLUS*/
- BINARY, /*TOK_MINUS*/
- BINARY, /*TOK_STAR*/
- BINARY, /*TOK_DIVOP*/
- UNARY, /*TOK_UNARYOP*/
- UNARY, /*TOK_INC*/
- UNARY, /*TOK_DEC*/
- NAME, /*TOK_DOT*/
- BINARY, /*TOK_LB*/
- LIST, /*TOK_RB*/
- LIST, /*TOK_LC*/
- LIST, /*TOK_RC*/
- LIST, /*TOK_LP*/
- UNARY, /*TOK_RP*/
- NAME, /*TOK_NAME*/
- DOUBLELITERAL, /*TOK_NUMBER*/
- NAME, /*TOK_STRING*/
- OBJLITERAL, /*TOK_REGEXP*/
- NULLARY, /*TOK_PRIMARY*/
- FUNCTION, /*TOK_FUNCTION*/
- TERNARY, /*TOK_IF*/
- ERROR, /*TOK_ELSE (not present) */
- BINARY, /*TOK_SWITCH*/
- BINARY, /*TOK_CASE*/
- BINARY, /*TOK_DEFAULT*/
- BINARY, /*TOK_WHILE*/
- BINARY, /*TOK_DO*/
- BINARY, /*TOK_FOR*/
- NAME, /*TOK_BREAK*/
- NAME, /*TOK_CONTINUE*/
- BINARY, /*TOK_IN*/
- LIST, /*TOK_VAR*/
- BINARY, /*TOK_WITH*/
- UNARY, /*TOK_RETURN*/
- LIST, /*TOK_NEW*/
- UNARY, /*TOK_DELETE*/
- UNARY, /*TOK_DEFSHARP*/
- NULLARY, /*TOK_USESHARP (use pn_num)*/
- TERNARY, /*TOK_TRY*/
- TERNARY, /*TOK_CATCH*/
- ERROR, /*TOK_FINALLY*/
- UNARY, /*TOK_THROW*/
- BINARY, /*TOK_INSTANCEOF*/
- ERROR, /*TOK_DEBUGGER*/
- ERROR, /*TOK_XMLSTAGO*/
- ERROR, /*TOK_XMLETAGO*/
- ERROR, /*TOK_XMLPTAGC*/
- ERROR, /*TOK_XMLTAGC*/
- ERROR, /*TOK_XMLNAME*/
- ERROR, /*TOK_XMLATTR*/
- ERROR, /*TOK_XMLSPACE*/
- ERROR, /*TOK_XMLTEXT*/
- ERROR, /*TOK_XMLCOMMENT*/
- ERROR, /*TOK_XMLCDATA*/
- ERROR, /*TOK_XMLPI*/
- ERROR, /*TOK_AT*/
- ERROR, /*TOK_DBLCOLON*/
- ERROR, /*TOK_ANYNAME*/
- NAME, /*TOK_DBLDOT*/
- ERROR, /*TOK_FILTER*/
- ERROR, /*TOK_XMLELEM*/
- ERROR, /*TOK_XMLLIST*/
- ERROR, /*TOK_YIELD*/
- LIST, /*TOK_ARRAYCOMP*/
- UNARY, /*TOK_ARRAYPUSH*/
- LEXICAL, /*TOK_LEXICALSCOPE*/
- LIST, /*TOK_LET*/
- ERROR, /*TOK_SEQ*/
- TERNARY, /*TOK_FORHEAD*/
- LIST, /*TOK_ARGSBODY */
- NAMESET, /*TOK_UPVARS */
- LIST, /*TOK_RESERVED [I don't understand this...] */
- //TOK_LIMIT
- ERROR
+#define TOK(name, value) value,
+#include "jshydra_tokens.h"
+#undef TOK
+ ERROR //TOK_LIMIT
};
TokenValue arityFix[] = {NULLARY, UNARY, BINARY, TERNARY, FUNCTION, LIST, NAME};
diff --git a/jshydra_bridge.cpp b/jshydra_bridge.cpp
index 8461d03..fbf8c19 100644
--- a/jshydra_bridge.cpp
+++ b/jshydra_bridge.cpp
@@ -16,6 +16,13 @@ static const char *opcodes[] = {
NULL
};
+static const char *tokens[] = {
+#define TOK(name, value) #name,
+#include "jshydra_tokens.h"
+#undef TOK
+ NULL
+};
+
JSRuntime *rt;
JSContext *cx;
JSObject *globalObj;
@@ -102,6 +109,10 @@ void jshydra_init(const char *file) {
while (*name) {
jshydra_defineProperty(cx, globalObj, *name++, INT_TO_JSVAL(index++));
}
+ index = 0;
+ name = tokens;
+ while (*name)
+ jshydra_defineProperty(cx, globalObj, *name++, INT_TO_JSVAL(index++));
rootArray = JS_NewArrayObject(cx, 0, NULL);
JS_AddRoot(cx, &rootArray);
diff --git a/jshydra_tokens.h b/jshydra_tokens.h
new file mode 100644
index 0000000..d6a2722
--- /dev/null
+++ b/jshydra_tokens.h
@@ -0,0 +1,87 @@
+TOK(TOK_EOF, NULLARY)
+TOK(TOK_EOL, ERROR)
+TOK(TOK_SEMI, UNARY)
+TOK(TOK_COMMA, LIST)
+TOK(TOK_ASSIGN, BINARY)
+TOK(TOK_HOOK, TERNARY)
+TOK(TOK_COLON, NAME)
+TOK(TOK_OR, BINARY)
+TOK(TOK_AND, BINARY)
+TOK(TOK_BITOR, BINARY)
+TOK(TOK_BITXOR, BINARY)
+TOK(TOK_BITAND, BINARY)
+TOK(TOK_EQOP, BINARY)
+TOK(TOK_RELOP, BINARY)
+TOK(TOK_SHOP, BINARY)
+TOK(TOK_PLUS, BINARY)
+TOK(TOK_MINUS, BINARY)
+TOK(TOK_STAR, BINARY)
+TOK(TOK_DIVOP, BINARY)
+TOK(TOK_UNARYOP, UNARY)
+TOK(TOK_INC, UNARY)
+TOK(TOK_DEC, UNARY)
+TOK(TOK_DOT, NAME)
+TOK(TOK_LB, BINARY)
+TOK(TOK_RB, LIST)
+TOK(TOK_LC, LIST)
+TOK(TOK_RC, LIST)
+TOK(TOK_LP, LIST)
+TOK(TOK_RP, UNARY)
+TOK(TOK_NAME, NAME)
+TOK(TOK_NUMBER, DOUBLELITERAL)
+TOK(TOK_STRING, NAME)
+TOK(TOK_REGEXP, OBJLITERAL)
+TOK(TOK_PRIMARY, NULLARY)
+TOK(TOK_FUNCTION, FUNCTION)
+TOK(TOK_IF, TERNARY)
+TOK(TOK_ELSE, ERROR) /* (not present) */
+TOK(TOK_SWITCH, BINARY)
+TOK(TOK_CASE, BINARY)
+TOK(TOK_DEFAULT, BINARY)
+TOK(TOK_WHILE, BINARY)
+TOK(TOK_DO, BINARY)
+TOK(TOK_FOR, BINARY)
+TOK(TOK_BREAK, NAME)
+TOK(TOK_CONTINUE, NAME)
+TOK(TOK_IN, BINARY)
+TOK(TOK_VAR, LIST)
+TOK(TOK_WITH, BINARY)
+TOK(TOK_RETURN, UNARY)
+TOK(TOK_NEW, LIST)
+TOK(TOK_DELETE, UNARY)
+TOK(TOK_DEFSHARP, UNARY)
+TOK(TOK_USESHARP, NULLARY) /*(use pn_num)*/
+TOK(TOK_TRY, TERNARY)
+TOK(TOK_CATCH, TERNARY)
+TOK(TOK_FINALLY, ERROR)
+TOK(TOK_THROW, UNARY)
+TOK(TOK_INSTANCEOF, BINARY)
+TOK(TOK_DEBUGGER, ERROR)
+TOK(TOK_XMLSTAGO, ERROR)
+TOK(TOK_XMLETAGO, ERROR)
+TOK(TOK_XMLPTAGC, ERROR)
+TOK(TOK_XMLTAGC, ERROR)
+TOK(TOK_XMLNAME, ERROR)
+TOK(TOK_XMLATTR, ERROR)
+TOK(TOK_XMLSPACE, ERROR)
+TOK(TOK_XMLTEXT, ERROR)
+TOK(TOK_XMLCOMMENT, ERROR)
+TOK(TOK_XMLCDATA, ERROR)
+TOK(TOK_XMLPI, ERROR)
+TOK(TOK_AT, ERROR)
+TOK(TOK_DBLCOLON, ERROR)
+TOK(TOK_ANYNAME, ERROR)
+TOK(TOK_DBLDOT, NAME)
+TOK(TOK_FILTER, ERROR)
+TOK(TOK_XMLELEM, ERROR)
+TOK(TOK_XMLLIST, ERROR)
+TOK(TOK_YIELD, ERROR)
+TOK(TOK_ARRAYCOMP, LIST)
+TOK(TOK_ARRAYPUSH, UNARY)
+TOK(TOK_LEXICALSCOPE, LEXICAL)
+TOK(TOK_LET, LIST)
+TOK(TOK_SEQ, ERROR)
+TOK(TOK_FORHEAD, TERNARY)
+TOK(TOK_ARGSBODY, LIST)
+TOK(TOK_UPVARS, NAMESET)
+TOK(TOK_RESERVED, LIST) /*[I don't understand this...]*/
diff --git a/utils/cleanast.js b/utils/cleanast.js
index e3f02d8..5e91276 100644
--- a/utils/cleanast.js
+++ b/utils/cleanast.js
@@ -14,8 +14,7 @@
* Takes the node rooted at the AST and decomposes it into readable sections.
*/
function clean_ast(ast) {
- // TOK_LC
- assert(ast.type == 25);
+ assert(ast.type == TOK_LC);
let info = {
variables: [],
constants: [],
@@ -34,7 +33,7 @@ function clean_ast(ast) {
let ret = make_variables(statement);
info.constants = info.constants.concat(ret.vars);
info.objects = info.objects.concat(ret.objs);
- } else if (statement.type == 34) { // TOK_FUNCTION
+ } else if (statement.type == TOK_FUNCTION) {
info.functions.push(make_function(statement));
} else if (prototype_assign(statement)) {
let obj = make_class(statement);
@@ -86,10 +85,10 @@ function visit(root_ast, func, to_expand) {
}
function prototype_assign(statement) {
- if (statement.type != 2 || !statement.kids[0]) // TOK_SEMI
+ if (statement.type != TOK_SEMI || !statement.kids[0])
return false;
statement = statement.kids[0];
- if (statement.type != 4 || !statement.kids[0]) // TOK_ASSIGN
+ if (statement.type != TOK_ASSIGN || !statement.kids[0])
return false;
statement = statement.kids[0];
@@ -163,7 +162,7 @@ function make_variables(var_root) {
v.init = (name.kids.length > 0 ? name.kids[0] : null);
v.loc = get_location(var_root);
if (v.init && v.init.op == JSOP_NEWINIT && v.init.kids[0] &&
- v.init.kids[0].type == 6)
+ v.init.kids[0].type == TOK_COLON)
objects.push(make_object(v));
else
variables.push(v);
@@ -184,18 +183,18 @@ function make_object(stub) {
return stub;
}
for each (let init in ast.kids) {
- if (init.type != 6) {
+ if (init.type != TOK_COLON) {
dump_ast(init);
}
- assert(init.type == 6); // TOK_COLON
- if (init.kids[0].type == 29) { // TOK_NAME
+ assert(init.type == TOK_COLON);
+ if (init.kids[0].type == TOK_NAME) {
let name = init.kids[0].atom;
let value = init.kids[1];
if (init.op == JSOP_GETTER)
stub.getters[name] = make_function(value);
else if (init.op == JSOP_SETTER)
stub.setters[name] = make_function(value);
- else if (value.type == 34) // TOK_FUNCTION
+ else if (value.type == TOK_FUNCTION)
stub.functions[name] = make_function(value);
else if (name == '__proto__') {
let supername;
@@ -220,13 +219,13 @@ function make_object(stub) {
}
function make_function(func_root) {
- assert(func_root.type == 34); // TOK_FUNCTION
+ assert(func_root.type == TOK_FUNCTION);
let stmts = func_root.kids[0];
- if (stmts.type == 85) // TOK_UPVARS
+ if (stmts.type == TOK_UPVARS)
stmts = stmts.kids[0];
- if (stmts.type == 84) // TOK_ARGSBODY
+ if (stmts.type == TOK_ARGSBODY)
stmts = stmts.kids[stmts.kids.length - 1];
- assert(stmts.type == 25);
+ assert(stmts.type == TOK_LC);
return { name: func_root.name, body: stmts, loc: get_location(func_root)};
}
diff --git a/utils/dumpast.js b/utils/dumpast.js
index d87c89a..8548735 100644
--- a/utils/dumpast.js
+++ b/utils/dumpast.js
@@ -10,7 +10,8 @@ function dump_ast(ast, prefix) {
for (let key in ast) {
if (key == 'column' || key == 'line' || key == 'kids')
continue;
- let val = (key == 'op' ? decode_op(ast[key]) : ast[key]);
+ let val = (key == 'op' ? decode_op(ast[key]) :
+ key == 'type' ? decode_type(ast[key]) : ast[key]);
str += key + ": " + val + "; ";
}
str += ast.line + ":" + ast.column;
@@ -22,17 +23,30 @@ function dump_ast(ast, prefix) {
}
var global = this;
-var table = null;
+var optable = null, toktable;
function decode_op(opcode) {
- if (!table) {
- table = [];
+ if (!optable) {
+ optable = [];
for (let key in global) {
if (key.indexOf("JSOP_") == 0) {
- table[global[key]] = key;
+ optable[global[key]] = key;
}
}
}
- if (opcode in table)
- return table[opcode];
+ if (opcode in optable)
+ return optable[opcode];
+ return opcode;
+}
+function decode_type(opcode) {
+ if (!toktable) {
+ toktable = [];
+ for (let key in global) {
+ if (key.indexOf("TOK_") == 0) {
+ toktable[global[key]] = key;
+ }
+ }
+ }
+ if (opcode in toktable)
+ return toktable[opcode];
return opcode;
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/adblock-plus.git
More information about the Pkg-mozext-commits
mailing list