Преглед изворни кода

change: vm,修改tostring的行为,直接sprintf,不需要再走lua_pushfstring绕圈,解决air8101的log.info/tostring打印浮点数不正确的问题

Wendal Chen пре 7 месеци
родитељ
комит
bf1d4dec1f
2 измењених фајлова са 32 додато и 0 уклоњено
  1. 16 0
      lua/src/lauxlib.c
  2. 16 0
      luat/demo/json/main.lua

+ 16 - 0
lua/src/lauxlib.c

@@ -833,13 +833,29 @@ LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) {
       luaL_error(L, "'__tostring' must return a string");
   }
   else {
+    lua_Integer i;
+    lua_Number n;
+    char buff[64] = {0};
     switch (lua_type(L, idx)) {
       case LUA_TNUMBER: {
+        #if 0
         if (lua_isinteger(L, idx))
           lua_pushfstring(L, "%I", (LUAI_UACINT)lua_tointeger(L, idx));
         else
           lua_pushfstring(L, "%f", (LUAI_UACNUMBER)lua_tonumber(L, idx));
+        #else
+        if (lua_isinteger(L, idx)) {
+          i = (LUAI_UACINT)lua_tointeger(L, idx);
+          sprintf_(buff, "%" LUA_INTEGER_FRMLEN "d", i);
+          lua_pushstring(L, buff);
+        }
+        else {
+          n = (LUAI_UACNUMBER)lua_tonumber(L, idx);
+          sprintf_(buff, "%9g", n);
+          lua_pushstring(L, buff);
+        }
         break;
+        #endif
       }
       case LUA_TSTRING:
         lua_pushvalue(L, idx);

+ 16 - 0
luat/demo/json/main.lua

@@ -54,11 +54,27 @@ sys.taskInit(function()
         log.info("json.null", json.decode("{\"abc\":null}").abc == json.null)
         log.info("json.null", json.decode("{\"abc\":null}").abc == nil)
 
+        -- 测试浮点数的解码和编码
+        local tmp = "{\"abc\":3.5}"
+        local abc, err = json.decode(tmp)
+        log.info("json浮点数测试", abc, err, abc.abc, abc.abc == 3.5)
+        log.info("json浮点数测试", json.encode({abc=3.5}, "1f"))
+        log.info("json浮点数测试", json.encode(abc, "1f"))
+        log.info("json浮点数测试", string.format("%1f", abc.abc))
+        log.info("json浮点数测试", string.format("%7g", abc.abc))
+        -- log.info("json浮点数测试", string.format("%d", abc.abc))
+        local tmp = abc.abc
+        local tmp3 = 3.5
+        local tmp2 = tostring(tmp)
+        log.info("json浮点数测试", abc, err, abc.abc, tmp, tmp2, tostring(tmp3))
+
         -- 以下代码仅64bit固件可正确运行
         local tmp = [[{ "timestamp": 1691998307973}]]
         local abc, err = json.decode(tmp)
         log.info("json", abc, err)
         log.info("json", abc and abc.timestamp)
+
+        break
     end
 end)