diff options
Diffstat (limited to 'sca-cpp/trunk/modules')
-rw-r--r-- | sca-cpp/trunk/modules/js/eval.hpp | 47 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/json/json-test.cpp | 114 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/json/json.hpp | 7 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/server/htdocs/test/json-properties.txt | 15 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/server/htdocs/test/json-request.txt | 8 | ||||
-rw-r--r-- | sca-cpp/trunk/modules/server/htdocs/test/json-result.txt | 4 |
6 files changed, 119 insertions, 76 deletions
diff --git a/sca-cpp/trunk/modules/js/eval.hpp b/sca-cpp/trunk/modules/js/eval.hpp index 79ae2aec65..b36c9e6119 100644 --- a/sca-cpp/trunk/modules/js/eval.hpp +++ b/sca-cpp/trunk/modules/js/eval.hpp @@ -27,7 +27,17 @@ */ #define XP_UNIX +#ifdef WANT_MAINTAINER_MODE +#pragma GCC diagnostic ignored "-Wunused-parameter" +#pragma GCC diagnostic ignored "-Wsign-compare" +#pragma GCC diagnostic ignored "-Wredundant-decls" +#endif #include <jsapi.h> +#ifdef WANT_MAINTAINER_MODE +#pragma GCC diagnostic warning "-Wunused-parameter" +#pragma GCC diagnostic warning "-Wsign-compare" +#pragma GCC diagnostic ignored "-Wredundant-decls" +#endif #include "string.hpp" #include "list.hpp" #include "value.hpp" @@ -85,8 +95,12 @@ private: ::JSRuntime* rt; } jsRuntime; -JSClass jsGlobalClass = { "global", JSCLASS_GLOBAL_FLAGS, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, - JS_PropertyStub, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub, JSCLASS_NO_OPTIONAL_MEMBERS}; +JSClass jsGlobalClass = { "global", JSCLASS_GLOBAL_FLAGS, + JS_PropertyStub, JS_PropertyStub, + JS_PropertyStub, JS_StrictPropertyStub, + JS_EnumerateStub, JS_ResolveStub, + JS_ConvertStub, JS_FinalizeStub, + JSCLASS_NO_OPTIONAL_MEMBERS }; /** * Represents a JavaScript context. Create one per thread. @@ -99,12 +113,12 @@ public: cx = JS_NewContext(jsRuntime, 8192); if(cx == NULL) return; - JS_SetOptions(cx, JSOPTION_VAROBJFIX); - JS_SetVersion(cx, JSVERSION_DEFAULT); + JS_SetOptions(cx, JSOPTION_VAROBJFIX | JSOPTION_JIT | JSOPTION_METHODJIT); + JS_SetVersion(cx, JSVERSION_LATEST); JS_SetErrorReporter(cx, reportError); // Create global JS object - global = JS_NewObject(cx, &jsGlobalClass, NULL, NULL); + global = JS_NewCompartmentAndGlobalObject(cx, &jsGlobalClass, NULL); if(global == NULL) { cleanup(); return; @@ -167,17 +181,22 @@ const list<value> jsPropertiesToValues(const list<value>& propertiesSoFar, JSObj const value jsValToValue(const jsval& jsv, const js::JSContext& cx); jsid id; - if(!JS_NextProperty(cx, i, &id) || id == JSVAL_VOID) + if(!JS_NextProperty(cx, i, &id)) + return propertiesSoFar; + jsval idv; + JS_IdToValue(cx, id, &idv); + if (idv == JSVAL_VOID) return propertiesSoFar; + jsval jsv; if(!JS_GetPropertyById(cx, o, id, &jsv)) return propertiesSoFar; const value val = jsValToValue(jsv, cx); - jsval idv; - JS_IdToValue(cx, id, &idv); if(JSVAL_IS_STRING(idv)) { - const string name = JS_GetStringBytes(JSVAL_TO_STRING(idv)); + char* cname = JS_EncodeString(cx, JSVAL_TO_STRING(idv)); + const string name = cname; + JS_free(cx, cname); if (isNil(val) && !isList(val)) return jsPropertiesToValues(cons<value> (mklist<value> (element, c_str(name), val), propertiesSoFar), o, i, cx); //return jsPropertiesToValues(propertiesSoFar, o, i, cx); @@ -196,7 +215,10 @@ const list<value> jsPropertiesToValues(const list<value>& propertiesSoFar, JSObj const value jsValToValue(const jsval& jsv, const js::JSContext& cx) { switch(JS_TypeOfValue(cx, jsv)) { case JSTYPE_STRING: { - return value(string(JS_GetStringBytes(JSVAL_TO_STRING(jsv)))); + char* cvalue = JS_EncodeString(cx, JSVAL_TO_STRING(jsv)); + const string svalue = string(cvalue); + JS_free(cx, cvalue); + return value(svalue); } case JSTYPE_BOOLEAN: { return value((bool)JSVAL_TO_BOOLEAN(jsv)); @@ -251,7 +273,10 @@ const jsval valueToJSVal(const value& val, const js::JSContext& cx) { return BOOLEAN_TO_JSVAL((bool)val); } case value::Number: { - return DOUBLE_TO_JSVAL(JS_NewDouble(cx, (double)val)); + jsval jsv; + if (!JS_NewNumberValue(cx, (jsdouble)val, &jsv)) + return DOUBLE_TO_JSVAL(0); + return jsv; } case value::List: { if (isJSArray(val)) diff --git a/sca-cpp/trunk/modules/json/json-test.cpp b/sca-cpp/trunk/modules/json/json-test.cpp index eed41c4e59..157e012b5a 100644 --- a/sca-cpp/trunk/modules/json/json-test.cpp +++ b/sca-cpp/trunk/modules/json/json-test.cpp @@ -37,31 +37,32 @@ ostream* jsonWriter(const string& s, ostream* os) { } const string jscustomer("{\n" - " \"customer\":{\n" - " \"@name\":\"jdoe\",\n" - " \"address\":{\n" - " \"@city\":\"san francisco\",\n" - " \"@state\":\"ca\"\n" + " \"customer\": {\n" + " \"@name\": \"jdoe\",\n" + " \"address\": {\n" + " \"@city\": \"san francisco\",\n" + " \"@state\": \"ca\"\n" " },\n" - " \"account\":{\n" - " \"id\":\"1234\",\n" - " \"@balance\":1000\n" + " \"account\": {\n" + " \"id\": \"1234\",\n" + " \"@balance\": 1000\n" " }\n" " }\n" "}"); const string jsphones("{\n" - " \"phones\":[\"408-1234\",\n" + " \"phones\": [\n" + " \"408-1234\",\n" " \"650-1234\"\n" " ],\n" - " \"lastName\":\"test\\u0009tab\",\n" - " \"@firstName\":\"test1\"\n" + " \"lastName\": \"test\\u0009tab\",\n" + " \"@firstName\": \"test1\"\n" "}"); const string jsecho("{\n" - " \"ns1:echoString\":{\n" - " \"@xmlns:ns1\":\"http://ws.apache.org/axis2/services/echo\",\n" - " \"text\":\"Hello World!\"\n" + " \"ns1:echoString\": {\n" + " \"@xmlns:ns1\": \"http://ws.apache.org/axis2/services/echo\",\n" + " \"text\": \"Hello World!\"\n" " }\n" "}"); @@ -110,81 +111,88 @@ bool testJSON() { } const string jsitem("{\n" - " \"id\":3,\n" - " \"result\":[{\n" - " \"price\":\"$2.99\",\n" - " \"name\":\"Apple\"\n" + " \"id\": 3,\n" + " \"result\": [\n" + " {\n" + " \"price\": \"$2.99\",\n" + " \"name\": \"Apple\"\n" " },\n" " {\n" - " \"price\":\"$3.55\",\n" - " \"name\":\"Orange\"\n" + " \"price\": \"$3.55\",\n" + " \"name\": \"Orange\"\n" " },\n" " {\n" - " \"price\":\"$1.55\",\n" - " \"name\":\"Pear\"\n" + " \"price\": \"$1.55\",\n" + " \"name\": \"Pear\"\n" " }\n" " ]\n" "}"); const string jsresult("{\n" - " \"id\":1,\n" - " \"result\":[\"Service.get\",\n" + " \"id\": 1,\n" + " \"result\": [\n" + " \"Service.get\",\n" " \"Service.getTotal\"\n" " ]\n" "}"); const string jsfeed("{\n" - " \"id\":1,\n" - " \"result\":[\"Sample Feed\",\n" + " \"id\": 1,\n" + " \"result\": [\n" + " \"Sample Feed\",\n" " \"123456789\",\n" - " [\"Item\",\n" + " [\n" + " \"Item\",\n" " \"111\",\n" " {\n" - " \"name\":\"Apple\",\n" - " \"currencyCode\":\"USD\",\n" - " \"currencySymbol\":\"$\",\n" - " \"price\":2.99\n" + " \"name\": \"Apple\",\n" + " \"currencyCode\": \"USD\",\n" + " \"currencySymbol\": \"$\",\n" + " \"price\": 2.99\n" " }\n" " ],\n" - " [\"Item\",\n" + " [\n" + " \"Item\",\n" " \"222\",\n" " {\n" - " \"name\":\"Orange\",\n" - " \"currencyCode\":\"USD\",\n" - " \"currencySymbol\":\"$\",\n" - " \"price\":3.55\n" + " \"name\": \"Orange\",\n" + " \"currencyCode\": \"USD\",\n" + " \"currencySymbol\": \"$\",\n" + " \"price\": 3.55\n" " }\n" " ],\n" - " [\"Item\",\n" + " [\n" + " \"Item\",\n" " \"333\",\n" " {\n" - " \"name\":\"Pear\",\n" - " \"currencyCode\":\"USD\",\n" - " \"currencySymbol\":\"$\",\n" - " \"price\":1.55\n" + " \"name\": \"Pear\",\n" + " \"currencyCode\": \"USD\",\n" + " \"currencySymbol\": \"$\",\n" + " \"price\": 1.55\n" " }\n" " ]\n" " ]\n" "}"); const string jsechoreq("{\n" - " \"id\":1,\n" - " \"method\":\"echo\",\n" - " \"params\":[{\n" - " \"ns1:echoString\":{\n" - " \"@xmlns:ns1\":\"http://ws.apache.org/axis2/services/echo\",\n" - " \"text\":\"Hello World!\"\n" + " \"id\": 1,\n" + " \"method\": \"echo\",\n" + " \"params\": [\n" + " {\n" + " \"ns1:echoString\": {\n" + " \"@xmlns:ns1\": \"http://ws.apache.org/axis2/services/echo\",\n" + " \"text\": \"Hello World!\"\n" " }\n" " }\n" " ]\n" "}"); const string jsechores("{\n" - " \"id\":1,\n" - " \"result\":{\n" - " \"ns1:echoString\":{\n" - " \"@xmlns:ns1\":\"http://ws.apache.org/axis2/c/samples\",\n" - " \"text\":\"Hello World!\"\n" + " \"id\": 1,\n" + " \"result\": {\n" + " \"ns1:echoString\": {\n" + " \"@xmlns:ns1\": \"http://ws.apache.org/axis2/c/samples\",\n" + " \"text\": \"Hello World!\"\n" " }\n" " }\n" "}"); @@ -200,7 +208,7 @@ bool testJSONRPC() { assert(assoc<value>("params", v) == mklist<value>("params", list<value>())); } { - const string i2 = "{\"id\":3,\"result\":{\"0\":{\"price\":\"$2.99\",\"name\":\"Apple\"},\"1\":{\"price\":\"$3.55\",\"name\":\"Orange\"},\"2\":{\"price\":\"$1.55\",\"name\":\"Pear\"}}}"; + const string i2 = "{\"id\": 3,\"result\": {\"0\": {\"price\": \"$2.99\",\"name\": \"Apple\"},\"1\": {\"price\": \"$3.55\",\"name\": \"Orange\"},\"2\": {\"price\": \"$1.55\",\"name\": \"Pear\"}}}"; const list<value> e = content(readJSON(mklist(jsitem), cx)); const list<value> e2 = content(readJSON(mklist(i2), cx)); assert(e == e2); diff --git a/sca-cpp/trunk/modules/json/json.hpp b/sca-cpp/trunk/modules/json/json.hpp index f35c04208e..e222ef0486 100644 --- a/sca-cpp/trunk/modules/json/json.hpp +++ b/sca-cpp/trunk/modules/json/json.hpp @@ -53,7 +53,7 @@ failable<bool> consume(JSONParser* parser, const list<string>& ilist, const js:: if (isNil(ilist)) return true; JSString* jstr = JS_NewStringCopyZ(cx, c_str(car(ilist))); - if(!JS_ConsumeJSONText(cx, parser, JS_GetStringChars(jstr), (uint32)JS_GetStringLength(jstr))) + if(!JS_ConsumeJSONText(cx, parser, JS_GetStringCharsZ(cx, jstr), (uint32)JS_GetStringLength(jstr))) return mkfailure<bool>("JS_ConsumeJSONText failed"); return consume(parser, cdr(ilist), cx); } @@ -95,7 +95,10 @@ public: template<typename R> JSBool writeCallback(const jschar *buf, uint32 len, void *data) { WriteContext<R>& wcx = *(static_cast<WriteContext<R>*> (data)); JSString* jstr = JS_NewUCStringCopyN(wcx.cx, buf, len); - wcx.accum = wcx.reduce(string(JS_GetStringBytes(jstr), JS_GetStringLength(jstr)), wcx.accum); + char* cstr = JS_EncodeString(wcx.cx, jstr); + const string str(cstr, JS_GetStringLength(jstr)); + JS_free(wcx.cx, cstr); + wcx.accum = wcx.reduce(str, wcx.accum); return JS_TRUE; } diff --git a/sca-cpp/trunk/modules/server/htdocs/test/json-properties.txt b/sca-cpp/trunk/modules/server/htdocs/test/json-properties.txt index 75843bc286..4395abf1dc 100644 --- a/sca-cpp/trunk/modules/server/htdocs/test/json-properties.txt +++ b/sca-cpp/trunk/modules/server/htdocs/test/json-properties.txt @@ -1,13 +1,14 @@ { - "id":"1", - "result":{ - "host":"localhost", - "path":["components", + "id": "1", + "result": { + "host": "localhost", + "path": [ + "components", "property-test" ], - "query":{ - "id":"1", - "method":"print" + "query": { + "id": "1", + "method": "print" } } }
\ No newline at end of file diff --git a/sca-cpp/trunk/modules/server/htdocs/test/json-request.txt b/sca-cpp/trunk/modules/server/htdocs/test/json-request.txt index b4bd07fc46..b5c2457309 100644 --- a/sca-cpp/trunk/modules/server/htdocs/test/json-request.txt +++ b/sca-cpp/trunk/modules/server/htdocs/test/json-request.txt @@ -1 +1,7 @@ -{"id":1,"method":"echo","params":["Hello"]} +{ + "id": 1, + "method": "echo", + "params": [ + "Hello" + ] +} diff --git a/sca-cpp/trunk/modules/server/htdocs/test/json-result.txt b/sca-cpp/trunk/modules/server/htdocs/test/json-result.txt index 38aa8a2a5e..72b27b67db 100644 --- a/sca-cpp/trunk/modules/server/htdocs/test/json-result.txt +++ b/sca-cpp/trunk/modules/server/htdocs/test/json-result.txt @@ -1,4 +1,4 @@ { - "id":1, - "result":"Hello" + "id": 1, + "result": "Hello" }
\ No newline at end of file |