summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog19
-rw-r--r--Makefile2
-rw-r--r--hash.c7
-rw-r--r--lib.c2
-rw-r--r--tests/009/json.expected2
-rw-r--r--tests/009/json.txr57
-rw-r--r--tests/009/webapp.json88
7 files changed, 175 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 3594ba75..2c819949 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2011-11-18 Kaz Kylheku <kaz@kylheku.com>
+
+ Added a JSON parsing test case. This flushed out a bug which crashed
+ the garbage collector (uninitialized fields in function objects).
+
+ * Makefile: Defined TXR_ARGS and TXR_OPTS for new test case.
+
+ * hash.c (hash_begin): Construction of cobj modified to obey
+ the correct procedure described in HACKING.
+
+ * lib.c (func_n3, func_n4): These functions neglected to initialize
+ the env member of the function structure.
+
+ * tests/009/json.expected: New file.
+
+ * tests/009/json.txr: New file.
+
+ * tests/009/webapp.json: New file.
+
2011-11-17 Kaz Kylheku <kaz@kylheku.com>
Task #11598.
diff --git a/Makefile b/Makefile
index 7d091c3f..c0fe27ee 100644
--- a/Makefile
+++ b/Makefile
@@ -89,6 +89,8 @@ tests/006/%: TXR_ARGS := $(top_srcdir)/tests/006/data
tests/008/tokenize.ok: TXR_ARGS := $(top_srcdir)/tests/008/data
tests/008/configfile.ok: TXR_ARGS := $(top_srcdir)/tests/008/configfile
tests/008/students.ok: TXR_ARGS := $(top_srcdir)/tests/008/students.xml
+tests/009/json.ok: TXR_ARGS := $(top_srcdir)/tests/009/webapp.json
+tests/009/json.ok: TXR_OPTS := -l
tests/002/%: TXR_SCRIPT_ON_CMDLINE := y
diff --git a/hash.c b/hash.c
index 7ee39d43..86b7a2f5 100644
--- a/hash.c
+++ b/hash.c
@@ -359,11 +359,14 @@ static struct cobj_ops hash_iter_ops = {
val hash_begin(val hash)
{
+ val hi_obj;
struct hash_iter *hi = (struct hash_iter *) chk_malloc(sizeof *hi);
- hi->hash = hash;
+ hi->hash = nil;
hi->chain = -1;
hi->cons = nil;
- return cobj((mem_t *) hi, hash_iter_s, &hash_iter_ops);
+ hi_obj = cobj((mem_t *) hi, hash_iter_s, &hash_iter_ops);
+ hi->hash = hash;
+ return hi_obj;
}
val hash_next(val *iter)
diff --git a/lib.c b/lib.c
index 7d5a8e46..41bf5e8f 100644
--- a/lib.c
+++ b/lib.c
@@ -1442,6 +1442,7 @@ val func_n3(val (*fun)(val, val, val))
val obj = make_obj();
obj->f.type = FUN;
obj->f.functype = N3;
+ obj->f.env = nil;
obj->f.f.n3 = fun;
return obj;
}
@@ -1451,6 +1452,7 @@ val func_n4(val (*fun)(val, val, val, val))
val obj = make_obj();
obj->f.type = FUN;
obj->f.functype = N4;
+ obj->f.env = nil;
obj->f.f.n4 = fun;
return obj;
}
diff --git a/tests/009/json.expected b/tests/009/json.expected
new file mode 100644
index 00000000..130058c2
--- /dev/null
+++ b/tests/009/json.expected
@@ -0,0 +1,2 @@
+(v "O" ((("S" "web-app") ("O" ((("S" "servlet") ("A" (("O" ((("S" "servlet-name") ("S" "cofaxCDS")) (("S" "servlet-class") ("S" "org.cofax.cds.CDSServlet")) (("S" "init-param") ("O" ((("S" "configGlossary:installationAt") ("S" "Philadelphia, PA")) (("S" "configGlossary:adminEmail") ("S" "ksm@pobox.com")) (("S" "configGlossary:poweredBy") ("S" "Cofax")) (("S" "configGlossary:poweredByIcon") ("S" "/images/cofax.gif")) (("S" "configGlossary:staticPath") ("S" "/content/static")) (("S" "templateProcessorClass") ("S" "org.cofax.WysiwygTemplate")) (("S" "templateLoaderClass") ("S" "org.cofax.FilesTemplateLoader")) (("S" "templatePath") ("S" "templates")) (("S" "templateOverridePath") ("S" "")) (("S" "defaultListTemplate") ("S" "listTemplate.htm")) (("S" "defaultFileTemplate") ("S" "articleTemplate.htm")) (("S" "useJSP") ("K" "false")) (("S" "jspListTemplate") ("S" "listTemplate.jsp")) (("S" "jspFileTemplate") ("S" "articleTemplate.jsp")) (("S" "cachePackageTagsTrack") ("N" "200")) (("S" "cachePackageTagsStore") ("N" "200")) (("S" "cachePackageTagsRefresh") ("N" "60")) (("S" "cacheTemplatesTrack") ("N" "100")) (("S" "cacheTemplatesStore") ("N" "50")) (("S" "cacheTemplatesRefresh") ("N" "15")) (("S" "cachePagesTrack") ("N" "200")) (("S" "cachePagesStore") ("N" "100")) (("S" "cachePagesRefresh") ("N" "10")) (("S" "cachePagesDirtyRead") ("N" "10")) (("S" "searchEngineListTemplate") ("S" "forSearchEnginesList.htm")) (("S" "searchEngineFileTemplate") ("S" "forSearchEngines.htm")) (("S" "searchEngineRobotsDb") ("S" "WEB-INF/robots.db")) (("S" "useDataStore") ("K" "true")) (("S" "dataStoreClass") ("S" "org.cofax.SqlDataStore")) (("S" "redirectionClass") ("S" "org.cofax.SqlRedirection")) (("S" "dataStoreName") ("S" "cofax")) (("S" "dataStoreDriver") ("S" "com.microsoft.jdbc.sqlserver.SQLServerDriver")) (("S" "dataStoreUrl") ("S" "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon")) (("S" "dataStoreUser") ("S" "sa")) (("S" "dataStorePassword") ("S" "dataStoreTestQuery")) (("S" "dataStoreTestQuery") ("S" "SET NOCOUNT ON;select test='test';")) (("S" "dataStoreLogFile") ("S" "/usr/local/tomcat/logs/datastore.log")) (("S" "dataStoreInitConns") ("N" "10")) (("S" "dataStoreMaxConns") ("N" "100")) (("S" "dataStoreConnUsageLimit") ("N" "100")) (("S" "dataStoreLogLevel") ("S" "debug")) (("S" "maxUrlLength") ("N" "500"))))))) ("O" ((("S" "servlet-name") ("S" "cofaxEmail")) (("S" "servlet-class") ("S" "org.cofax.cds.EmailServlet")) (("S" "init-param") ("O" ((("S" "mailHost") ("S" "mail1")) (("S" "mailHostOverride") ("S" "mail2"))))))) ("O" ((("S" "servlet-name") ("S" "cofaxAdmin")) (("S" "servlet-class") ("S" "org.cofax.cds.AdminServlet")))) ("O" ((("S" "servlet-name") ("S" "fileServlet")) (("S" "servlet-class") ("S" "org.cofax.cds.FileServlet")))) ("O" ((("S" "servlet-name") ("S" "cofaxTools")) (("S" "servlet-class") ("S" "org.cofax.cms.CofaxToolsServlet")) (("S" "init-param") ("O" ((("S" "templatePath") ("S" "toolstemplates/")) (("S" "log") ("N" "1")) (("S" "logLocation") ("S" "/usr/local/tomcat/logs/CofaxTools.log")) (("S" "logMaxSize") ("S" "")) (("S" "dataLog") ("N" "1")) (("S" "dataLogLocation") ("S" "/usr/local/tomcat/logs/dataLog.log")) (("S" "dataLogMaxSize") ("S" "")) (("S" "removePageCache") ("S" "/content/admin/remove?cache=pages&id=")) (("S" "removeTemplateCache") ("S" "/content/admin/remove?cache=templates&id=")) (("S" "fileTransferFolder") ("S" "/usr/local/tomcat/webapps/content/fileTransferFolder")) (("S" "lookInContext") ("N" "1")) (("S" "adminGroupID") ("N" "4")) (("S" "betaServer") ("K" "true")))))))))) (("S" "servlet-mapping") ("O" ((("S" "cofaxCDS") ("S" "/")) (("S" "cofaxEmail") ("S" "/cofaxutil/aemail/*")) (("S" "cofaxAdmin") ("S" "/admin/*")) (("S" "fileServlet") ("S" "/static/*")) (("S" "cofaxTools") ("S" "/tools/*"))))) (("S" "taglib") ("O" ((("S" "taglib-uri") ("S" "cofax.tld")) (("S" "taglib-location") ("S" "/WEB-INF/tlds/cofax.tld"))))))))))
+(badsyntax . "")
diff --git a/tests/009/json.txr b/tests/009/json.txr
new file mode 100644
index 00000000..bf5530d4
--- /dev/null
+++ b/tests/009/json.txr
@@ -0,0 +1,57 @@
+@(define value (v))@\
+ @(cases)@\
+ @(string v)@(or)@(num v)@(or)@(object v)@(or)@\
+ @(keyword v)@(or)@(array v)@\
+ @(end)@\
+@(end)
+@(define ws)@/[\n\t ]*/@(end)
+@(define string (g))@\
+ @(local s hex)@\
+ @(ws)@\
+ "@(coll :gap 0 :vars (s))@\
+ @(cases)@\
+ \"@(bind s "&quot;")@(or)@\
+ \\@(bind s "\\\\")@(or)@\
+ \/@(bind s "\\/")@(or)@\
+ \b@(bind s "&#8;")@(or)@\
+ \f@(bind s "&#12;")@(or)@\
+ \n@(bind s "&#10;")@(or)@\
+ \r@(bind s "&#13;")@(or)@\
+ \t@(bind s "&#9;")@(or)@\
+ \u@{hex /[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]/}@\
+ @(bind s `&#x@hex;`)@(or)@\
+ @{s /[^"\\]*/}@(filter :to_html s)@\
+ @(end)@\
+ @(until)"@\
+ @(end)"@\
+ @(ws)@\
+ @(cat s "")@\
+ @(filter :from_html s)@\
+ @(bind g ("S" s))@\
+@(end)
+@(define num (v))@\
+ @(local n)@\
+ @(ws)@{n /-?[0-9]+((\.[0-9]+)?([Ee][+\-]?[0-9]+)?)?/}@(ws)@\
+ @(bind v ("N" n))@\
+@(end)
+@(define keyword (v))@\
+ @(local k)@\
+ @(all)@(ws)@{k /true|false|null/}@(trailer)@/[^A-Za-z0-9_]/@(end)@(ws)@\
+ @(bind v ("K" k))@\
+@(end)
+@(define object (v))@\
+ @(local p e pair)@\
+ @(ws){@(ws)@(coll :gap 0 :vars (pair))@\
+ @(string p):@(value e)@/,?/@\
+ @(bind pair (p e))@\
+ @(until)}@\
+ @(end)}@(ws)@\
+ @(bind v ("O" pair))@\
+@(end)
+@(define array (v))@\
+ @(local e)@\
+ @(ws)[@(ws)@(coll :gap 0 :var (e))@(value e)@/,?/@(until)]@(end)]@(ws)@\
+ @(bind v ("A" e))@\
+@(end)
+@(freeform)
+@(maybe)@(value v)@(end)@badsyntax
diff --git a/tests/009/webapp.json b/tests/009/webapp.json
new file mode 100644
index 00000000..c1675a27
--- /dev/null
+++ b/tests/009/webapp.json
@@ -0,0 +1,88 @@
+{"web-app": {
+ "servlet": [
+ {
+ "servlet-name": "cofaxCDS",
+ "servlet-class": "org.cofax.cds.CDSServlet",
+ "init-param": {
+ "configGlossary:installationAt": "Philadelphia, PA",
+ "configGlossary:adminEmail": "ksm\u0040pobox.com",
+ "configGlossary:poweredBy": "Cofax",
+ "configGlossary:poweredByIcon": "/images/cofax.gif",
+ "configGlossary:staticPath": "/content/static",
+ "templateProcessorClass": "org.cofax.WysiwygTemplate",
+ "templateLoaderClass": "org.cofax.FilesTemplateLoader",
+ "templatePath": "templates",
+ "templateOverridePath": "",
+ "defaultListTemplate": "listTemplate.htm",
+ "defaultFileTemplate": "articleTemplate.htm",
+ "useJSP": false,
+ "jspListTemplate": "listTemplate.jsp",
+ "jspFileTemplate": "articleTemplate.jsp",
+ "cachePackageTagsTrack": 200,
+ "cachePackageTagsStore": 200,
+ "cachePackageTagsRefresh": 60,
+ "cacheTemplatesTrack": 100,
+ "cacheTemplatesStore": 50,
+ "cacheTemplatesRefresh": 15,
+ "cachePagesTrack": 200,
+ "cachePagesStore": 100,
+ "cachePagesRefresh": 10,
+ "cachePagesDirtyRead": 10,
+ "searchEngineListTemplate": "forSearchEnginesList.htm",
+ "searchEngineFileTemplate": "forSearchEngines.htm",
+ "searchEngineRobotsDb": "WEB-INF/robots.db",
+ "useDataStore": true,
+ "dataStoreClass": "org.cofax.SqlDataStore",
+ "redirectionClass": "org.cofax.SqlRedirection",
+ "dataStoreName": "cofax",
+ "dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServerDriver",
+ "dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon",
+ "dataStoreUser": "sa",
+ "dataStorePassword": "dataStoreTestQuery",
+ "dataStoreTestQuery": "SET NOCOUNT ON;select test='test';",
+ "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log",
+ "dataStoreInitConns": 10,
+ "dataStoreMaxConns": 100,
+ "dataStoreConnUsageLimit": 100,
+ "dataStoreLogLevel": "debug",
+ "maxUrlLength": 500}},
+ {
+ "servlet-name": "cofaxEmail",
+ "servlet-class": "org.cofax.cds.EmailServlet",
+ "init-param": {
+ "mailHost": "mail1",
+ "mailHostOverride": "mail2"}},
+ {
+ "servlet-name": "cofaxAdmin",
+ "servlet-class": "org.cofax.cds.AdminServlet"},
+
+ {
+ "servlet-name": "fileServlet",
+ "servlet-class": "org.cofax.cds.FileServlet"},
+ {
+ "servlet-name": "cofaxTools",
+ "servlet-class": "org.cofax.cms.CofaxToolsServlet",
+ "init-param": {
+ "templatePath": "toolstemplates/",
+ "log": 1,
+ "logLocation": "/usr/local/tomcat/logs/CofaxTools.log",
+ "logMaxSize": "",
+ "dataLog": 1,
+ "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log",
+ "dataLogMaxSize": "",
+ "removePageCache": "/content/admin/remove?cache=pages&id=",
+ "removeTemplateCache": "/content/admin/remove?cache=templates&id=",
+ "fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder",
+ "lookInContext": 1,
+ "adminGroupID": 4,
+ "betaServer": true}}],
+ "servlet-mapping": {
+ "cofaxCDS": "/",
+ "cofaxEmail": "/cofaxutil/aemail/*",
+ "cofaxAdmin": "/admin/*",
+ "fileServlet": "/static/*",
+ "cofaxTools": "/tools/*"},
+
+ "taglib": {
+ "taglib-uri": "cofax.tld",
+ "taglib-location": "/WEB-INF/tlds/cofax.tld"}}}