[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