Tilemap/VX: Ensure proxy objects don't outlive their parents
Either of these would previously crash (same for VX): tm = Tilemap.new at = tm.autotiles tm = nil GC.start at[0] = Bitmap.new(1, 1) tm = Tilemap.new at = tm.autotiles tm.dispose at[0] = Bitmap.new(1, 1) Funnily, this makes RMXP itself crash too, but crashing is never acceptable except for possibly resource exhaustion.
This commit is contained in:
parent
e9d0d0566b
commit
9758e660c4
9 changed files with 41 additions and 12 deletions
|
@ -41,6 +41,7 @@ struct
|
|||
SYMD(tone),
|
||||
SYMD(rect),
|
||||
SYMD(src_rect),
|
||||
SYMD(tilemap),
|
||||
SYMD(tileset),
|
||||
SYMD(autotiles),
|
||||
SYMD(map_data),
|
||||
|
|
|
@ -42,6 +42,7 @@ enum CommonSymbol
|
|||
CStone,
|
||||
CSrect,
|
||||
CSsrc_rect,
|
||||
CStilemap,
|
||||
CStileset,
|
||||
CSautotiles,
|
||||
CSmap_data,
|
||||
|
|
|
@ -93,13 +93,18 @@ MRB_METHOD(tilemapInitialize)
|
|||
|
||||
wrapProperty(mrb, self, &t->getAutotiles(), CSautotiles, TilemapAutotilesType);
|
||||
|
||||
mrb_value autotilesObj = mrb_iv_get(mrb, self, getMrbData(mrb)->symbols[CSautotiles]);
|
||||
MrbData &mrbData = *getMrbData(mrb);
|
||||
mrb_value autotilesObj = mrb_iv_get(mrb, self, mrbData.symbols[CSautotiles]);
|
||||
|
||||
mrb_value ary = mrb_ary_new_capa(mrb, 7);
|
||||
for (int i = 0; i < 7; ++i)
|
||||
mrb_ary_push(mrb, ary, mrb_nil_value());
|
||||
|
||||
mrb_iv_set(mrb, autotilesObj, getMrbData(mrb)->symbols[CSarray], ary);
|
||||
mrb_iv_set(mrb, autotilesObj, mrbData.symbols[CSarray], ary);
|
||||
|
||||
/* Circular reference so both objects are always
|
||||
* alive at the same time */
|
||||
mrb_iv_set(mrb, autotilesObj, mrbData.symbols[CStilemap], self);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue