mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
rework mruby-objectspace and gc.[ch]
- functions should have C linkage (for C++ code) - add prefix to each_object_callback - use more appropriate variable types / initialization - ObjectSpace::count_objects has 1 opt. arg. - prefer mrb_intern_lit to mrb_intern_cstr for str. lit. - mruby/value.h is included by mruby.h - adjust coding style
This commit is contained in:
+9
-4
@@ -7,11 +7,16 @@
|
||||
#ifndef MRUBY_GC_H
|
||||
#define MRUBY_GC_H
|
||||
|
||||
#include "mruby.h"
|
||||
#include "mruby/value.h"
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef void (each_object_callback)(mrb_state *mrb, struct RBasic* obj, void *data);
|
||||
void mrb_objspace_each_objects(mrb_state *mrb, each_object_callback* callback, void *data);
|
||||
typedef void (mrb_each_object_callback)(mrb_state *mrb, struct RBasic *obj, void *data);
|
||||
void mrb_objspace_each_objects(mrb_state *mrb, mrb_each_object_callback *callback, void *data);
|
||||
void mrb_free_context(mrb_state *mrb, struct mrb_context *c);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
} /* extern "C" { */
|
||||
#endif
|
||||
|
||||
#endif /* MRUBY_GC_H */
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
#include <mruby.h>
|
||||
#include <mruby/gc.h>
|
||||
#include <mruby/hash.h>
|
||||
#include <mruby/value.h>
|
||||
|
||||
struct os_count_struct {
|
||||
size_t total;
|
||||
size_t freed;
|
||||
size_t counts[MRB_TT_MAXDEFINE+1];
|
||||
mrb_int total;
|
||||
mrb_int freed;
|
||||
mrb_int counts[MRB_TT_MAXDEFINE+1];
|
||||
};
|
||||
|
||||
void
|
||||
os_count_object_type(mrb_state *mrb, struct RBasic* obj, void *data)
|
||||
static void
|
||||
os_count_object_type(mrb_state *mrb, struct RBasic *obj, void *data)
|
||||
{
|
||||
struct os_count_struct* obj_count;
|
||||
obj_count = (struct os_count_struct*)(data);
|
||||
struct os_count_struct *obj_count;
|
||||
obj_count = (struct os_count_struct*)data;
|
||||
|
||||
if (is_dead(mrb, obj)) {
|
||||
obj_count->freed++;
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
obj_count->counts[obj->tt]++;
|
||||
obj_count->total++;
|
||||
}
|
||||
@@ -43,11 +43,11 @@ os_count_object_type(mrb_state *mrb, struct RBasic* obj, void *data)
|
||||
*
|
||||
*/
|
||||
|
||||
mrb_value
|
||||
static mrb_value
|
||||
os_count_objects(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
struct os_count_struct obj_count;
|
||||
size_t i;
|
||||
struct os_count_struct obj_count = { 0 };
|
||||
enum mrb_vtype i;
|
||||
mrb_value hash;
|
||||
|
||||
if (mrb_get_args(mrb, "|H", &hash) == 0) {
|
||||
@@ -58,21 +58,15 @@ os_count_objects(mrb_state *mrb, mrb_value self)
|
||||
mrb_hash_clear(mrb, hash);
|
||||
}
|
||||
|
||||
for (i = 0; i <= MRB_TT_MAXDEFINE; i++) {
|
||||
obj_count.counts[i] = 0;
|
||||
}
|
||||
obj_count.total = 0;
|
||||
obj_count.freed = 0;
|
||||
|
||||
mrb_objspace_each_objects(mrb, os_count_object_type, &obj_count);
|
||||
|
||||
mrb_hash_set(mrb, hash, mrb_symbol_value(mrb_intern_cstr(mrb, "TOTAL")), mrb_fixnum_value(obj_count.total));
|
||||
mrb_hash_set(mrb, hash, mrb_symbol_value(mrb_intern_cstr(mrb, "FREE")), mrb_fixnum_value(obj_count.freed));
|
||||
mrb_hash_set(mrb, hash, mrb_symbol_value(mrb_intern_lit(mrb, "TOTAL")), mrb_fixnum_value(obj_count.total));
|
||||
mrb_hash_set(mrb, hash, mrb_symbol_value(mrb_intern_lit(mrb, "FREE")), mrb_fixnum_value(obj_count.freed));
|
||||
|
||||
for (i = 0; i < MRB_TT_MAXDEFINE; i++) {
|
||||
for (i = MRB_TT_FALSE; i < MRB_TT_MAXDEFINE; i++) {
|
||||
mrb_value type;
|
||||
switch (i) {
|
||||
#define COUNT_TYPE(t) case (t): type = mrb_symbol_value(mrb_intern_cstr(mrb, #t)); break;
|
||||
#define COUNT_TYPE(t) case (t): type = mrb_symbol_value(mrb_intern_lit(mrb, #t)); break;
|
||||
COUNT_TYPE(MRB_TT_FALSE);
|
||||
COUNT_TYPE(MRB_TT_FREE);
|
||||
COUNT_TYPE(MRB_TT_TRUE);
|
||||
@@ -107,11 +101,13 @@ os_count_objects(mrb_state *mrb, mrb_value self)
|
||||
}
|
||||
|
||||
void
|
||||
mrb_mruby_objectspace_gem_init(mrb_state* mrb) {
|
||||
mrb_mruby_objectspace_gem_init(mrb_state *mrb)
|
||||
{
|
||||
struct RClass *os = mrb_define_module(mrb, "ObjectSpace");
|
||||
mrb_define_class_method(mrb, os, "count_objects", os_count_objects, MRB_ARGS_ANY());
|
||||
mrb_define_class_method(mrb, os, "count_objects", os_count_objects, MRB_ARGS_OPT(1));
|
||||
}
|
||||
|
||||
void
|
||||
mrb_mruby_objectspace_gem_final(mrb_state* mrb) {
|
||||
mrb_mruby_objectspace_gem_final(mrb_state *mrb)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1281,21 +1281,21 @@ gc_generational_mode_set(mrb_state *mrb, mrb_value self)
|
||||
}
|
||||
|
||||
void
|
||||
mrb_objspace_each_objects(mrb_state *mrb, each_object_callback* callback, void *data)
|
||||
mrb_objspace_each_objects(mrb_state *mrb, mrb_each_object_callback *callback, void *data)
|
||||
{
|
||||
struct heap_page* page = mrb->heaps;
|
||||
struct heap_page* page = mrb->heaps;
|
||||
|
||||
while (page != NULL) {
|
||||
RVALUE *p, *pend;
|
||||
while (page != NULL) {
|
||||
RVALUE *p, *pend;
|
||||
|
||||
p = page->objects;
|
||||
pend = p + MRB_HEAP_PAGE_SIZE;
|
||||
for (;p < pend; p++) {
|
||||
(*callback)(mrb, &p->as.basic, data);
|
||||
}
|
||||
|
||||
page = page->next;
|
||||
p = page->objects;
|
||||
pend = p + MRB_HEAP_PAGE_SIZE;
|
||||
for (;p < pend; p++) {
|
||||
(*callback)(mrb, &p->as.basic, data);
|
||||
}
|
||||
|
||||
page = page->next;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef GC_TEST
|
||||
|
||||
Reference in New Issue
Block a user