mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
8d10056aff
Introduce "object shapes" (hidden classes) that share IV key layouts across objects with the same instance variable assignment order. This eliminates per-object key storage overhead. Memory savings: ~22% heap reduction for object-heavy workloads (e.g., 150k objects with 2-6 IVs). Per-object: 40->24 bytes for 2 IVs. Objects exceeding 16 IVs or using remove_instance_variable fall back to traditional iv_tbl. Co-authored-by: Claude <noreply@anthropic.com>
50 lines
1.2 KiB
C
50 lines
1.2 KiB
C
/**
|
|
** @file mruby/object.h - mruby object definition
|
|
**
|
|
** See Copyright Notice in mruby.h
|
|
*/
|
|
|
|
#ifndef MRUBY_OBJECT_H
|
|
#define MRUBY_OBJECT_H
|
|
|
|
#define MRB_OBJECT_HEADER \
|
|
struct RClass *c; \
|
|
enum mrb_vtype tt:8; \
|
|
unsigned int gc_color:3; \
|
|
unsigned int frozen:1; \
|
|
uint32_t flags:20
|
|
|
|
#define MRB_FLAG_TEST(obj, flag) ((obj)->flags & (flag))
|
|
|
|
struct RBasic {
|
|
MRB_OBJECT_HEADER;
|
|
};
|
|
#define mrb_basic_ptr(v) ((struct RBasic*)(mrb_ptr(v)))
|
|
|
|
#define MRB_OBJ_IS_FROZEN 1
|
|
#define mrb_frozen_p(o) ((o)->frozen)
|
|
|
|
/* Object shape flag -- when set, obj->iv is shaped, not iv_tbl* */
|
|
/* Bit 5: avoids conflict with MRB_INSTANCE_TT_MASK (bits 0-4) */
|
|
#define MRB_FL_OBJ_SHAPED (1 << 5)
|
|
#define MRB_OBJ_SHAPED_P(o) ((o)->flags & MRB_FL_OBJ_SHAPED)
|
|
|
|
struct RObject {
|
|
MRB_OBJECT_HEADER;
|
|
struct iv_tbl *iv;
|
|
};
|
|
#define mrb_obj_ptr(v) ((struct RObject*)(mrb_ptr(v)))
|
|
|
|
#define mrb_special_const_p(x) mrb_immediate_p(x)
|
|
|
|
struct RFiber {
|
|
MRB_OBJECT_HEADER;
|
|
struct mrb_context *cxt;
|
|
};
|
|
|
|
#define mrb_static_assert_object_size(st) \
|
|
mrb_static_assert(sizeof(st) <= sizeof(void*) * 5, \
|
|
#st " size must be within 5 words")
|
|
|
|
#endif /* MRUBY_OBJECT_H */
|