summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/modules
diff options
context:
space:
mode:
Diffstat (limited to 'sca-cpp/trunk/modules')
-rw-r--r--sca-cpp/trunk/modules/js/eval.hpp47
-rw-r--r--sca-cpp/trunk/modules/json/json-test.cpp114
-rw-r--r--sca-cpp/trunk/modules/json/json.hpp7
-rw-r--r--sca-cpp/trunk/modules/server/htdocs/test/json-properties.txt15
-rw-r--r--sca-cpp/trunk/modules/server/htdocs/test/json-request.txt8
-rw-r--r--sca-cpp/trunk/modules/server/htdocs/test/json-result.txt4
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