diff --git a/changes.txt b/changes.txt index 83966c68f..359a4cb34 100644 --- a/changes.txt +++ b/changes.txt @@ -101,6 +101,7 @@ Released: N/A * Changed RevoluteJoint:getMotorTorque and WheelJoint:getMotorTorque to take 'dt' as a parameter instead of 'inverse_dt'. * Changed love.math.perlinNoise and simplexNoise to use higher precision numbers for its internal calculations. * Changed t.accelerometerjoystick startup flag in love.conf to unset by default. +* Changed love.data.hash to take in a container type. * Renamed 'display' field to 'displayindex' in love.window.setMode/updateMode/getMode and love.conf. * Renamed love.graphics Text objects to TextBatch. @@ -120,6 +121,7 @@ Released: N/A * Deprecated t.accelerometerjoystick in love.conf (replaced by love.sensor module). * Deprecated the variants of Mesh:attachAttribute and SpriteBatch:attachAttribute which accept a Mesh (replaced by variants which accept a Buffer). * Deprecated Texture:newImageData (replaced by love.graphics.readbackTexture). +* Deprecated love.data.hash (replaced by function variant, which takes container type). * Removed the variant of SpriteBatch:setColor() which turns off all previously set colors. * Removed the no-argument variant of love.graphics.setColorMask. diff --git a/src/modules/data/wrap_DataModule.cpp b/src/modules/data/wrap_DataModule.cpp index b8e066a13..b9feda515 100644 --- a/src/modules/data/wrap_DataModule.cpp +++ b/src/modules/data/wrap_DataModule.cpp @@ -302,25 +302,52 @@ int w_decode(lua_State *L) int w_hash(lua_State *L) { - const char *fstr = luaL_checkstring(L, 1); + int narg = 0; // used to change the arg position when using the deprecated function variant + + ContainerType ctype = CONTAINER_STRING; HashFunction::Function function; + + const char *str = luaL_checkstring(L, 1); + if (!getConstant(str, ctype)) + { + if (HashFunction::getConstant(str, function)) + { // check if the argument at 1 is a hash function; deprecated function variant + luax_markdeprecated(L, 1, "love.data.hash", API_FUNCTION_VARIANT, DEPRECATED_REPLACED, "variant with container return type parameter"); + narg = -1; + } + else + luax_enumerror(L, "container type", getConstants(ctype), str); + } + + const char *fstr = luaL_checkstring(L, 2 + narg); if (!HashFunction::getConstant(fstr, function)) return luax_enumerror(L, "hash function", HashFunction::getConstants(function), fstr); HashFunction::Value hashvalue; - if (lua_isstring(L, 2)) + if (lua_isstring(L, 3 + narg)) { size_t rawsize = 0; - const char *rawbytes = luaL_checklstring(L, 2, &rawsize); + const char *rawbytes = luaL_checklstring(L, 3 + narg, &rawsize); luax_catchexcept(L, [&](){ love::data::hash(function, rawbytes, rawsize, hashvalue); }); } else { - Data *rawdata = luax_checktype(L, 2); + Data *rawdata = luax_checktype(L, 3 + narg); luax_catchexcept(L, [&](){ love::data::hash(function, rawdata, hashvalue); }); } - lua_pushlstring(L, hashvalue.data, hashvalue.size); + if (ctype == CONTAINER_DATA) + { + Data* d = nullptr; + luax_catchexcept(L, [&]() { d = instance()->newByteData(hashvalue.size); }); + memcpy(d->getData(), hashvalue.data, hashvalue.size); + + luax_pushtype(L, Data::type, d); + d->release(); + } + else + lua_pushlstring(L, hashvalue.data, hashvalue.size); + return 1; } diff --git a/testing/tests/data.lua b/testing/tests/data.lua index 0e21a7713..21b66b609 100644 --- a/testing/tests/data.lua +++ b/testing/tests/data.lua @@ -196,19 +196,33 @@ end -- love.data.hash love.test.data.hash = function(test) -- setup all the different hashing types - local str1 = love.data.hash('md5', 'helloworld') - local str2 = love.data.hash('sha1', 'helloworld') - local str3 = love.data.hash('sha224', 'helloworld') - local str4 = love.data.hash('sha256', 'helloworld') - local str5 = love.data.hash('sha384', 'helloworld') - local str6 = love.data.hash('sha512', 'helloworld') + local str1 = love.data.hash('string', 'md5', 'helloworld') + local str2 = love.data.hash('string', 'sha1', 'helloworld') + local str3 = love.data.hash('string', 'sha224', 'helloworld') + local str4 = love.data.hash('string', 'sha256', 'helloworld') + local str5 = love.data.hash('string', 'sha384', 'helloworld') + local str6 = love.data.hash('string', 'sha512', 'helloworld') + local data1 = love.data.hash('data', 'md5', 'helloworld') + local data2 = love.data.hash('data', 'sha1', 'helloworld') + local data3 = love.data.hash('data', 'sha224', 'helloworld') + local data4 = love.data.hash('data', 'sha256', 'helloworld') + local data5 = love.data.hash('data', 'sha384', 'helloworld') + local data6 = love.data.hash('data', 'sha512', 'helloworld') -- check encoded hash value matches what's expected for that algo - test:assertEquals('fc5e038d38a57032085441e7fe7010b0', love.data.encode("string", "hex", str1), 'check md5 encode') - test:assertEquals('6adfb183a4a2c94a2f92dab5ade762a47889a5a1', love.data.encode("string", "hex", str2), 'check sha1 encode') - test:assertEquals('b033d770602994efa135c5248af300d81567ad5b59cec4bccbf15bcc', love.data.encode("string", "hex", str3), 'check sha224 encode') - test:assertEquals('936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af', love.data.encode("string", "hex", str4), 'check sha256 encode') - test:assertEquals('97982a5b1414b9078103a1c008c4e3526c27b41cdbcf80790560a40f2a9bf2ed4427ab1428789915ed4b3dc07c454bd9', love.data.encode("string", "hex", str5), 'check sha384 encode') - test:assertEquals('1594244d52f2d8c12b142bb61f47bc2eaf503d6d9ca8480cae9fcf112f66e4967dc5e8fa98285e36db8af1b8ffa8b84cb15e0fbcf836c3deb803c13f37659a60', love.data.encode("string", "hex", str6), 'check sha512 encode') + -- test container string + test:assertEquals('fc5e038d38a57032085441e7fe7010b0', love.data.encode("string", "hex", str1), 'check string md5 encode') + test:assertEquals('6adfb183a4a2c94a2f92dab5ade762a47889a5a1', love.data.encode("string", "hex", str2), 'check string sha1 encode') + test:assertEquals('b033d770602994efa135c5248af300d81567ad5b59cec4bccbf15bcc', love.data.encode("string", "hex", str3), 'check string sha224 encode') + test:assertEquals('936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af', love.data.encode("string", "hex", str4), 'check string sha256 encode') + test:assertEquals('97982a5b1414b9078103a1c008c4e3526c27b41cdbcf80790560a40f2a9bf2ed4427ab1428789915ed4b3dc07c454bd9', love.data.encode("string", "hex", str5), 'check string sha384 encode') + test:assertEquals('1594244d52f2d8c12b142bb61f47bc2eaf503d6d9ca8480cae9fcf112f66e4967dc5e8fa98285e36db8af1b8ffa8b84cb15e0fbcf836c3deb803c13f37659a60', love.data.encode("string", "hex", str6), 'check string sha512 encode') + -- test container data + test:assertEquals('fc5e038d38a57032085441e7fe7010b0', love.data.encode("string", "hex", data1), 'check data md5 encode') + test:assertEquals('6adfb183a4a2c94a2f92dab5ade762a47889a5a1', love.data.encode("string", "hex", data2), 'check data sha1 encode') + test:assertEquals('b033d770602994efa135c5248af300d81567ad5b59cec4bccbf15bcc', love.data.encode("string", "hex", data3), 'check data sha224 encode') + test:assertEquals('936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af', love.data.encode("string", "hex", data4), 'check data sha256 encode') + test:assertEquals('97982a5b1414b9078103a1c008c4e3526c27b41cdbcf80790560a40f2a9bf2ed4427ab1428789915ed4b3dc07c454bd9', love.data.encode("string", "hex", data5), 'check data sha384 encode') + test:assertEquals('1594244d52f2d8c12b142bb61f47bc2eaf503d6d9ca8480cae9fcf112f66e4967dc5e8fa98285e36db8af1b8ffa8b84cb15e0fbcf836c3deb803c13f37659a60', love.data.encode("string", "hex", data6), 'check data sha512 encode') end