URL:
<http://gna.org/patch/?1617>
Summary: Release script objects for removed units and cities
Project: Freeciv
Submitted by: englabenny
Submitted on: söndag 2010-04-11 den 22:10
Category: general
Priority: 5 - Normal
Status: Ready For Test
Privacy: Public
Assigned to: englabenny
Originator Email:
Open/Closed: Open
Discussion Lock: Any
Planned Release: 2.3.0
_______________________________________________________
Details:
Executive summary:
No more access to wild pointers through saved values of dead units or
destroyed cities in Lua.
Script may use Unit:is_alive() or City:exists() to be safe from script
error.
Performance cost is only two Lua table lookups per deleted unit or deleted
city. (For the common case that the object was not exported as a tolua
object)
-------------
The script API exposes freeciv objects by exporting wrapped pointers,
for example pointers to struct unit or struct city.
We must take care when these objects are removed and the pointers
become invalid ("wild").
In lua we can "store" a city in a variable:
> city = find.city(nil, 108)
> print(city)
<City #108 Cityname>
The lua value bound to 'city' is a userdata ("full userdata") whose
payload is the pointer to the freeciv C object.
Conceptually we have this
city: [userdata of type 'City' with [void *object: 0x012334]]
When script_release_exported_object(..) is used, 'city' now represents
a typed but empty value:
city: [userdata of type 'City' with [void *object: NULL]]
'city' is not 'nil' in Lua. However, when 'city' is used in the API,
it is unboxed by tolua and resolves to a NULL pointer.
This means that dead units and destroyed cities:
* Have a "valid" lua value (not nil) that represents a NULL value in C
* Will be NULL when used as API function parameters
* Do not allow access to object fields ("city.id" -> script error)
The only valid methods you can call on lua value storing a
destroyed city or dead unit are:
City:exists()
Unit:is_alive()
All other field or method use will raise a script error.
_______________________________________________________
File Attachments:
-------------------------------------------------------
Date: söndag 2010-04-11 den 22:10 Name:
2010041201-Release-script-objects-for-removed-units-and-c.patch Size: 7 kB
By: englabenny
<http://gna.org/patch/download.php?file_id=8918>
_______________________________________________________
Reply to this item at:
<http://gna.org/patch/?1617>
_______________________________________________
Meddelandet skickades via/av Gna!
http://gna.org/
_______________________________________________
Freeciv-dev mailing list
[email protected]
https://mail.gna.org/listinfo/freeciv-dev