[javascriptlint-commit] SF.net SVN: javascriptlint: [167] trunk
Status: Beta
Brought to you by:
matthiasmiller
|
From: <mat...@us...> - 2008-03-04 15:15:19
|
Revision: 167
http://javascriptlint.svn.sourceforge.net/javascriptlint/?rev=167&view=rev
Author: matthiasmiller
Date: 2008-03-04 07:15:14 -0800 (Tue, 04 Mar 2008)
Log Message:
-----------
pyspidermonkey: change traverse_node to jsnode_to_pynode to clarify reference counting responsibilities
Modified Paths:
--------------
trunk/pyjsl/jsparse.py
trunk/pyspidermonkey/pyspidermonkey.c
Modified: trunk/pyjsl/jsparse.py
===================================================================
--- trunk/pyjsl/jsparse.py 2008-03-04 03:56:49 UTC (rev 166)
+++ trunk/pyjsl/jsparse.py 2008-03-04 15:15:14 UTC (rev 167)
@@ -212,9 +212,7 @@
def pop():
nodes.pop()
- roots = pyspidermonkey.traverse(script, _Node, _wrapped_callback)
- assert len(roots) == 1
- root_node = roots[0]
+ root_node = pyspidermonkey.parse(script, _Node, _wrapped_callback)
process(root_node)
comments = _parse_comments(script, root_node, positions, comment_ignore_ranges)
Modified: trunk/pyspidermonkey/pyspidermonkey.c
===================================================================
--- trunk/pyspidermonkey/pyspidermonkey.c 2008-03-04 03:56:49 UTC (rev 166)
+++ trunk/pyspidermonkey/pyspidermonkey.c 2008-03-04 15:15:14 UTC (rev 167)
@@ -50,14 +50,14 @@
*/
static PyObject*
-module_traverse(PyObject *self, PyObject *args);
+module_parse(PyObject *self, PyObject *args);
static PyObject*
is_compilable_unit(PyObject *self, PyObject *args);
static PyMethodDef module_methods[] = {
- {"traverse", module_traverse, METH_VARARGS,
- "Parses \"script\" and calls \"push\" and \"pop\" for each node."},
+ {"parse", module_parse, METH_VARARGS,
+ "Parses \"script\" and returns a tree of \"node_class\"."},
{"is_compilable_unit", is_compilable_unit, METH_VARARGS,
"Returns True if \"script\" is a compilable unit."},
@@ -160,8 +160,8 @@
}
/* returns 0 on success and -1 on failure */
-static int
-traverse_node(JSContext* context, JSParseNode* jsnode, PyObject* parent, PyObject* tuple, int node_offset) {
+static PyObject*
+jsnode_to_pynode(JSContext* context, JSParseNode* jsnode) {
JSContextData* data = JS_GetContextPrivate(context);
PyObject* pynode = NULL;
PyObject* kids = NULL;
@@ -170,8 +170,7 @@
if (!jsnode) {
Py_INCREF(Py_None);
- PyTuple_SET_ITEM(tuple, node_offset, Py_None);
- return 0;
+ return Py_None;
}
/* pass in a dictionary of options */
@@ -179,15 +178,14 @@
if (!pynode)
goto fail;
- PyTuple_SET_ITEM(tuple, node_offset, pynode);
-
- Py_INCREF(parent);
- if (PyObject_SetAttrString(pynode, "parent", parent) == -1)
+ Py_INCREF(Py_None);
+ if (PyObject_SetAttrString(pynode, "parent", Py_None) == -1)
goto fail;
+ Py_INCREF(Py_None);
+ if (PyObject_SetAttrString(pynode, "node_index", Py_None) == -1)
+ goto fail;
if (PyObject_SetAttrString(pynode, "kind", Py_BuildValue("i", TOK_TO_NUM(jsnode->pn_type))) == -1)
goto fail;
- if (PyObject_SetAttrString(pynode, "node_index", Py_BuildValue("i", node_offset)) == -1)
- goto fail;
/* pass the position */
if (PyObject_SetAttrString(pynode, "_start_line", Py_BuildValue("i", jsnode->pn_pos.begin.lineno-1)) == -1)
@@ -274,8 +272,7 @@
switch (jsnode->pn_arity) {
case PN_FUNC:
kids = PyTuple_New(1);
- if (traverse_node(context, jsnode->pn_body, pynode, kids, 0) == -1)
- return -1;
+ PyTuple_SET_ITEM(kids, 0, jsnode_to_pynode(context, jsnode->pn_body));
break;
case PN_LIST: {
@@ -283,40 +280,32 @@
int i;
kids = PyTuple_New(jsnode->pn_count);
for (i = 0, p = jsnode->pn_head; p; p = p->pn_next, i++) {
- if (traverse_node(context, p, pynode, kids, i) == -1)
- return -1;
+ PyTuple_SET_ITEM(kids, i, jsnode_to_pynode(context, p));
}
}
break;
case PN_TERNARY:
kids = PyTuple_New(3);
- if (traverse_node(context, jsnode->pn_kid1, pynode, kids, 0) == -1)
- return -1;
- if (traverse_node(context, jsnode->pn_kid2, pynode, kids, 1) == -1)
- return -1;
- if (traverse_node(context, jsnode->pn_kid3, pynode, kids, 2) == -1)
- return -1;
+ PyTuple_SET_ITEM(kids, 0, jsnode_to_pynode(context, jsnode->pn_kid1));
+ PyTuple_SET_ITEM(kids, 1, jsnode_to_pynode(context, jsnode->pn_kid2));
+ PyTuple_SET_ITEM(kids, 2, jsnode_to_pynode(context, jsnode->pn_kid3));
break;
case PN_BINARY:
kids = PyTuple_New(2);
- if (traverse_node(context, jsnode->pn_left, pynode, kids, 0) == -1)
- return -1;
- if (traverse_node(context, jsnode->pn_right, pynode, kids, 1) == -1)
- return -1;
+ PyTuple_SET_ITEM(kids, 0, jsnode_to_pynode(context, jsnode->pn_left));
+ PyTuple_SET_ITEM(kids, 1, jsnode_to_pynode(context, jsnode->pn_right));
break;
case PN_UNARY:
kids = PyTuple_New(1);
- if (traverse_node(context, jsnode->pn_kid, pynode, kids, 0) == -1)
- return -1;
+ PyTuple_SET_ITEM(kids, 0, jsnode_to_pynode(context, jsnode->pn_kid));
break;
case PN_NAME:
kids = PyTuple_New(1);
- if (traverse_node(context, jsnode->pn_expr, pynode, kids, 0) == -1)
- return -1;
+ PyTuple_SET_ITEM(kids, 0, jsnode_to_pynode(context, jsnode->pn_expr));
break;
case PN_NULLARY:
@@ -324,23 +313,43 @@
break;
}
+ if (!kids)
+ goto fail;
+
if (PyObject_SetAttrString(pynode, "kids", kids) == -1)
goto fail;
- return 0;
+ {
+ int i;
+ for (i = 0; i < PyTuple_GET_SIZE(kids); i++) {
+ PyObject* kid = PyTuple_GET_ITEM(kids, i);
+ if (!kid)
+ goto fail;
+ if (kid == Py_None)
+ continue;
+ Py_INCREF(pynode);
+ if (PyObject_SetAttrString(kid, "parent", pynode) == -1)
+ goto fail;
+ if (PyObject_SetAttrString(kid, "node_index", Py_BuildValue("i", i)) == -1)
+ goto fail;
+ }
+ }
+
+ return pynode;
+
fail:
if (pynode) {
Py_XDECREF(pynode);
}
- return -1;
+ return NULL;
}
static PyObject*
-module_traverse(PyObject *self, PyObject *args) {
+module_parse(PyObject *self, PyObject *args) {
struct {
const char* script;
- PyObject* kids;
+ PyObject* pynode;
JSRuntime* runtime;
JSContext* context;
@@ -414,8 +423,8 @@
goto cleanup;
}
- m.kids = PyTuple_New(1);
- if (traverse_node(m.context, m.jsnode, Py_None, m.kids, 0) == -1) {
+ m.pynode = jsnode_to_pynode(m.context, m.jsnode);
+ if (!m.pynode) {
error = "";
goto cleanup;
}
@@ -434,8 +443,7 @@
}
return NULL;
}
- Py_INCREF(m.kids);
- return m.kids;
+ return m.pynode;
}
static PyObject*
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|