| 204 | } |
| 205 | |
| 206 | LUA_API int lua_BurnStoreSet(lua_State *L, size_t keySize, size_t oldDataSize, size_t newDataSize, int version) { |
| 207 | if (IsBurnerRuning(L) && version <= L->burnerState.version) { |
| 208 | unsigned long long fuel = 0; |
| 209 | unsigned long long refund = 0; |
| 210 | const char *action = "unchanged"; |
| 211 | if (newDataSize == oldDataSize) { |
| 212 | action = "reset"; |
| 213 | fuel = newDataSize * FUEL_STORE_RESET; |
| 214 | } else if (newDataSize > oldDataSize) { |
| 215 | if (oldDataSize == 0) { |
| 216 | action = "new"; |
| 217 | fuel = (keySize + newDataSize) * FUEL_STORE_ADDED; |
| 218 | } else { // increase |
| 219 | action = "increase"; |
| 220 | fuel = (newDataSize - oldDataSize) * FUEL_STORE_ADDED + oldDataSize * FUEL_STORE_RESET; |
| 221 | } |
| 222 | } else { // (newDataSize < oldDataSize) // decrease, refund |
| 223 | if (newDataSize == 0) { |
| 224 | refund = (oldDataSize) * FUEL_STORE_REFUND; |
| 225 | } else { |
| 226 | refund = (oldDataSize - newDataSize) * FUEL_STORE_REFUND; |
| 227 | fuel = newDataSize * FUEL_STORE_RESET; |
| 228 | } |
| 229 | } |
| 230 | L->burnerState.fuel += fuel; |
| 231 | L->burnerState.fuelStore += fuel; |
| 232 | L->burnerState.fuelRefund += refund; |
| 233 | TraceBurning(L, "lua_BurnStoreSet", "%s, version=%d, keySize=%u, oldDataSize=%u, newDataSize=%u, fuel=%llu, refund=%llu\n", |
| 234 | action, version, keySize, oldDataSize, newDataSize, refund); |
| 235 | return CheckBurnedOk(L, "Burned-out lua_BurnStoreSet"); |
| 236 | } |
| 237 | return 1; |
| 238 | } |
| 239 | |
| 240 | LUA_API int lua_BurnStoreUnchanged(lua_State *L, size_t keySize, size_t dataSize, int version) { |
| 241 | if (IsBurnerRuning(L) && version <= L->burnerState.version) { |
no test coverage detected