Don't throw a error when writing JSON fails
authorShadowNinja <shadowninja@minetest.net>
Wed, 18 Dec 2013 23:17:26 +0000 (18:17 -0500)
committerShadowNinja <shadowninja@minetest.net>
Wed, 18 Dec 2013 23:18:43 +0000 (18:18 -0500)
doc/lua_api.txt
src/script/common/c_content.cpp
src/script/lua_api/l_util.cpp

index 135e2cfcd697756f28632d27ca16480adfef0318..eb6362b0bb7dd7cc840be44782b38296febbc915 100644 (file)
@@ -1531,7 +1531,7 @@ minetest.parse_json(string[, nullvalue]) -> something
 ^ On success returns a table, a string, a number, a boolean or nullvalue
 ^ On failure outputs an error message and returns nil
 ^ Example: parse_json("[10, {\"a\":false}]") -> {10, {a = false}}
-minetest.write_json(data[, styled]) -> string
+minetest.write_json(data[, styled]) -> string or nil and error message
 ^ Convert a Lua table into a JSON string
 ^ styled: Outputs in a human-readable format if this is set, defaults to false
 ^ Un-serializable things like functions and userdata are saved as null.
index 8eb57ba41feddd30f8b25b39563d365b536f1371..cb5a92ae46fcc31286f609652b4df376b955ee7d 100644 (file)
@@ -1106,26 +1106,26 @@ void get_json_value(lua_State *L, Json::Value &root, int index)
                        if (keytype == LUA_TNUMBER) {
                                lua_Number key = lua_tonumber(L, -1);
                                if (roottype != Json::nullValue && roottype != Json::arrayValue) {
-                                       throw LuaError(NULL, "Can't mix array and object values in JSON");
+                                       throw SerializationError("Can't mix array and object values in JSON");
                                } else if (key < 1) {
-                                       throw LuaError(NULL, "Can't use zero-based or negative indexes in JSON");
+                                       throw SerializationError("Can't use zero-based or negative indexes in JSON");
                                } else if (floor(key) != key) {
-                                       throw LuaError(NULL, "Can't use indexes with a fractional part in JSON");
+                                       throw SerializationError("Can't use indexes with a fractional part in JSON");
                                }
                                root[(Json::ArrayIndex) key - 1] = value;
                        } else if (keytype == LUA_TSTRING) {
                                if (roottype != Json::nullValue && roottype != Json::objectValue) {
-                                       throw LuaError(NULL, "Can't mix array and object values in JSON");
+                                       throw SerializationError("Can't mix array and object values in JSON");
                                }
                                root[lua_tostring(L, -1)] = value;
                        } else {
-                               throw LuaError(NULL, "Lua key to convert to JSON is not a string or number");
+                               throw SerializationError("Lua key to convert to JSON is not a string or number");
                        }
                }
        } else if (type == LUA_TNIL) {
                root = Json::nullValue;
        } else {
-               throw LuaError(NULL, "Can only store booleans, numbers, strings, objects, arrays, and null in JSON");
+               throw SerializationError("Can only store booleans, numbers, strings, objects, arrays, and null in JSON");
        }
        lua_pop(L, 1); // Pop value
 }
index 9fa6fcb777a0c6996c45533e6de87390e7ef4023..f9ec94db403e1133ff172a9173585a7ef1bf783f 100644 (file)
@@ -179,7 +179,7 @@ int ModApiUtil::l_parse_json(lua_State *L)
        return 1;
 }
 
-// write_json(data[, styled]) -> string
+// write_json(data[, styled]) -> string or nil and error message
 int ModApiUtil::l_write_json(lua_State *L)
 {
        NO_MAP_LOCK_REQUIRED;
@@ -191,7 +191,13 @@ int ModApiUtil::l_write_json(lua_State *L)
        }
 
        Json::Value root;
-       get_json_value(L, root, 1);
+       try {
+               get_json_value(L, root, 1);
+       } catch (SerializationError &e) {
+               lua_pushnil(L);
+               lua_pushstring(L, e.what());
+               return 2;
+       }
 
        std::string out;
        if (styled) {