forked from len0rd/rockbox
		
	fix a few bugs, improve memory usage Change-Id: I6ceefd033000a6178eab0dd513679b5d72cec81c
		
			
				
	
	
		
			63 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| --[[
 | |
| /***************************************************************************
 | |
|  *             __________               __   ___.
 | |
|  *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
 | |
|  *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 | |
|  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
 | |
|  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
 | |
|  *                     \/            \/     \/    \/            \/
 | |
|  * $Id$
 | |
|  *
 | |
|  * Copyright (C) 2021 William Wilgus
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU General Public License
 | |
|  * as published by the Free Software Foundation; either version 2
 | |
|  * of the License, or (at your option) any later version.
 | |
|  *
 | |
|  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 | |
|  * KIND, either express or implied.
 | |
|  *
 | |
|  ****************************************************************************/
 | |
| --
 | |
| temp_loader allows some (pure) lua requires to be loaded and later garbage collected
 | |
| unfortunately the 'required' module needs to be formatted in such a way to
 | |
| pass back a reference to a function or call table in order to keep the functions
 | |
| within from being garbage collected too early
 | |
| 
 | |
| modules that add things to _G table are unaffected by using this function
 | |
| except if later you use require or temp_loader those tables will again
 | |
| be reloaded with fresh data since nothing was recorded about the module being loaded
 | |
| 
 | |
| modulename - same as require()
 | |
| newinstance == true -- get a new copy (from disk) of the module
 | |
| ... other args for the module
 | |
| 
 | |
| BE AWARE this bypasses the module loader
 | |
| which would allow code reuse so if you aren't careful this memory saving tool
 | |
| could spell disaster for free RAM if you load the same code multiple times
 | |
| --]]
 | |
| 
 | |
| local function tempload(modulename, newinstance, ...)
 | |
|   --http://lua-users.org/wiki/LuaModulesLoader
 | |
|   local errmsg = ""
 | |
|   -- Is there current a loaded module by this name?
 | |
|   if package.loaded[modulename] ~= nil and not newinstance then
 | |
|     return require(modulename)
 | |
|   end
 | |
|   -- Find source
 | |
|   local modulepath = string.gsub(modulename, "%.", "/")
 | |
|   for path in string.gmatch(package.path, "([^;]+)") do
 | |
|     local filename = string.gsub(path, "%?", modulepath)
 | |
|     --attempt to open and compile module
 | |
|     local file, err = loadfile(filename)
 | |
|     if file then
 | |
|       -- execute the compiled chunk
 | |
|       return file(... or modulename)
 | |
|     end
 | |
|     errmsg = table.concat({errmsg, "\n\tno file '", filename, "' (temp loader)"})
 | |
|   end
 | |
|   return nil, errmsg
 | |
| end
 | |
| 
 | |
| return tempload
 |