Apparently I messed up string parsing. I thought I had tested this-maybe
I only tried a empty string or something.
Also, warning for future people reading this saga of insanity: Do not
write code while tired.
pcall and xpcall no longer magically disable the infinite loop
security(Note: This can actually crash a server, even without the
ability to use loops), and the lexer now continues lexing after a
unknown character instead of rolling it all into cleanup.
I've added a simple lexer to work out the correct places to add dummy
code, which fixes the problem mentioned in code_prohibited.
This means LuaControllers are no longer restricted to simple
conditionals, but should still be safe for server owners.
Furthermore, the lexer prevents accidentally matching text in strings.
Settings can now be retrieved by mesecon.setting(<name>, <default>) and can be modified without
editing the source code by adding the setting to minetest.conf
For instance, you can add mesecon.blinky_plant_interval = 0.5 to minetest.conf in order to
increase the blinking speed.
Rewrite the blinky plant with nodetimers.
Fixes #161
flexibility and because it was never inteded to be OOP in the first
place.
mesecon.receptor_on and mesecon.receptor_off are provided by wrappers
(mesecon:receptor_on/off) for compatibility, but will be removed. Mod
programmers that use mesecons: Please update!
Also, fix microcontroller polluting the global namespace and remove some
deprecated stuff.
Changes:
* Stops code after a certain number of instructions.
* Allows functions, due to instruction counting.
* Allows loops and goto with non-JIT Lua (LuaJIT doesn't count looping as an instruction, allowing infinite loops), due to instruction counting.
* Removes string matching functions as they can be slow.
* Adds some safe functions.
* Limits the amount of printing that can be done (to prevent console flooding).
* Code cleanup.
* More...
Why did we actually put the update action in a queue again? Whatever issue it that was for, I couldn't reproduce it.
Propably the ActionQueue fixed that...?
This adds a timer(<seconds>) function, which causes an event of type
"timer" to be fired after that many seconds has elapsed.
Because it's node timer based, it works properly across server restarts
and block unloading. Thus, simplest example, a blinky plant replacement
with a 10 second period:
if event.type == "program" then
timer(10)
elseif event.type == "timer" then
port.a = not port.a
timer(10)
end
Example of problem fixed by this: Edit lua code, press Execute. Now
(execute button has focus), hold down a key. Zillions of "program"
events are generated.
In the same way as for port settings, this queues up digiline messages
sent during the luacontroller's execution, and sends them afterwards.
This solves many problems, but one example:
1. Send a message, and receive a reply from another device.
2. While handling the reply event (effectively a nested invocation
on the same luacontroller) make a change to memory
3. Notice that the memory change has no effect, because after
completion of the reply handling, it stores the memory, but then
the original invocation completes and overwrites it with it's
own earlier copy of the same memory.
This introduces the ActionQueue, a new kind of MESECONS_GLOBALSTEP.
Circuits using delayers will now resume when restarting the server.
Also, large circuits should automatically resume if parts of them are
in unloaded chunks.
Old circuits e.g. using gates will not resume when mesecons is updated,
which means you have to restart them once. But after that, it should work
just like it used to.
This will fix a lot of stuff but may also introduce some new bugs.
So please report them!