Commit a2cfc9a9 authored by cremno's avatar cremno

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
parent 7c9a1acc
......@@ -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 */
#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,7 +1281,7 @@ 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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment