… | |
… | |
80 | // all objects no longer referenced and empty are |
80 | // all objects no longer referenced and empty are |
81 | // eligible for destruction. |
81 | // eligible for destruction. |
82 | void |
82 | void |
83 | clean_obj_cache () |
83 | clean_obj_cache () |
84 | { |
84 | { |
85 | return; //D // killing neko-san gives me an unreferenced scalar |
85 | static int count; |
|
|
86 | |
|
|
87 | if (++count & 7) |
|
|
88 | return; |
|
|
89 | |
86 | int todo = 10; |
90 | int todo = 1000; |
87 | do |
91 | do |
88 | { |
92 | { |
89 | I32 klen; |
93 | I32 klen; |
90 | char *key; |
94 | char *key; |
91 | HE *he = hv_iternext (obj_cache); |
95 | HE *he = hv_iternext (obj_cache); |
92 | |
96 | |
93 | if (he) |
97 | if (he) |
94 | { |
98 | { |
95 | SV *sv = hv_iterval (obj_cache, he); |
99 | SV *sv = hv_iterval (obj_cache, he); |
96 | |
100 | |
97 | // emopty and unreferened? nuke it |
101 | // empty and unreferenced? nuke it |
98 | if (SvREFCNT (sv) == 1 && SvREFCNT (SvRV (sv)) == 1 && !HvFILL ((HV *)(SvRV (sv)))) |
102 | if (SvREFCNT (sv) == 1 && SvREFCNT (SvRV (sv)) == 1 && !HvFILL ((HV *)(SvRV (sv)))) |
99 | { |
103 | { |
100 | hv_delete (obj_cache, HeKEY (he), HeKLEN (he), G_DISCARD); |
104 | hv_delete (obj_cache, HeKEY (he), HeKLEN (he), G_DISCARD); |
101 | todo++; |
105 | todo++; |
102 | } |
106 | } |
… | |
… | |
108 | } |
112 | } |
109 | |
113 | |
110 | static SV * |
114 | static SV * |
111 | newSVptr (void *ptr, const char *klass) |
115 | newSVptr (void *ptr, const char *klass) |
112 | { |
116 | { |
|
|
117 | SV *sv; |
|
|
118 | |
113 | if (!ptr) |
119 | if (!ptr) |
114 | return &PL_sv_undef; |
120 | return &PL_sv_undef; |
115 | |
121 | |
116 | HV *hv = newHV (); |
122 | sv = newSV (0); |
117 | sv_magic ((SV *)hv, 0, PERL_MAGIC_ext, (char *)ptr, 0); |
123 | sv_magic (sv, 0, PERL_MAGIC_ext, (char *)ptr, 0); |
118 | return sv_bless (newRV_noinc ((SV *)hv), gv_stashpv (klass, 1)); |
124 | return sv_bless (newRV_noinc (sv), gv_stashpv (klass, 1)); |
119 | } |
125 | } |
120 | |
126 | |
121 | static SV * |
127 | static SV * |
122 | newSVptr_cached (void *ptr, const char *klass) |
128 | newSVptr_cached (void *ptr, const char *klass) |
123 | { |
129 | { |
… | |
… | |
130 | |
136 | |
131 | if (he) |
137 | if (he) |
132 | sv = *he; |
138 | sv = *he; |
133 | else |
139 | else |
134 | { |
140 | { |
135 | return sv; //D |
141 | HV *hv = newHV (); |
136 | sv = newSVptr (ptr, klass); |
142 | sv_magic ((SV *)hv, 0, PERL_MAGIC_ext, (char *)ptr, 0); |
|
|
143 | sv = sv_bless (newRV_noinc ((SV *)hv), gv_stashpv (klass, 1)); |
137 | hv_store (obj_cache, (char *)&ptr, sizeof (ptr), sv, 0); |
144 | hv_store (obj_cache, (char *)&ptr, sizeof (ptr), sv, 0); |
138 | } |
145 | } |
139 | |
146 | |
140 | return newSVsv (sv); |
147 | return newSVsv (sv); |
141 | } |
148 | } |
… | |
… | |
519 | |
526 | |
520 | va_end (args); |
527 | va_end (args); |
521 | |
528 | |
522 | if (context.event_code == EVENT_FREE_OB) |
529 | if (context.event_code == EVENT_FREE_OB) |
523 | { |
530 | { |
524 | SV *sv = hv_delete (obj_cache, (char *)&context.activator, sizeof (object *), 0); |
531 | SV *sv = hv_delete (obj_cache, (char *)&context.activator, sizeof (void *), 0); |
525 | |
532 | |
526 | if (sv) |
533 | if (sv) |
527 | { |
|
|
528 | clearSVptr (sv); |
534 | clearSVptr (sv); |
529 | SvREFCNT_dec (sv); |
|
|
530 | } |
|
|
531 | } |
535 | } |
532 | else |
536 | else |
533 | inject_event ("cf::inject_global_event", &context); |
537 | inject_event ("cf::inject_global_event", &context); |
534 | |
538 | |
535 | rv = context.returnvalue; |
539 | rv = context.returnvalue; |
… | |
… | |
1176 | int cf_object_get_flag (object *op, int flag) |
1180 | int cf_object_get_flag (object *op, int flag) |
1177 | ALIAS: flag = 0 |
1181 | ALIAS: flag = 0 |
1178 | |
1182 | |
1179 | void cf_object_set_flag (object *op, int flag, int value) |
1183 | void cf_object_set_flag (object *op, int flag, int value) |
1180 | |
1184 | |
1181 | void cf_object_move (object *op, int dir, object *originator) |
1185 | void cf_object_move (object *op, int dir, object *originator = op) |
1182 | |
1186 | |
1183 | void cf_object_apply (object *op, object *author, int flags = 0) |
1187 | void cf_object_apply (object *op, object *author, int flags = 0) |
1184 | |
1188 | |
1185 | void cf_object_apply_below (object *op) |
1189 | void cf_object_apply_below (object *op) |
1186 | |
1190 | |
… | |
… | |
1271 | |
1275 | |
1272 | object *cf_insert_ob_in_ob (object *ob, object *where) |
1276 | object *cf_insert_ob_in_ob (object *ob, object *where) |
1273 | |
1277 | |
1274 | object *get_nearest_player (object *ob) |
1278 | object *get_nearest_player (object *ob) |
1275 | ALIAS: nearest_player = 0 |
1279 | ALIAS: nearest_player = 0 |
|
|
1280 | PREINIT: |
|
|
1281 | extern object *get_nearest_player (object *); |
1276 | |
1282 | |
1277 | void rangevector (object *ob, object *other, int flags = 0) |
1283 | void rangevector (object *ob, object *other, int flags = 0) |
1278 | PROTOTYPE: $$;$ |
1284 | PROTOTYPE: $$;$ |
1279 | PPCODE: |
1285 | PPCODE: |
1280 | { |
1286 | { |