ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/cfperl.xs
(Generate patch)

Comparing deliantra/server/server/cfperl.xs (file contents):
Revision 1.131 by root, Mon Jan 8 18:18:35 2007 UTC vs.
Revision 1.146 by root, Fri Jan 19 22:24:10 2007 UTC

101 101
102unordered_vector<attachable *> attachable::mortals; 102unordered_vector<attachable *> attachable::mortals;
103 103
104attachable::~attachable () 104attachable::~attachable ()
105{ 105{
106 assert (!(flags & F_BORROWED)); 106 assert (!self);
107} 107}
108 108
109int 109int
110attachable::refcnt_cnt () const 110attachable::refcnt_cnt () const
111{ 111{
117{ 117{
118 if (self 118 if (self
119 && SvREFCNT (self) == 1 119 && SvREFCNT (self) == 1
120 && !HvTOTALKEYS (self)) 120 && !HvTOTALKEYS (self))
121 { 121 {
122 flags &= ~F_BORROWED;
123 refcnt_inc (); 122 refcnt_inc ();
124 SvREFCNT_dec ((SV *)self); 123 SvREFCNT_dec ((SV *)self);
125 } 124 }
126} 125}
127 126
128// check wether the object really is dead 127// check wether the object really is dead
129void 128void
130attachable::do_check () 129attachable::do_check ()
131{ 130{
132 if (refcnt > 0) 131 if (refcnt > 0 || refcnt_cnt () > 0)
133 return; 132 return;
134 133
135 optimise (); 134 destroy ();
136 135
137 if (self) 136 if (self)
138 { 137 {
139 if (refcnt + SvREFCNT (self) > 0) 138 hv_clear (self);
140 return; 139 sv_unmagic ((SV *)self, PERL_MAGIC_ext);
141
142 assert (flags & F_BORROWED);
143
144 flags &= ~F_BORROWED;
145 refcnt_inc ();
146 SvREFCNT_dec (self); 140 SvREFCNT_dec (self);
147 self = 0; 141 self = 0;
148 } 142 }
149
150 if (refcnt > 0)
151 return;
152
153 destroy ();
154} 143}
155 144
156void 145void
157attachable::do_destroy () 146attachable::do_destroy ()
158{ 147{
227 216
228static int 217static int
229attachable_free (pTHX_ SV *sv, MAGIC *mg) 218attachable_free (pTHX_ SV *sv, MAGIC *mg)
230{ 219{
231 attachable *at = (attachable *)mg->mg_ptr; 220 attachable *at = (attachable *)mg->mg_ptr;
232 assert (!(at->flags & attachable::F_BORROWED));
233 at->self = 0; 221 at->self = 0;
234 // next line makes sense, but most objects still have refcnt 0 by default 222 // next line makes sense, but most objects still have refcnt 0 by default
235 //at->refcnt_chk (); 223 //at->refcnt_chk ();
236 return 0; 224 return 0;
237} 225}
248 { 236 {
249 obj->self = newHV (); 237 obj->self = newHV ();
250 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0); 238 sv_magicext ((SV *)obj->self, 0, PERL_MAGIC_ext, &attachable::vtbl, (char *)obj, 0);
251 239
252 // borrow the refcnt from the object 240 // borrow the refcnt from the object
253 obj->flags |= attachable::F_BORROWED; 241 // it is important thta no refcnt_chk is being executed here
254 obj->refcnt_dec (); 242 obj->refcnt_dec ();
255 243
256 // now bless the object _once_ 244 // now bless the object _once_
257 return sv_bless (newRV_inc ((SV *)obj->self), stash); 245 return sv_bless (newRV_inc ((SV *)obj->self), stash);
258 } 246 }
259 else 247 else
248 {
260 return newRV_inc ((SV *)obj->self); 249 SV *sv = newRV_inc ((SV *)obj->self);
250
251 if (Gv_AMG (stash)) // handle overload correctly, as the perl core does not
252 SvAMAGIC_on (sv);
253
254 return sv;
255 }
261} 256}
262 257
263static void 258static void
264clearSVptr (SV *sv) 259clearSVptr (SV *sv)
265{ 260{
318inline SV *to_sv (living * v) { return newSVptr (v, stash_cf_living_wrap); } 313inline SV *to_sv (living * v) { return newSVptr (v, stash_cf_living_wrap); }
319 314
320inline SV *to_sv (object & v) { return to_sv (&v); } 315inline SV *to_sv (object & v) { return to_sv (&v); }
321inline SV *to_sv (living & v) { return to_sv (&v); } 316inline SV *to_sv (living & v) { return to_sv (&v); }
322 317
323//TODO:
324inline SV *to_sv (New_Face * v) { return to_sv (v->name); } 318inline SV *to_sv (facetile * v) { return to_sv (v->name); }
325inline SV *to_sv (treasurelist * v) { return to_sv (v->name); } 319inline SV *to_sv (treasurelist * v) { return to_sv (v->name); }
326 320
327inline SV *to_sv (UUID v) 321inline SV *to_sv (UUID v)
328{ 322{
329 char buf[128]; 323 char buf[128];
354inline void sv_to (SV *sv, attachable * &v) { v = (attachable *)SvPTR_ornull (sv, "cf::attachable"); } 348inline void sv_to (SV *sv, attachable * &v) { v = (attachable *)SvPTR_ornull (sv, "cf::attachable"); }
355inline void sv_to (SV *sv, partylist * &v) { v = (partylist *)SvPTR_ornull (sv, "cf::party"); } 349inline void sv_to (SV *sv, partylist * &v) { v = (partylist *)SvPTR_ornull (sv, "cf::party"); }
356inline void sv_to (SV *sv, region * &v) { v = (region *)SvPTR_ornull (sv, "cf::region"); } 350inline void sv_to (SV *sv, region * &v) { v = (region *)SvPTR_ornull (sv, "cf::region"); }
357inline void sv_to (SV *sv, living * &v) { v = (living *)SvPTR_ornull (sv, "cf::living"); } 351inline void sv_to (SV *sv, living * &v) { v = (living *)SvPTR_ornull (sv, "cf::living"); }
358 352
359inline void sv_to (SV *sv, New_Face * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; } //TODO 353inline void sv_to (SV *sv, facetile * &v) { v = &new_faces[FindFace (SvPV_nolen (sv), 0)]; }
360inline void sv_to (SV *sv, treasurelist * &v) { v = find_treasurelist (SvPV_nolen (sv)); } // TODO 354inline void sv_to (SV *sv, treasurelist * &v) { v = find_treasurelist (SvPV_nolen (sv)); }
361 355
362template<class T> 356template<class T>
363inline void sv_to (SV *sv, refptr<T> &v) { T *tmp; sv_to (sv, tmp); v = tmp; } 357inline void sv_to (SV *sv, refptr<T> &v) { T *tmp; sv_to (sv, tmp); v = tmp; }
364 358
365template<int N> 359template<int N>
501 if (!ext->cb) 495 if (!ext->cb)
502 ext->cb = newAV (); 496 ext->cb = newAV ();
503 497
504 return newRV_inc ((SV *)ext->cb); 498 return newRV_inc ((SV *)ext->cb);
505} 499}
506
507#if 0
508void attachable::clear ()
509{
510 if (self)
511 {
512 // disconnect Perl from C, to avoid crashes
513 sv_unmagic (SvRV ((SV *)self), PERL_MAGIC_ext);
514
515 // clear the perl hash, might or might not be a good idea
516 hv_clear ((HV *)SvRV ((SV *)self));
517
518 SvREFCNT_dec (self);
519 self = 0;
520 }
521
522 if (cb)
523 {
524 SvREFCNT_dec (cb);
525 cb = 0;
526 }
527
528 attach = 0;
529}
530#endif
531 500
532///////////////////////////////////////////////////////////////////////////// 501/////////////////////////////////////////////////////////////////////////////
533 502
534extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr) 503extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr)
535{ 504{
830} 799}
831 800
832///////////////////////////////////////////////////////////////////////////// 801/////////////////////////////////////////////////////////////////////////////
833 802
834void 803void
835maptile::emergency_save () 804cfperl_emergency_save ()
836{ 805{
837 CALL_BEGIN (0); 806 CALL_BEGIN (0);
838 CALL_CALL ("cf::map::emergency_save", G_VOID); 807 CALL_CALL ("cf::emergency_save", G_VOID);
839 CALL_END; 808 CALL_END;
840} 809}
841 810
842maptile * 811maptile *
843maptile::find_sync (const char *path, maptile *origin) 812maptile::find_sync (const char *path, maptile *origin)
844{ 813{
845 CALL_BEGIN (2); 814 CALL_BEGIN (2);
846 CALL_ARG (path); 815 CALL_ARG (path);
847 CALL_ARG (origin); 816 CALL_ARG (origin);
848 CALL_CALL ("cf::map::find_sync", G_SCALAR); 817 CALL_CALL ("cf::map::find_sync", G_SCALAR);
818
819 maptile *retval;
820
821 if (count)
822 sv_to (POPs, retval);
823 else
824 retval = 0;
825
826 CALL_END;
827
828 return retval;
829}
830
831maptile *
832maptile::find_async (const char *path, maptile *origin)
833{
834 CALL_BEGIN (2);
835 CALL_ARG (path);
836 CALL_ARG (origin);
837 CALL_CALL ("cf::map::find_async", G_SCALAR);
849 838
850 maptile *retval; 839 maptile *retval;
851 840
852 if (count) 841 if (count)
853 sv_to (POPs, retval); 842 sv_to (POPs, retval);
1258 const_iv (FLAG_ACTIVATE_ON_RELEASE) 1247 const_iv (FLAG_ACTIVATE_ON_RELEASE)
1259 const_iv (FLAG_IS_WATER) 1248 const_iv (FLAG_IS_WATER)
1260 const_iv (FLAG_CONTENT_ON_GEN) 1249 const_iv (FLAG_CONTENT_ON_GEN)
1261 const_iv (FLAG_IS_A_TEMPLATE) 1250 const_iv (FLAG_IS_A_TEMPLATE)
1262 const_iv (FLAG_IS_BUILDABLE) 1251 const_iv (FLAG_IS_BUILDABLE)
1252 const_iv (FLAG_DESTROY_ON_DEATH)
1253 const_iv (FLAG_NO_SAVE)
1263 1254
1264 const_iv (NDI_BLACK) 1255 const_iv (NDI_BLACK)
1265 const_iv (NDI_WHITE) 1256 const_iv (NDI_WHITE)
1266 const_iv (NDI_NAVY) 1257 const_iv (NDI_NAVY)
1267 const_iv (NDI_RED) 1258 const_iv (NDI_RED)
1561 1552
1562NV floor (NV x) 1553NV floor (NV x)
1563 1554
1564NV ceil (NV x) 1555NV ceil (NV x)
1565 1556
1557NV rndm (...)
1558 CODE:
1559 switch (items)
1560 {
1561 case 0: RETVAL = rndm (); break;
1562 case 1: RETVAL = rndm (SvUV (ST (0))); break;
1563 case 2: RETVAL = rndm (SvIV (ST (0)), SvIV (ST (1))); break;
1564 default: croak ("cf::rndm requires none, one or two parameters."); break;
1565 }
1566 OUTPUT:
1567 RETVAL
1568
1566void server_tick () 1569void server_tick ()
1567 CODE: 1570 CODE:
1568 runtime = SvNVx (sv_runtime); 1571 runtime = SvNVx (sv_runtime);
1569 server_tick (); 1572 server_tick ();
1570 1573
1616 } 1619 }
1617 OUTPUT: RETVAL 1620 OUTPUT: RETVAL
1618 1621
1619void abort () 1622void abort ()
1620 1623
1624void fork_abort (char *cause = "cf::fork_abort")
1625
1626void cleanup (const char *cause, bool make_core = false)
1627
1621void emergency_save () 1628void emergency_save ()
1622 1629
1623void _exit (int status = 0) 1630void _exit (int status = 0)
1624 1631
1625#if _POSIX_MEMLOCK 1632#if _POSIX_MEMLOCK
1715 PPCODE: 1722 PPCODE:
1716 EXTEND (SP, object::mortals.size ()); 1723 EXTEND (SP, object::mortals.size ());
1717 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i) 1724 for (AUTODECL (i, object::mortals.begin ()); i != object::mortals.end (); ++i)
1718 PUSHs (to_sv (*i)); 1725 PUSHs (to_sv (*i));
1719 1726
1720object *first () 1727int objects_size ()
1721 CODE: 1728 CODE:
1722 RETVAL = object::first; 1729 RETVAL = objects.size ();
1730 OUTPUT: RETVAL
1731
1732object *objects (U32 index)
1733 CODE:
1734 RETVAL = index < objects.size () ? objects [index] : 0;
1735 OUTPUT: RETVAL
1736
1737int actives_size ()
1738 CODE:
1739 RETVAL = actives.size ();
1740 OUTPUT: RETVAL
1741
1742object *actives (U32 index)
1743 CODE:
1744 RETVAL = index < actives.size () ? actives [index] : 0;
1723 OUTPUT: RETVAL 1745 OUTPUT: RETVAL
1724 1746
1725# missing properties 1747# missing properties
1726 1748
1727object *head (object *op) 1749object *head (object *op)
1728 PROTOTYPE: $ 1750 PROTOTYPE: $
1729 CODE: 1751 CODE:
1730 RETVAL = op->head ? op->head : op; 1752 RETVAL = op->head_ ();
1731 OUTPUT: RETVAL 1753 OUTPUT: RETVAL
1732 1754
1733int is_head (object *op) 1755int is_head (object *op)
1734 PROTOTYPE: $ 1756 PROTOTYPE: $
1735 CODE: 1757 CODE:
1736 RETVAL = !op->head; 1758 RETVAL = op->head_ () == op;
1737 OUTPUT: RETVAL 1759 OUTPUT: RETVAL
1738 1760
1739void 1761void
1740inv (object *obj) 1762inv (object *obj)
1741 PROTOTYPE: $ 1763 PROTOTYPE: $
1832 1854
1833void drop (object *who, object *op) 1855void drop (object *who, object *op)
1834 1856
1835void pick_up (object *who, object *op) 1857void pick_up (object *who, object *op)
1836 1858
1837object *cf_object_insert_object (object *op, object *container)
1838
1839object *cf_object_insert_in_ob (object *ob, object *where)
1840
1841int cf_object_teleport (object *op, maptile *map, int x, int y) 1859int cf_object_teleport (object *op, maptile *map, int x, int y)
1842 1860
1843void update_object (object *op, int action) 1861void update_object (object *op, int action)
1844 1862
1845object *cf_create_object_by_name (const char *name) 1863object *cf_create_object_by_name (const char *name)
1963 1981
1964void esrv_update_item (object *op, int what, object *item) 1982void esrv_update_item (object *op, int what, object *item)
1965 C_ARGS: what, op, item 1983 C_ARGS: what, op, item
1966 1984
1967void clear_los (object *op) 1985void clear_los (object *op)
1968
1969int command_teleport (object *op, char *params)
1970 1986
1971int command_summon (object *op, char *params) 1987int command_summon (object *op, char *params)
1972 1988
1973int command_arrest (object *op, char *params) 1989int command_arrest (object *op, char *params)
1974 1990
2117 2133
2118object* cf_map_present_arch_by_name (maptile *map, const char* str, int nx, int ny) 2134object* cf_map_present_arch_by_name (maptile *map, const char* str, int nx, int ny)
2119 C_ARGS: str, map, nx, ny 2135 C_ARGS: str, map, nx, ny
2120 2136
2121void 2137void
2122cf_map_normalise (maptile *map, int x, int y) 2138get_map_flags (maptile *map, int x, int y)
2123 PPCODE: 2139 PPCODE:
2124{ 2140{
2125 maptile *nmap = 0; 2141 maptile *nmap = 0;
2126 I16 nx = 0, ny = 0; 2142 I16 nx = 0, ny = 0;
2127 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny); 2143 int flags = get_map_flags (map, &nmap, x, y, &nx, &ny);
2189 CODE: 2205 CODE:
2190 RETVAL = get_name_of_region_for_map (m); 2206 RETVAL = get_name_of_region_for_map (m);
2191 OUTPUT: RETVAL 2207 OUTPUT: RETVAL
2192 2208
2193# worst xs function of my life 2209# worst xs function of my life
2194maptile * 2210bool
2195_create_random_map (\ 2211_create_random_map (\
2196 char *path,\ 2212 maptile *self,\
2197 char *wallstyle,\ 2213 char *wallstyle,\
2198 char *wall_name,\ 2214 char *wall_name,\
2199 char *floorstyle,\ 2215 char *floorstyle,\
2200 char *monsterstyle,\ 2216 char *monsterstyle,\
2201 char *treasurestyle,\ 2217 char *treasurestyle,\
2205 char *origin_map,\ 2221 char *origin_map,\
2206 char *final_map,\ 2222 char *final_map,\
2207 char *exitstyle,\ 2223 char *exitstyle,\
2208 char *this_map,\ 2224 char *this_map,\
2209 char *exit_on_final_map,\ 2225 char *exit_on_final_map,\
2210 int Xsize,\ 2226 int xsize,\
2211 int Ysize,\ 2227 int ysize,\
2212 int expand2x,\ 2228 int expand2x,\
2213 int layoutoptions1,\ 2229 int layoutoptions1,\
2214 int layoutoptions2,\ 2230 int layoutoptions2,\
2215 int layoutoptions3,\ 2231 int layoutoptions3,\
2216 int symmetry,\ 2232 int symmetry,\
2221 int dungeon_depth,\ 2237 int dungeon_depth,\
2222 int decoroptions,\ 2238 int decoroptions,\
2223 int orientation,\ 2239 int orientation,\
2224 int origin_y,\ 2240 int origin_y,\
2225 int origin_x,\ 2241 int origin_x,\
2226 int random_seed,\ 2242 U32 random_seed,\
2227 val64 total_map_hp,\ 2243 val64 total_map_hp,\
2228 int map_layout_style,\ 2244 int map_layout_style,\
2229 int treasureoptions,\ 2245 int treasureoptions,\
2230 int symmetry_used,\ 2246 int symmetry_used,\
2231 region *region\ 2247 region *region,\
2248 char *custom\
2232) 2249)
2233 CODE: 2250 CODE:
2234{ 2251{
2235 random_map_params rmp; 2252 random_map_params rmp;
2236 2253
2246 assign (rmp.exit_on_final_map, exit_on_final_map); 2263 assign (rmp.exit_on_final_map, exit_on_final_map);
2247 2264
2248 rmp.origin_map = origin_map; 2265 rmp.origin_map = origin_map;
2249 rmp.final_map = final_map; 2266 rmp.final_map = final_map;
2250 rmp.this_map = this_map; 2267 rmp.this_map = this_map;
2251 rmp.Xsize = Xsize; 2268 rmp.xsize = xsize;
2252 rmp.Ysize = Ysize; 2269 rmp.ysize = ysize;
2253 rmp.expand2x = expand2x; 2270 rmp.expand2x = expand2x;
2254 rmp.layoutoptions1 = layoutoptions1; 2271 rmp.layoutoptions1 = layoutoptions1;
2255 rmp.layoutoptions2 = layoutoptions2; 2272 rmp.layoutoptions2 = layoutoptions2;
2256 rmp.layoutoptions3 = layoutoptions3; 2273 rmp.layoutoptions3 = layoutoptions3;
2257 rmp.symmetry = symmetry; 2274 rmp.symmetry = symmetry;
2268 rmp.total_map_hp = total_map_hp; 2285 rmp.total_map_hp = total_map_hp;
2269 rmp.map_layout_style = map_layout_style; 2286 rmp.map_layout_style = map_layout_style;
2270 rmp.treasureoptions = treasureoptions; 2287 rmp.treasureoptions = treasureoptions;
2271 rmp.symmetry_used = symmetry_used; 2288 rmp.symmetry_used = symmetry_used;
2272 rmp.region = region; 2289 rmp.region = region;
2290 rmp.custom = custom;
2273 2291
2274 RETVAL = generate_random_map (path, &rmp); 2292 RETVAL = self->generate_random_map (&rmp);
2275} 2293}
2276 OUTPUT: 2294 OUTPUT:
2277 RETVAL 2295 RETVAL
2278 2296
2279MODULE = cf PACKAGE = cf::arch 2297MODULE = cf PACKAGE = cf::arch

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines