memprof 0.3.2 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -35,14 +35,6 @@ static st_table *objs = NULL;
35
35
  /*
36
36
  * stuff needed for heap dumping
37
37
  */
38
- static double
39
- rb_timeofday()
40
- {
41
- struct timeval tv;
42
- gettimeofday(&tv, NULL);
43
- return (double)tv.tv_sec + (double)tv.tv_usec * 1e-6;
44
- }
45
-
46
38
  static VALUE (*rb_classname)(VALUE);
47
39
  static RUBY_DATA_FUNC *rb_bm_mark;
48
40
  static RUBY_DATA_FUNC *rb_blk_free;
@@ -241,7 +233,6 @@ static VALUE
241
233
  memprof_start(VALUE self)
242
234
  {
243
235
  if (!memprof_started) {
244
-
245
236
  insert_tramp("rb_newobj", newobj_tramp);
246
237
  insert_tramp("add_freelist", freelist_tramp);
247
238
  memprof_started = 1;
@@ -329,6 +320,19 @@ memprof_stats_bang(int argc, VALUE *argv, VALUE self)
329
320
  return Qnil;
330
321
  }
331
322
 
323
+ static void
324
+ json_print(void *ctx, const char * str, unsigned int len)
325
+ {
326
+ FILE *out = (FILE *)ctx;
327
+ size_t written = 0;
328
+ while(1) {
329
+ written += fwrite(str + written, sizeof(char), len - written, out ? out : stdout);
330
+ if (written == len) break;
331
+ }
332
+ if (str && len > 0 && str[0] == '\n' && out)
333
+ fflush(out);
334
+ }
335
+
332
336
  static VALUE
333
337
  memprof_track(int argc, VALUE *argv, VALUE self)
334
338
  {
@@ -342,22 +346,208 @@ memprof_track(int argc, VALUE *argv, VALUE self)
342
346
  return Qnil;
343
347
  }
344
348
 
349
+ static json_gen_config fancy_conf = { .beautify = 1, .indentString = " " };
350
+ static json_gen_config basic_conf = { .beautify = 0, .indentString = " " };
351
+
352
+ static json_gen
353
+ json_for_args(int argc, VALUE *argv)
354
+ {
355
+ FILE *out = NULL;
356
+ VALUE str;
357
+ rb_scan_args(argc, argv, "01", &str);
358
+
359
+ if (RTEST(str)) {
360
+ out = fopen(StringValueCStr(str), "w");
361
+ if (!out)
362
+ rb_raise(rb_eArgError, "unable to open output file");
363
+ }
364
+
365
+ if (!out)
366
+ out = stderr;
367
+
368
+ json_gen gen = json_gen_alloc2((json_print_t)&json_print, out == stderr ? &fancy_conf : &basic_conf, NULL, (void*)out);
369
+
370
+ return gen;
371
+ }
372
+
373
+ static void
374
+ json_free(json_gen gen)
375
+ {
376
+ FILE *out = (FILE*)gen->ctx;
377
+ if (out != stderr)
378
+ fclose(out);
379
+ json_gen_free(gen);
380
+ }
381
+
345
382
  static VALUE
346
- memprof_track_fun(int argc, VALUE *argv, VALUE self)
383
+ memprof_trace(int argc, VALUE *argv, VALUE self)
347
384
  {
348
385
  if (!rb_block_given_p())
349
386
  rb_raise(rb_eArgError, "block required");
350
387
 
388
+ json_gen gen = json_for_args(argc, argv);
389
+
390
+ trace_set_output(gen);
391
+ json_gen_map_open(gen);
392
+
393
+ trace_invoke_all(TRACE_RESET);
351
394
  trace_invoke_all(TRACE_START);
352
- rb_yield(Qnil);
395
+
396
+ VALUE ret = rb_yield(Qnil);
397
+
353
398
  trace_invoke_all(TRACE_DUMP);
354
399
  trace_invoke_all(TRACE_STOP);
400
+
401
+ json_gen_map_close(gen);
402
+ json_gen_reset(gen);
403
+
404
+ json_free(gen);
405
+ trace_set_output(NULL);
406
+
407
+ return ret;
408
+ }
409
+
410
+ static int
411
+ each_request_entry(st_data_t key, st_data_t record, st_data_t arg)
412
+ {
413
+ json_gen gen = (json_gen)arg;
414
+ VALUE k = (VALUE)key;
415
+ VALUE v = (VALUE)record;
416
+
417
+ if (RTEST(v) && BUILTIN_TYPE(v) == T_STRING && RTEST(k) && BUILTIN_TYPE(k) == T_STRING &&
418
+ RSTRING_PTR(k)[0] >= 65 && RSTRING_PTR(k)[0] <= 90) {
419
+ json_gen_cstr(gen, StringValueCStr(k));
420
+ json_gen_cstr(gen, StringValueCStr(v));
421
+ }
422
+
423
+ return ST_CONTINUE;
424
+ }
425
+
426
+ static VALUE tracing_json_filename = Qnil;
427
+ static json_gen tracing_json_gen = NULL;
428
+
429
+ static VALUE
430
+ memprof_trace_filename_set(int argc, VALUE *argv, VALUE self)
431
+ {
432
+ if (tracing_json_gen) {
433
+ json_free(tracing_json_gen);
434
+ tracing_json_gen = NULL;
435
+ }
436
+
437
+ if (!RTEST(*argv)) {
438
+ tracing_json_filename = Qnil;
439
+ } else {
440
+ tracing_json_gen = json_for_args(argc, argv);
441
+ tracing_json_filename = *argv;
442
+ }
443
+
444
+ return tracing_json_filename;
445
+ }
446
+
447
+ static VALUE
448
+ memprof_trace_filename_get(VALUE self)
449
+ {
450
+ return tracing_json_filename;
451
+ }
452
+
453
+ static VALUE
454
+ memprof_trace_request(VALUE self, VALUE env)
455
+ {
456
+ if (!rb_block_given_p())
457
+ rb_raise(rb_eArgError, "block required");
458
+
459
+ double secs;
460
+ struct timeval now;
461
+
462
+ json_gen gen;
463
+ if (tracing_json_gen)
464
+ gen = tracing_json_gen;
465
+ else
466
+ gen = json_for_args(0, NULL);
467
+
468
+ json_gen_map_open(gen);
469
+
470
+ json_gen_cstr(gen, "start");
471
+ gettimeofday(&now, NULL);
472
+ json_gen_integer(gen, (now.tv_sec * 1000000) + now.tv_usec);
473
+
474
+ json_gen_cstr(gen, "tracers");
475
+ json_gen_map_open(gen);
476
+
477
+ trace_set_output(gen);
355
478
  trace_invoke_all(TRACE_RESET);
356
- return Qnil;
479
+ trace_invoke_all(TRACE_START);
480
+
481
+ secs = timeofday();
482
+ VALUE ret = rb_yield(Qnil);
483
+ secs = timeofday() - secs;
484
+
485
+ trace_invoke_all(TRACE_DUMP);
486
+ trace_invoke_all(TRACE_STOP);
487
+
488
+ json_gen_map_close(gen);
489
+
490
+ if (RTEST(env) && BUILTIN_TYPE(env) == T_HASH) {
491
+ VALUE val, str;
492
+ val = rb_hash_aref(env, rb_str_new2("action_controller.request.path_parameters"));
493
+ if (!RTEST(val))
494
+ val = rb_hash_aref(env, rb_str_new2("action_dispatch.request.parameters"));
495
+
496
+ if (RTEST(val) && BUILTIN_TYPE(val) == T_HASH) {
497
+ json_gen_cstr(gen, "rails");
498
+ json_gen_map_open(gen);
499
+ str = rb_hash_aref(val, rb_str_new2("controller"));
500
+ if (RTEST(str) && BUILTIN_TYPE(str) == T_STRING) {
501
+ json_gen_cstr(gen, "controller");
502
+ json_gen_cstr(gen, RSTRING_PTR(str));
503
+ }
504
+
505
+ str = rb_hash_aref(val, rb_str_new2("action"));
506
+ if (RTEST(str) && BUILTIN_TYPE(str) == T_STRING) {
507
+ json_gen_cstr(gen, "action");
508
+ json_gen_cstr(gen, RSTRING_PTR(str));
509
+ }
510
+ json_gen_map_close(gen);
511
+ }
512
+
513
+ json_gen_cstr(gen, "request");
514
+ json_gen_map_open(gen);
515
+ // struct RHash *hash = RHASH(env);
516
+ // st_foreach(hash->tbl, each_request_entry, (st_data_t)gen);
517
+
518
+ #define DUMP_HASH_ENTRY(key) do { \
519
+ str = rb_hash_aref(env, rb_str_new2(key)); \
520
+ if (RTEST(str) && \
521
+ BUILTIN_TYPE(str) == T_STRING && \
522
+ RSTRING_PTR(str)) { \
523
+ json_gen_cstr(gen, key); \
524
+ json_gen_cstr(gen, RSTRING_PTR(str)); \
525
+ } \
526
+ } while(0)
527
+ // DUMP_HASH_ENTRY("HTTP_USER_AGENT");
528
+ DUMP_HASH_ENTRY("REQUEST_PATH");
529
+ DUMP_HASH_ENTRY("PATH_INFO");
530
+ DUMP_HASH_ENTRY("REMOTE_ADDR");
531
+ DUMP_HASH_ENTRY("REQUEST_URI");
532
+ DUMP_HASH_ENTRY("REQUEST_METHOD");
533
+ DUMP_HASH_ENTRY("QUERY_STRING");
534
+
535
+ json_gen_map_close(gen);
536
+ }
537
+
538
+ json_gen_cstr(gen, "time");
539
+ json_gen_double(gen, secs);
540
+
541
+ json_gen_map_close(gen);
542
+ json_gen_reset(gen);
543
+
544
+ if (gen != tracing_json_gen)
545
+ json_free(gen);
546
+
547
+ return ret;
357
548
  }
358
549
 
359
- #include <yajl/yajl_gen.h>
360
- #include <stdarg.h>
550
+ #include "json.h"
361
551
  #include "env.h"
362
552
  #include "rubyio.h"
363
553
  #include "re.h"
@@ -378,118 +568,46 @@ memprof_track_fun(int argc, VALUE *argv, VALUE self)
378
568
  #define RSTRING_LEN(str) RSTRING(str)->len
379
569
  #endif
380
570
 
381
- /* HAX: copied from internal yajl_gen.c (PATCH yajl before building instead)
382
- */
383
-
384
- typedef enum {
385
- yajl_gen_start,
386
- yajl_gen_map_start,
387
- yajl_gen_map_key,
388
- yajl_gen_map_val,
389
- yajl_gen_array_start,
390
- yajl_gen_in_array,
391
- yajl_gen_complete,
392
- yajl_gen_error
393
- } yajl_gen_state;
394
-
395
- struct yajl_gen_t
396
- {
397
- unsigned int depth;
398
- unsigned int pretty;
399
- const char * indentString;
400
- yajl_gen_state state[YAJL_MAX_DEPTH];
401
- yajl_print_t print;
402
- void * ctx; /* yajl_buf */
403
- /* memory allocation routines */
404
- yajl_alloc_funcs alloc;
405
- };
406
-
407
- static void
408
- yajl_gen_reset(yajl_gen gen)
409
- {
410
- yajl_gen_clear(gen);
411
- assert (gen->state[gen->depth] == yajl_gen_complete);
412
- gen->state[gen->depth] = yajl_gen_start;
413
- gen->print(gen->ctx, "\n", 1);
414
- }
415
-
416
- /* END HAX
417
- */
418
-
419
- static yajl_gen_status
420
- yajl_gen_cstr(yajl_gen gen, const char * str)
421
- {
422
- if (!str || str[0] == 0)
423
- return yajl_gen_null(gen);
424
- else
425
- return yajl_gen_string(gen, (unsigned char *)str, strlen(str));
426
- }
427
-
428
- static yajl_gen_status
429
- yajl_gen_format(yajl_gen gen, char *format, ...)
430
- {
431
- va_list args;
432
- char *str;
433
- int bytes_printed = 0;
434
-
435
- yajl_gen_status ret;
436
-
437
- va_start(args, format);
438
- bytes_printed = vasprintf(&str, format, args);
439
- assert(bytes_printed != -1);
440
- va_end(args);
441
-
442
- ret = yajl_gen_string(gen, (unsigned char *)str, strlen(str));
443
- free(str);
444
- return ret;
445
- }
446
-
447
- static yajl_gen_status
448
- yajl_gen_id(yajl_gen gen, ID id)
571
+ static json_gen_status
572
+ json_gen_id(json_gen gen, ID id)
449
573
  {
450
574
  if (id) {
451
575
  if (id < 100)
452
- return yajl_gen_format(gen, ":%c", id);
576
+ return json_gen_format(gen, ":%c", id);
453
577
  else
454
- return yajl_gen_format(gen, ":%s", rb_id2name(id));
578
+ return json_gen_format(gen, ":%s", rb_id2name(id));
455
579
  } else
456
- return yajl_gen_null(gen);
457
- }
458
-
459
- static yajl_gen_status
460
- yajl_gen_pointer(yajl_gen gen, void* ptr)
461
- {
462
- return yajl_gen_format(gen, "0x%x", ptr);
580
+ return json_gen_null(gen);
463
581
  }
464
582
 
465
- static yajl_gen_status
466
- yajl_gen_value(yajl_gen gen, VALUE obj)
583
+ static json_gen_status
584
+ json_gen_value(json_gen gen, VALUE obj)
467
585
  {
468
586
  if (FIXNUM_P(obj))
469
- return yajl_gen_integer(gen, NUM2LONG(obj));
587
+ return json_gen_integer(gen, NUM2LONG(obj));
470
588
  else if (NIL_P(obj) || obj == Qundef)
471
- return yajl_gen_null(gen);
589
+ return json_gen_null(gen);
472
590
  else if (obj == Qtrue)
473
- return yajl_gen_bool(gen, 1);
591
+ return json_gen_bool(gen, 1);
474
592
  else if (obj == Qfalse)
475
- return yajl_gen_bool(gen, 0);
593
+ return json_gen_bool(gen, 0);
476
594
  else if (SYMBOL_P(obj))
477
- return yajl_gen_id(gen, SYM2ID(obj));
595
+ return json_gen_id(gen, SYM2ID(obj));
478
596
  else
479
- return yajl_gen_pointer(gen, (void*)obj);
597
+ return json_gen_pointer(gen, (void*)obj);
480
598
  }
481
599
 
482
600
  static int
483
601
  each_hash_entry(st_data_t key, st_data_t record, st_data_t arg)
484
602
  {
485
- yajl_gen gen = (yajl_gen)arg;
603
+ json_gen gen = (json_gen)arg;
486
604
  VALUE k = (VALUE)key;
487
605
  VALUE v = (VALUE)record;
488
606
 
489
- yajl_gen_array_open(gen);
490
- yajl_gen_value(gen, k);
491
- yajl_gen_value(gen, v);
492
- yajl_gen_array_close(gen);
607
+ json_gen_array_open(gen);
608
+ json_gen_value(gen, k);
609
+ json_gen_value(gen, v);
610
+ json_gen_array_close(gen);
493
611
 
494
612
  return ST_CONTINUE;
495
613
  }
@@ -497,13 +615,13 @@ each_hash_entry(st_data_t key, st_data_t record, st_data_t arg)
497
615
  static int
498
616
  each_ivar(st_data_t key, st_data_t record, st_data_t arg)
499
617
  {
500
- yajl_gen gen = (yajl_gen)arg;
618
+ json_gen gen = (json_gen)arg;
501
619
  ID id = (ID)key;
502
620
  VALUE val = (VALUE)record;
503
621
  const char *name = rb_id2name(id);
504
622
 
505
- yajl_gen_cstr(gen, name ? name : "(none)");
506
- yajl_gen_value(gen, val);
623
+ json_gen_cstr(gen, name ? name : "(none)");
624
+ json_gen_value(gen, val);
507
625
 
508
626
  return ST_CONTINUE;
509
627
  }
@@ -546,16 +664,16 @@ nd_type_str(VALUE obj)
546
664
  }
547
665
 
548
666
  static inline void
549
- obj_dump_class(yajl_gen gen, VALUE obj)
667
+ obj_dump_class(json_gen gen, VALUE obj)
550
668
  {
551
669
  if (RBASIC(obj)->klass) {
552
- yajl_gen_cstr(gen, "class");
553
- yajl_gen_value(gen, RBASIC(obj)->klass);
670
+ json_gen_cstr(gen, "class");
671
+ json_gen_value(gen, RBASIC(obj)->klass);
554
672
 
555
673
  VALUE name = rb_classname(RBASIC(obj)->klass);
556
674
  if (RTEST(name)) {
557
- yajl_gen_cstr(gen, "class_name");
558
- yajl_gen_cstr(gen, RSTRING_PTR(name));
675
+ json_gen_cstr(gen, "class_name");
676
+ json_gen_cstr(gen, RSTRING_PTR(name));
559
677
  }
560
678
  }
561
679
  }
@@ -568,33 +686,33 @@ obj_dump_class(yajl_gen gen, VALUE obj)
568
686
  */
569
687
 
570
688
  static void
571
- obj_dump(VALUE obj, yajl_gen gen)
689
+ obj_dump(VALUE obj, json_gen gen)
572
690
  {
573
691
  int type;
574
- yajl_gen_map_open(gen);
692
+ json_gen_map_open(gen);
575
693
 
576
- yajl_gen_cstr(gen, "_id");
577
- yajl_gen_value(gen, obj);
694
+ json_gen_cstr(gen, "_id");
695
+ json_gen_value(gen, obj);
578
696
 
579
697
  struct obj_track *tracker = NULL;
580
698
  if (st_lookup(objs, (st_data_t)obj, (st_data_t *)&tracker) && BUILTIN_TYPE(obj) != T_NODE) {
581
- yajl_gen_cstr(gen, "file");
582
- yajl_gen_cstr(gen, tracker->source);
583
- yajl_gen_cstr(gen, "line");
584
- yajl_gen_integer(gen, tracker->line);
585
- yajl_gen_cstr(gen, "time");
586
- yajl_gen_integer(gen, (tracker->time[0].tv_sec * 1000000) + tracker->time[0].tv_usec);
699
+ json_gen_cstr(gen, "file");
700
+ json_gen_cstr(gen, tracker->source);
701
+ json_gen_cstr(gen, "line");
702
+ json_gen_integer(gen, tracker->line);
703
+ json_gen_cstr(gen, "time");
704
+ json_gen_integer(gen, (tracker->time[0].tv_sec * 1000000) + tracker->time[0].tv_usec);
587
705
  }
588
706
 
589
- yajl_gen_cstr(gen, "type");
707
+ json_gen_cstr(gen, "type");
590
708
  switch (type=BUILTIN_TYPE(obj)) {
591
709
  case T_DATA:
592
- yajl_gen_cstr(gen, "data");
710
+ json_gen_cstr(gen, "data");
593
711
  obj_dump_class(gen, obj);
594
712
 
595
713
  if (DATA_PTR(obj)) {
596
- yajl_gen_cstr(gen, "data");
597
- yajl_gen_pointer(gen, DATA_PTR(obj));
714
+ json_gen_cstr(gen, "data");
715
+ json_gen_pointer(gen, DATA_PTR(obj));
598
716
  }
599
717
 
600
718
  if (RDATA(obj)->dfree == (RUBY_DATA_FUNC)rb_blk_free) {
@@ -603,73 +721,73 @@ obj_dump(VALUE obj, yajl_gen gen)
603
721
 
604
722
  val = *(void**)(DATA_PTR(obj) + memprof_config.offset_BLOCK_body);
605
723
  if (val) {
606
- yajl_gen_cstr(gen, "nd_body");
607
- yajl_gen_pointer(gen, val);
724
+ json_gen_cstr(gen, "nd_body");
725
+ json_gen_pointer(gen, val);
608
726
  }
609
727
 
610
728
  val = *(void**)(DATA_PTR(obj) + memprof_config.offset_BLOCK_var);
611
729
  if (val) {
612
- yajl_gen_cstr(gen, "nd_var");
613
- yajl_gen_pointer(gen, val);
730
+ json_gen_cstr(gen, "nd_var");
731
+ json_gen_pointer(gen, val);
614
732
  }
615
733
 
616
734
  val = *(void**)(DATA_PTR(obj) + memprof_config.offset_BLOCK_cref);
617
735
  if (val) {
618
- yajl_gen_cstr(gen, "nd_cref");
619
- yajl_gen_pointer(gen, val);
736
+ json_gen_cstr(gen, "nd_cref");
737
+ json_gen_pointer(gen, val);
620
738
  }
621
739
 
622
740
  val = *(void**)(DATA_PTR(obj) + memprof_config.offset_BLOCK_dyna_vars);
623
741
  if (val) {
624
- yajl_gen_cstr(gen, "vars");
625
- yajl_gen_pointer(gen, val);
742
+ json_gen_cstr(gen, "vars");
743
+ json_gen_pointer(gen, val);
626
744
  }
627
745
 
628
746
  val = *(void**)(DATA_PTR(obj) + memprof_config.offset_BLOCK_scope);
629
747
  if (val) {
630
- yajl_gen_cstr(gen, "scope");
631
- yajl_gen_pointer(gen, val);
748
+ json_gen_cstr(gen, "scope");
749
+ json_gen_pointer(gen, val);
632
750
  }
633
751
 
634
752
  ptr = *(VALUE*)(DATA_PTR(obj) + memprof_config.offset_BLOCK_self);
635
- yajl_gen_cstr(gen, "self");
636
- yajl_gen_value(gen, ptr);
753
+ json_gen_cstr(gen, "self");
754
+ json_gen_value(gen, ptr);
637
755
 
638
756
  ptr = *(VALUE*)(DATA_PTR(obj) + memprof_config.offset_BLOCK_klass);
639
- yajl_gen_cstr(gen, "klass");
640
- yajl_gen_value(gen, ptr);
757
+ json_gen_cstr(gen, "klass");
758
+ json_gen_value(gen, ptr);
641
759
 
642
760
  ptr = *(VALUE*)(DATA_PTR(obj) + memprof_config.offset_BLOCK_orig_thread);
643
- yajl_gen_cstr(gen, "thread");
644
- yajl_gen_value(gen, ptr);
761
+ json_gen_cstr(gen, "thread");
762
+ json_gen_value(gen, ptr);
645
763
 
646
764
  ptr = *(VALUE*)(DATA_PTR(obj) + memprof_config.offset_BLOCK_wrapper);
647
765
  if (RTEST(ptr)) {
648
- yajl_gen_cstr(gen, "wrapper");
649
- yajl_gen_value(gen, ptr);
766
+ json_gen_cstr(gen, "wrapper");
767
+ json_gen_value(gen, ptr);
650
768
  }
651
769
 
652
770
  ptr = *(VALUE*)(DATA_PTR(obj) + memprof_config.offset_BLOCK_block_obj);
653
771
  if (RTEST(ptr)) {
654
- yajl_gen_cstr(gen, "block");
655
- yajl_gen_value(gen, ptr);
772
+ json_gen_cstr(gen, "block");
773
+ json_gen_value(gen, ptr);
656
774
  }
657
775
 
658
776
  /* TODO: is .prev actually useful? refers to non-heap allocated struct BLOCKs,
659
777
  * but we don't print out any information about those
660
778
  */
661
779
  /*
662
- yajl_gen_cstr(gen, "prev");
663
- yajl_gen_array_open(gen);
780
+ json_gen_cstr(gen, "prev");
781
+ json_gen_array_open(gen);
664
782
  val = *(void**)(DATA_PTR(obj) + memprof_config.offset_BLOCK_prev);
665
783
  while (val) {
666
- yajl_gen_pointer(gen, val);
784
+ json_gen_pointer(gen, val);
667
785
  prev = val;
668
786
  val = *(void**)(ptr + memprof_config.offset_BLOCK_prev);
669
787
  if (prev == val)
670
788
  break;
671
789
  }
672
- yajl_gen_array_close(gen);
790
+ json_gen_array_close(gen);
673
791
  */
674
792
 
675
793
  } else if (RDATA(obj)->dmark == (RUBY_DATA_FUNC)rb_bm_mark) {
@@ -678,57 +796,57 @@ obj_dump(VALUE obj, yajl_gen gen)
678
796
 
679
797
  ptr = *(VALUE*)(DATA_PTR(obj) + memprof_config.offset_METHOD_klass);
680
798
  if (RTEST(ptr)) {
681
- yajl_gen_cstr(gen, "klass");
682
- yajl_gen_value(gen, ptr);
799
+ json_gen_cstr(gen, "klass");
800
+ json_gen_value(gen, ptr);
683
801
  }
684
802
 
685
803
  ptr = *(VALUE*)(DATA_PTR(obj) + memprof_config.offset_METHOD_rklass);
686
804
  if (RTEST(ptr)) {
687
- yajl_gen_cstr(gen, "rklass");
688
- yajl_gen_value(gen, ptr);
805
+ json_gen_cstr(gen, "rklass");
806
+ json_gen_value(gen, ptr);
689
807
  }
690
808
 
691
809
  ptr = *(VALUE*)(DATA_PTR(obj) + memprof_config.offset_METHOD_recv);
692
810
  if (RTEST(ptr)) {
693
- yajl_gen_cstr(gen, "recv");
694
- yajl_gen_value(gen, ptr);
811
+ json_gen_cstr(gen, "recv");
812
+ json_gen_value(gen, ptr);
695
813
  }
696
814
 
697
815
  ptr = *(VALUE*)(DATA_PTR(obj) + memprof_config.offset_METHOD_body);
698
816
  if (RTEST(ptr)) {
699
- yajl_gen_cstr(gen, "node");
700
- yajl_gen_value(gen, ptr);
817
+ json_gen_cstr(gen, "node");
818
+ json_gen_value(gen, ptr);
701
819
  }
702
820
 
703
821
  mid = *(ID*)(DATA_PTR(obj) + memprof_config.offset_METHOD_id);
704
822
  if (mid) {
705
- yajl_gen_cstr(gen, "mid");
706
- yajl_gen_id(gen, mid);
823
+ json_gen_cstr(gen, "mid");
824
+ json_gen_id(gen, mid);
707
825
  }
708
826
 
709
827
  id = *(ID*)(DATA_PTR(obj) + memprof_config.offset_METHOD_oid);
710
828
  if (id && id != mid) {
711
- yajl_gen_cstr(gen, "oid");
712
- yajl_gen_id(gen, id);
829
+ json_gen_cstr(gen, "oid");
830
+ json_gen_id(gen, id);
713
831
  }
714
832
 
715
833
  } else if (RDATA(obj)->dmark == (RUBY_DATA_FUNC)rb_thread_mark) {
716
834
  rb_thread_t th = (rb_thread_t)DATA_PTR(obj);
717
835
 
718
836
  if (th == rb_curr_thread) {
719
- yajl_gen_cstr(gen, "current");
720
- yajl_gen_bool(gen, 1);
837
+ json_gen_cstr(gen, "current");
838
+ json_gen_bool(gen, 1);
721
839
  } else {
722
840
  if (th->dyna_vars) {
723
- yajl_gen_cstr(gen, "varmap");
724
- yajl_gen_pointer(gen, th->dyna_vars);
841
+ json_gen_cstr(gen, "varmap");
842
+ json_gen_pointer(gen, th->dyna_vars);
725
843
  }
726
844
 
727
- yajl_gen_cstr(gen, "node");
728
- yajl_gen_pointer(gen, th->node);
845
+ json_gen_cstr(gen, "node");
846
+ json_gen_pointer(gen, th->node);
729
847
 
730
- yajl_gen_cstr(gen, "cref");
731
- yajl_gen_pointer(gen, th->cref);
848
+ json_gen_cstr(gen, "cref");
849
+ json_gen_pointer(gen, th->cref);
732
850
 
733
851
  char *status;
734
852
  switch (th->status) {
@@ -748,8 +866,8 @@ obj_dump(VALUE obj, yajl_gen gen)
748
866
  status = "unknown";
749
867
  }
750
868
 
751
- yajl_gen_cstr(gen, "status");
752
- yajl_gen_cstr(gen, status);
869
+ json_gen_cstr(gen, "status");
870
+ json_gen_cstr(gen, status);
753
871
 
754
872
  #define WAIT_FD (1<<0)
755
873
  #define WAIT_SELECT (1<<1)
@@ -757,172 +875,172 @@ obj_dump(VALUE obj, yajl_gen gen)
757
875
  #define WAIT_JOIN (1<<3)
758
876
  #define WAIT_PID (1<<4)
759
877
 
760
- yajl_gen_cstr(gen, "wait_for");
761
- yajl_gen_array_open(gen);
878
+ json_gen_cstr(gen, "wait_for");
879
+ json_gen_array_open(gen);
762
880
  if (th->wait_for & WAIT_FD)
763
- yajl_gen_cstr(gen, "fd");
881
+ json_gen_cstr(gen, "fd");
764
882
  if (th->wait_for & WAIT_SELECT)
765
- yajl_gen_cstr(gen, "select");
883
+ json_gen_cstr(gen, "select");
766
884
  if (th->wait_for & WAIT_TIME)
767
- yajl_gen_cstr(gen, "time");
885
+ json_gen_cstr(gen, "time");
768
886
  if (th->wait_for & WAIT_JOIN)
769
- yajl_gen_cstr(gen, "join");
887
+ json_gen_cstr(gen, "join");
770
888
  if (th->wait_for & WAIT_PID)
771
- yajl_gen_cstr(gen, "pid");
772
- yajl_gen_array_close(gen);
889
+ json_gen_cstr(gen, "pid");
890
+ json_gen_array_close(gen);
773
891
 
774
892
  if (th->wait_for & WAIT_FD) {
775
- yajl_gen_cstr(gen, "fd");
776
- yajl_gen_integer(gen, th->fd);
893
+ json_gen_cstr(gen, "fd");
894
+ json_gen_integer(gen, th->fd);
777
895
  }
778
896
 
779
897
  #define DELAY_INFTY 1E30
780
898
 
781
899
  if (th->wait_for & WAIT_TIME) {
782
- yajl_gen_cstr(gen, "delay");
900
+ json_gen_cstr(gen, "delay");
783
901
  if (th->delay == DELAY_INFTY)
784
- yajl_gen_cstr(gen, "infinity");
902
+ json_gen_cstr(gen, "infinity");
785
903
  else
786
- yajl_gen_double(gen, th->delay - rb_timeofday());
904
+ json_gen_double(gen, th->delay - timeofday());
787
905
  }
788
906
 
789
907
  if (th->wait_for & WAIT_JOIN) {
790
- yajl_gen_cstr(gen, "join");
791
- yajl_gen_value(gen, th->join->thread);
908
+ json_gen_cstr(gen, "join");
909
+ json_gen_value(gen, th->join->thread);
792
910
  }
793
911
  }
794
912
 
795
- yajl_gen_cstr(gen, "priority");
796
- yajl_gen_integer(gen, th->priority);
913
+ json_gen_cstr(gen, "priority");
914
+ json_gen_integer(gen, th->priority);
797
915
 
798
916
  if (th == rb_main_thread) {
799
- yajl_gen_cstr(gen, "main");
800
- yajl_gen_bool(gen, 1);
917
+ json_gen_cstr(gen, "main");
918
+ json_gen_bool(gen, 1);
801
919
  }
802
920
 
803
921
  if (th->next && th->next != rb_main_thread) {
804
- yajl_gen_cstr(gen, "next");
805
- yajl_gen_value(gen, th->next->thread);
922
+ json_gen_cstr(gen, "next");
923
+ json_gen_value(gen, th->next->thread);
806
924
  }
807
925
  if (th->prev && th->prev != th && (th->prev == rb_main_thread || th->prev != th->next)) {
808
- yajl_gen_cstr(gen, "prev");
809
- yajl_gen_value(gen, th->prev->thread);
926
+ json_gen_cstr(gen, "prev");
927
+ json_gen_value(gen, th->prev->thread);
810
928
  }
811
929
 
812
930
  if (th->locals) {
813
- yajl_gen_cstr(gen, "variables");
814
- yajl_gen_map_open(gen);
931
+ json_gen_cstr(gen, "variables");
932
+ json_gen_map_open(gen);
815
933
  st_foreach(th->locals, each_ivar, (st_data_t)gen);
816
- yajl_gen_map_close(gen);
934
+ json_gen_map_close(gen);
817
935
  }
818
936
 
819
937
  }
820
938
  break;
821
939
 
822
940
  case T_STRUCT:
823
- yajl_gen_cstr(gen, "struct");
941
+ json_gen_cstr(gen, "struct");
824
942
  obj_dump_class(gen, obj);
825
943
  break;
826
944
 
827
945
  case T_FILE:
828
- yajl_gen_cstr(gen, "file");
946
+ json_gen_cstr(gen, "file");
829
947
  obj_dump_class(gen, obj);
830
948
 
831
949
  OpenFile *file = RFILE(obj)->fptr;
832
950
 
833
951
  if (file->f) {
834
- yajl_gen_cstr(gen, "fileno");
835
- yajl_gen_integer(gen, fileno(file->f));
952
+ json_gen_cstr(gen, "fileno");
953
+ json_gen_integer(gen, fileno(file->f));
836
954
  }
837
955
 
838
956
  if (file->f2) {
839
- yajl_gen_cstr(gen, "fileno2");
840
- yajl_gen_integer(gen, fileno(file->f2));
957
+ json_gen_cstr(gen, "fileno2");
958
+ json_gen_integer(gen, fileno(file->f2));
841
959
  }
842
960
 
843
961
  if (file->pid) {
844
- yajl_gen_cstr(gen, "pid");
845
- yajl_gen_integer(gen, file->pid);
962
+ json_gen_cstr(gen, "pid");
963
+ json_gen_integer(gen, file->pid);
846
964
  }
847
965
 
848
966
  if (file->path) {
849
- yajl_gen_cstr(gen, "path");
850
- yajl_gen_cstr(gen, file->path);
967
+ json_gen_cstr(gen, "path");
968
+ json_gen_cstr(gen, file->path);
851
969
  }
852
970
 
853
971
  if (file->mode) {
854
- yajl_gen_cstr(gen, "mode");
855
- yajl_gen_array_open(gen);
972
+ json_gen_cstr(gen, "mode");
973
+ json_gen_array_open(gen);
856
974
  if (file->mode & FMODE_READABLE)
857
- yajl_gen_cstr(gen, "readable");
975
+ json_gen_cstr(gen, "readable");
858
976
  if (file->mode & FMODE_WRITABLE)
859
- yajl_gen_cstr(gen, "writable");
977
+ json_gen_cstr(gen, "writable");
860
978
  if (file->mode & FMODE_READWRITE)
861
- yajl_gen_cstr(gen, "readwrite");
979
+ json_gen_cstr(gen, "readwrite");
862
980
  if (file->mode & FMODE_APPEND)
863
- yajl_gen_cstr(gen, "append");
981
+ json_gen_cstr(gen, "append");
864
982
  if (file->mode & FMODE_CREATE)
865
- yajl_gen_cstr(gen, "create");
983
+ json_gen_cstr(gen, "create");
866
984
  if (file->mode & FMODE_BINMODE)
867
- yajl_gen_cstr(gen, "binmode");
985
+ json_gen_cstr(gen, "binmode");
868
986
  if (file->mode & FMODE_SYNC)
869
- yajl_gen_cstr(gen, "sync");
987
+ json_gen_cstr(gen, "sync");
870
988
  if (file->mode & FMODE_WBUF)
871
- yajl_gen_cstr(gen, "wbuf");
989
+ json_gen_cstr(gen, "wbuf");
872
990
  if (file->mode & FMODE_RBUF)
873
- yajl_gen_cstr(gen, "rbuf");
991
+ json_gen_cstr(gen, "rbuf");
874
992
  if (file->mode & FMODE_WSPLIT)
875
- yajl_gen_cstr(gen, "wsplit");
993
+ json_gen_cstr(gen, "wsplit");
876
994
  if (file->mode & FMODE_WSPLIT_INITIALIZED)
877
- yajl_gen_cstr(gen, "wsplit_initialized");
878
- yajl_gen_array_close(gen);
995
+ json_gen_cstr(gen, "wsplit_initialized");
996
+ json_gen_array_close(gen);
879
997
  }
880
998
 
881
999
  break;
882
1000
 
883
1001
  case T_FLOAT:
884
- yajl_gen_cstr(gen, "float");
1002
+ json_gen_cstr(gen, "float");
885
1003
  obj_dump_class(gen, obj);
886
1004
 
887
- yajl_gen_cstr(gen, "data");
888
- yajl_gen_double(gen, RFLOAT(obj)->value);
1005
+ json_gen_cstr(gen, "data");
1006
+ json_gen_double(gen, RFLOAT(obj)->value);
889
1007
  break;
890
1008
 
891
1009
  case T_BIGNUM:
892
- yajl_gen_cstr(gen, "bignum");
1010
+ json_gen_cstr(gen, "bignum");
893
1011
  obj_dump_class(gen, obj);
894
1012
 
895
- yajl_gen_cstr(gen, "negative");
896
- yajl_gen_bool(gen, RBIGNUM(obj)->sign == 0);
1013
+ json_gen_cstr(gen, "negative");
1014
+ json_gen_bool(gen, RBIGNUM(obj)->sign == 0);
897
1015
 
898
- yajl_gen_cstr(gen, "length");
899
- yajl_gen_integer(gen, RBIGNUM(obj)->len);
1016
+ json_gen_cstr(gen, "length");
1017
+ json_gen_integer(gen, RBIGNUM(obj)->len);
900
1018
 
901
- yajl_gen_cstr(gen, "data");
902
- yajl_gen_string(gen, RBIGNUM(obj)->digits, RBIGNUM(obj)->len);
1019
+ json_gen_cstr(gen, "data");
1020
+ json_gen_string(gen, RBIGNUM(obj)->digits, RBIGNUM(obj)->len);
903
1021
  break;
904
1022
 
905
1023
  case T_MATCH:
906
- yajl_gen_cstr(gen, "match");
1024
+ json_gen_cstr(gen, "match");
907
1025
  obj_dump_class(gen, obj);
908
1026
 
909
- yajl_gen_cstr(gen, "data");
910
- yajl_gen_value(gen, RMATCH(obj)->str);
1027
+ json_gen_cstr(gen, "data");
1028
+ json_gen_value(gen, RMATCH(obj)->str);
911
1029
  break;
912
1030
 
913
1031
  case T_REGEXP:
914
- yajl_gen_cstr(gen, "regexp");
1032
+ json_gen_cstr(gen, "regexp");
915
1033
  obj_dump_class(gen, obj);
916
1034
 
917
- yajl_gen_cstr(gen, "length");
918
- yajl_gen_integer(gen, RREGEXP(obj)->len);
1035
+ json_gen_cstr(gen, "length");
1036
+ json_gen_integer(gen, RREGEXP(obj)->len);
919
1037
 
920
- yajl_gen_cstr(gen, "data");
921
- yajl_gen_cstr(gen, RREGEXP(obj)->str);
1038
+ json_gen_cstr(gen, "data");
1039
+ json_gen_cstr(gen, RREGEXP(obj)->str);
922
1040
  break;
923
1041
 
924
1042
  case T_SCOPE:
925
- yajl_gen_cstr(gen, "scope");
1043
+ json_gen_cstr(gen, "scope");
926
1044
 
927
1045
  struct SCOPE *scope = (struct SCOPE *)obj;
928
1046
  if (scope->local_tbl) {
@@ -932,13 +1050,13 @@ obj_dump(VALUE obj, yajl_gen gen)
932
1050
  VALUE cur = *list++;
933
1051
 
934
1052
  if (RTEST(cur)) {
935
- yajl_gen_cstr(gen, "node");
936
- yajl_gen_value(gen, cur);
1053
+ json_gen_cstr(gen, "node");
1054
+ json_gen_value(gen, cur);
937
1055
  }
938
1056
 
939
1057
  if (n) {
940
- yajl_gen_cstr(gen, "variables");
941
- yajl_gen_map_open(gen);
1058
+ json_gen_cstr(gen, "variables");
1059
+ json_gen_map_open(gen);
942
1060
  while (n--) {
943
1061
  cur = *list++;
944
1062
  i++;
@@ -946,34 +1064,34 @@ obj_dump(VALUE obj, yajl_gen gen)
946
1064
  if (!rb_is_local_id(scope->local_tbl[i]))
947
1065
  continue;
948
1066
 
949
- yajl_gen_id(gen, scope->local_tbl[i]);
950
- yajl_gen_value(gen, cur);
1067
+ json_gen_id(gen, scope->local_tbl[i]);
1068
+ json_gen_value(gen, cur);
951
1069
  }
952
- yajl_gen_map_close(gen);
1070
+ json_gen_map_close(gen);
953
1071
  }
954
1072
  }
955
1073
  break;
956
1074
 
957
1075
  case T_NODE:
958
- yajl_gen_cstr(gen, "node");
1076
+ json_gen_cstr(gen, "node");
959
1077
 
960
- yajl_gen_cstr(gen, "node_type");
961
- yajl_gen_cstr(gen, nd_type_str(obj));
1078
+ json_gen_cstr(gen, "node_type");
1079
+ json_gen_cstr(gen, nd_type_str(obj));
962
1080
 
963
- yajl_gen_cstr(gen, "file");
964
- yajl_gen_cstr(gen, RNODE(obj)->nd_file);
1081
+ json_gen_cstr(gen, "file");
1082
+ json_gen_cstr(gen, RNODE(obj)->nd_file);
965
1083
 
966
- yajl_gen_cstr(gen, "line");
967
- yajl_gen_integer(gen, nd_line(obj));
1084
+ json_gen_cstr(gen, "line");
1085
+ json_gen_integer(gen, nd_line(obj));
968
1086
 
969
- yajl_gen_cstr(gen, "node_code");
970
- yajl_gen_integer(gen, nd_type(obj));
1087
+ json_gen_cstr(gen, "node_code");
1088
+ json_gen_integer(gen, nd_type(obj));
971
1089
 
972
- #define PRINT_ID(sub) yajl_gen_id(gen, RNODE(obj)->sub.id)
973
- #define PRINT_VAL(sub) yajl_gen_value(gen, RNODE(obj)->sub.value)
1090
+ #define PRINT_ID(sub) json_gen_id(gen, RNODE(obj)->sub.id)
1091
+ #define PRINT_VAL(sub) json_gen_value(gen, RNODE(obj)->sub.value)
974
1092
 
975
1093
  int nd_type = nd_type(obj);
976
- yajl_gen_cstr(gen, "n1");
1094
+ json_gen_cstr(gen, "n1");
977
1095
  switch(nd_type) {
978
1096
  case NODE_LVAR:
979
1097
  case NODE_DVAR:
@@ -1004,23 +1122,23 @@ obj_dump(VALUE obj, yajl_gen gen)
1004
1122
 
1005
1123
  case NODE_SCOPE: {
1006
1124
  ID *tbl = RNODE(obj)->nd_tbl;
1007
- yajl_gen_array_open(gen);
1125
+ json_gen_array_open(gen);
1008
1126
  if (tbl) {
1009
1127
  int size = tbl[0];
1010
1128
  int i = 3;
1011
1129
 
1012
1130
  for (; i < size+1; i++) {
1013
- yajl_gen_id(gen, tbl[i]);
1131
+ json_gen_id(gen, tbl[i]);
1014
1132
  }
1015
1133
  }
1016
- yajl_gen_array_close(gen);
1134
+ json_gen_array_close(gen);
1017
1135
  break;
1018
1136
  }
1019
1137
 
1020
1138
  case NODE_IFUNC:
1021
1139
  case NODE_CFUNC: {
1022
1140
  const char *name = bin_find_symbol_name((void*)RNODE(obj)->u1.value);
1023
- yajl_gen_format(gen, "0x%x: %s", RNODE(obj)->u1.value, name ? name : "???");
1141
+ json_gen_format(gen, "0x%x: %s", RNODE(obj)->u1.value, name ? name : "???");
1024
1142
  break;
1025
1143
  }
1026
1144
 
@@ -1028,7 +1146,7 @@ obj_dump(VALUE obj, yajl_gen gen)
1028
1146
  PRINT_VAL(u1);
1029
1147
  }
1030
1148
 
1031
- yajl_gen_cstr(gen, "n2");
1149
+ json_gen_cstr(gen, "n2");
1032
1150
  switch(nd_type) {
1033
1151
  case NODE_CALL:
1034
1152
  case NODE_FBODY:
@@ -1046,9 +1164,9 @@ obj_dump(VALUE obj, yajl_gen gen)
1046
1164
 
1047
1165
  case NODE_OP_ASGN1:
1048
1166
  if (RNODE(obj)->nd_mid == 0)
1049
- yajl_gen_cstr(gen, ":||");
1167
+ json_gen_cstr(gen, ":||");
1050
1168
  else if (RNODE(obj)->nd_mid == 1)
1051
- yajl_gen_cstr(gen, ":&&");
1169
+ json_gen_cstr(gen, ":&&");
1052
1170
  else
1053
1171
  PRINT_ID(u2);
1054
1172
  break;
@@ -1058,9 +1176,9 @@ obj_dump(VALUE obj, yajl_gen gen)
1058
1176
  PRINT_VAL(u2);
1059
1177
  } else {
1060
1178
  if (RNODE(obj)->nd_mid == 0)
1061
- yajl_gen_cstr(gen, ":||");
1179
+ json_gen_cstr(gen, ":||");
1062
1180
  else if (RNODE(obj)->nd_mid == 1)
1063
- yajl_gen_cstr(gen, ":&&");
1181
+ json_gen_cstr(gen, ":&&");
1064
1182
  else
1065
1183
  PRINT_ID(u2);
1066
1184
  }
@@ -1072,13 +1190,13 @@ obj_dump(VALUE obj, yajl_gen gen)
1072
1190
  case NODE_IFUNC:
1073
1191
  case NODE_CFUNC:
1074
1192
  case NODE_NEWLINE:
1075
- yajl_gen_integer(gen, RNODE(obj)->u2.argc);
1193
+ json_gen_integer(gen, RNODE(obj)->u2.argc);
1076
1194
  break;
1077
1195
 
1078
1196
  case NODE_BLOCK:
1079
1197
  case NODE_ARRAY:
1080
1198
  if (RNODE(obj)->u2.node == RNODE(obj))
1081
- yajl_gen_null(gen);
1199
+ json_gen_null(gen);
1082
1200
  else
1083
1201
  PRINT_VAL(u2);
1084
1202
  break;
@@ -1087,10 +1205,10 @@ obj_dump(VALUE obj, yajl_gen gen)
1087
1205
  PRINT_VAL(u2);
1088
1206
  }
1089
1207
 
1090
- yajl_gen_cstr(gen, "n3");
1208
+ json_gen_cstr(gen, "n3");
1091
1209
  switch(nd_type) {
1092
1210
  case NODE_ARGS:
1093
- yajl_gen_integer(gen, RNODE(obj)->u3.cnt);
1211
+ json_gen_integer(gen, RNODE(obj)->u3.cnt);
1094
1212
  break;
1095
1213
 
1096
1214
  case NODE_OP_ASGN2:
@@ -1106,171 +1224,164 @@ obj_dump(VALUE obj, yajl_gen gen)
1106
1224
  break;
1107
1225
 
1108
1226
  case T_STRING:
1109
- yajl_gen_cstr(gen, "string");
1227
+ json_gen_cstr(gen, "string");
1110
1228
  obj_dump_class(gen, obj);
1111
1229
 
1112
- yajl_gen_cstr(gen, "length");
1113
- yajl_gen_integer(gen, RSTRING_LEN(obj));
1230
+ json_gen_cstr(gen, "length");
1231
+ json_gen_integer(gen, RSTRING_LEN(obj));
1114
1232
 
1115
1233
  if (FL_TEST(obj, ELTS_SHARED|FL_USER3)) {
1116
- yajl_gen_cstr(gen, "shared");
1117
- yajl_gen_value(gen, RSTRING(obj)->aux.shared);
1234
+ json_gen_cstr(gen, "shared");
1235
+ json_gen_value(gen, RSTRING(obj)->aux.shared);
1118
1236
 
1119
- yajl_gen_cstr(gen, "flags");
1120
- yajl_gen_array_open(gen);
1237
+ json_gen_cstr(gen, "flags");
1238
+ json_gen_array_open(gen);
1121
1239
  if (FL_TEST(obj, ELTS_SHARED))
1122
- yajl_gen_cstr(gen, "elts_shared");
1240
+ json_gen_cstr(gen, "elts_shared");
1123
1241
  if (FL_TEST(obj, FL_USER3))
1124
- yajl_gen_cstr(gen, "str_assoc");
1125
- yajl_gen_array_close(gen);
1242
+ json_gen_cstr(gen, "str_assoc");
1243
+ json_gen_array_close(gen);
1126
1244
  } else {
1127
- yajl_gen_cstr(gen, "data");
1128
- yajl_gen_string(gen, (unsigned char *)RSTRING_PTR(obj), RSTRING_LEN(obj));
1245
+ json_gen_cstr(gen, "data");
1246
+ json_gen_string(gen, (unsigned char *)RSTRING_PTR(obj), RSTRING_LEN(obj));
1129
1247
  }
1130
1248
  break;
1131
1249
 
1132
1250
  case T_VARMAP:
1133
- yajl_gen_cstr(gen, "varmap");
1251
+ json_gen_cstr(gen, "varmap");
1134
1252
  obj_dump_class(gen, obj);
1135
1253
 
1136
1254
  struct RVarmap *vars = (struct RVarmap *)obj;
1137
1255
 
1138
1256
  if (vars->next) {
1139
- yajl_gen_cstr(gen, "next");
1140
- yajl_gen_value(gen, (VALUE)vars->next);
1257
+ json_gen_cstr(gen, "next");
1258
+ json_gen_value(gen, (VALUE)vars->next);
1141
1259
  }
1142
1260
 
1143
1261
  if (vars->id) {
1144
- yajl_gen_cstr(gen, "data");
1145
- yajl_gen_map_open(gen);
1146
- yajl_gen_id(gen, vars->id);
1147
- yajl_gen_value(gen, vars->val);
1148
- yajl_gen_map_close(gen);
1262
+ json_gen_cstr(gen, "data");
1263
+ json_gen_map_open(gen);
1264
+ json_gen_id(gen, vars->id);
1265
+ json_gen_value(gen, vars->val);
1266
+ json_gen_map_close(gen);
1149
1267
  }
1150
1268
  break;
1151
1269
 
1152
1270
  case T_CLASS:
1153
1271
  case T_MODULE:
1154
1272
  case T_ICLASS:
1155
- yajl_gen_cstr(gen, type==T_CLASS ? "class" : type==T_MODULE ? "module" : "iclass");
1273
+ json_gen_cstr(gen, type==T_CLASS ? "class" : type==T_MODULE ? "module" : "iclass");
1156
1274
  obj_dump_class(gen, obj);
1157
1275
 
1158
- yajl_gen_cstr(gen, "name");
1276
+ json_gen_cstr(gen, "name");
1159
1277
  VALUE name = rb_classname(obj);
1160
1278
  if (RTEST(name))
1161
- yajl_gen_cstr(gen, RSTRING_PTR(name));
1279
+ json_gen_cstr(gen, RSTRING_PTR(name));
1162
1280
  else
1163
- yajl_gen_cstr(gen, 0);
1281
+ json_gen_cstr(gen, 0);
1164
1282
 
1165
- yajl_gen_cstr(gen, "super");
1166
- yajl_gen_value(gen, RCLASS(obj)->super);
1283
+ json_gen_cstr(gen, "super");
1284
+ json_gen_value(gen, RCLASS(obj)->super);
1167
1285
 
1168
1286
  if (RTEST(RCLASS(obj)->super)) {
1169
- yajl_gen_cstr(gen, "super_name");
1287
+ json_gen_cstr(gen, "super_name");
1170
1288
  VALUE super_name = rb_classname(RCLASS(obj)->super);
1171
1289
  if (RTEST(super_name))
1172
- yajl_gen_cstr(gen, RSTRING_PTR(super_name));
1290
+ json_gen_cstr(gen, RSTRING_PTR(super_name));
1173
1291
  else
1174
- yajl_gen_cstr(gen, 0);
1292
+ json_gen_cstr(gen, 0);
1175
1293
  }
1176
1294
 
1177
1295
  if (FL_TEST(obj, FL_SINGLETON)) {
1178
- yajl_gen_cstr(gen, "singleton");
1179
- yajl_gen_bool(gen, 1);
1296
+ json_gen_cstr(gen, "singleton");
1297
+ json_gen_bool(gen, 1);
1180
1298
  }
1181
1299
 
1182
1300
  if (RCLASS(obj)->iv_tbl && RCLASS(obj)->iv_tbl->num_entries) {
1183
- yajl_gen_cstr(gen, "ivars");
1184
- yajl_gen_map_open(gen);
1301
+ json_gen_cstr(gen, "ivars");
1302
+ json_gen_map_open(gen);
1185
1303
  st_foreach(RCLASS(obj)->iv_tbl, each_ivar, (st_data_t)gen);
1186
- yajl_gen_map_close(gen);
1304
+ json_gen_map_close(gen);
1187
1305
  }
1188
1306
 
1189
1307
  if (RCLASS(obj)->m_tbl && RCLASS(obj)->m_tbl->num_entries) {
1190
- yajl_gen_cstr(gen, "methods");
1191
- yajl_gen_map_open(gen);
1308
+ json_gen_cstr(gen, "methods");
1309
+ json_gen_map_open(gen);
1192
1310
  st_foreach(RCLASS(obj)->m_tbl, each_ivar, (st_data_t)gen);
1193
- yajl_gen_map_close(gen);
1311
+ json_gen_map_close(gen);
1194
1312
  }
1195
1313
  break;
1196
1314
 
1197
1315
  case T_OBJECT:
1198
- yajl_gen_cstr(gen, "object");
1316
+ json_gen_cstr(gen, "object");
1199
1317
  obj_dump_class(gen, obj);
1200
1318
 
1201
1319
  struct RClass *klass = RCLASS(obj);
1202
1320
 
1203
1321
  if (klass->iv_tbl && klass->iv_tbl->num_entries) {
1204
- yajl_gen_cstr(gen, "ivars");
1205
- yajl_gen_map_open(gen);
1322
+ json_gen_cstr(gen, "ivars");
1323
+ json_gen_map_open(gen);
1206
1324
  st_foreach(klass->iv_tbl, each_ivar, (st_data_t)gen);
1207
- yajl_gen_map_close(gen);
1325
+ json_gen_map_close(gen);
1208
1326
  }
1209
1327
  break;
1210
1328
 
1211
1329
  case T_ARRAY:
1212
- yajl_gen_cstr(gen, "array");
1330
+ json_gen_cstr(gen, "array");
1213
1331
  obj_dump_class(gen, obj);
1214
1332
 
1215
1333
  struct RArray *ary = RARRAY(obj);
1216
1334
 
1217
- yajl_gen_cstr(gen, "length");
1218
- yajl_gen_integer(gen, ary->len);
1335
+ json_gen_cstr(gen, "length");
1336
+ json_gen_integer(gen, ary->len);
1219
1337
 
1220
1338
  if (FL_TEST(obj, ELTS_SHARED)) {
1221
- yajl_gen_cstr(gen, "shared");
1222
- yajl_gen_value(gen, ary->aux.shared);
1339
+ json_gen_cstr(gen, "shared");
1340
+ json_gen_value(gen, ary->aux.shared);
1223
1341
  } else if (ary->len) {
1224
- yajl_gen_cstr(gen, "data");
1225
- yajl_gen_array_open(gen);
1342
+ json_gen_cstr(gen, "data");
1343
+ json_gen_array_open(gen);
1226
1344
  int i;
1227
1345
  for(i=0; i < ary->len; i++)
1228
- yajl_gen_value(gen, ary->ptr[i]);
1229
- yajl_gen_array_close(gen);
1346
+ json_gen_value(gen, ary->ptr[i]);
1347
+ json_gen_array_close(gen);
1230
1348
  }
1231
1349
  break;
1232
1350
 
1233
1351
  case T_HASH:
1234
- yajl_gen_cstr(gen, "hash");
1352
+ json_gen_cstr(gen, "hash");
1235
1353
  obj_dump_class(gen, obj);
1236
1354
 
1237
1355
  struct RHash *hash = RHASH(obj);
1238
1356
 
1239
- yajl_gen_cstr(gen, "length");
1357
+ json_gen_cstr(gen, "length");
1240
1358
  if (hash->tbl)
1241
- yajl_gen_integer(gen, hash->tbl->num_entries);
1359
+ json_gen_integer(gen, hash->tbl->num_entries);
1242
1360
  else
1243
- yajl_gen_integer(gen, 0);
1361
+ json_gen_integer(gen, 0);
1244
1362
 
1245
- yajl_gen_cstr(gen, "default");
1246
- yajl_gen_value(gen, hash->ifnone);
1363
+ json_gen_cstr(gen, "default");
1364
+ json_gen_value(gen, hash->ifnone);
1247
1365
 
1248
1366
  if (hash->tbl && hash->tbl->num_entries) {
1249
- yajl_gen_cstr(gen, "data");
1250
- //yajl_gen_map_open(gen);
1251
- yajl_gen_array_open(gen);
1367
+ json_gen_cstr(gen, "data");
1368
+ //json_gen_map_open(gen);
1369
+ json_gen_array_open(gen);
1252
1370
  st_foreach(hash->tbl, each_hash_entry, (st_data_t)gen);
1253
- yajl_gen_array_close(gen);
1254
- //yajl_gen_map_close(gen);
1371
+ json_gen_array_close(gen);
1372
+ //json_gen_map_close(gen);
1255
1373
  }
1256
1374
  break;
1257
1375
 
1258
1376
  default:
1259
- yajl_gen_cstr(gen, "unknown");
1377
+ json_gen_cstr(gen, "unknown");
1260
1378
  obj_dump_class(gen, obj);
1261
1379
  }
1262
1380
 
1263
- yajl_gen_cstr(gen, "code");
1264
- yajl_gen_integer(gen, BUILTIN_TYPE(obj));
1381
+ json_gen_cstr(gen, "code");
1382
+ json_gen_integer(gen, BUILTIN_TYPE(obj));
1265
1383
 
1266
- yajl_gen_map_close(gen);
1267
- }
1268
-
1269
- static int
1270
- objs_each_dump(st_data_t key, st_data_t record, st_data_t arg)
1271
- {
1272
- obj_dump((VALUE)key, (yajl_gen)arg);
1273
- return ST_CONTINUE;
1384
+ json_gen_map_close(gen);
1274
1385
  }
1275
1386
 
1276
1387
  extern st_table *rb_global_tbl;
@@ -1278,89 +1389,89 @@ extern st_table *rb_global_tbl;
1278
1389
  static int
1279
1390
  globals_each_dump(st_data_t key, st_data_t record, st_data_t arg)
1280
1391
  {
1281
- yajl_gen_id((yajl_gen)arg, (ID)key);
1282
- yajl_gen_value((yajl_gen)arg, rb_gvar_get((void*)record));
1392
+ json_gen_id((json_gen)arg, (ID)key);
1393
+ json_gen_value((json_gen)arg, rb_gvar_get((void*)record));
1283
1394
  return ST_CONTINUE;
1284
1395
  }
1285
1396
 
1286
1397
  static int
1287
1398
  finalizers_each_dump(st_data_t key, st_data_t val, st_data_t arg)
1288
1399
  {
1289
- yajl_gen gen = (yajl_gen)arg;
1290
- yajl_gen_array_open(gen);
1291
- yajl_gen_value(gen, (VALUE)key);
1292
- yajl_gen_value(gen, (VALUE)val);
1293
- yajl_gen_array_close(gen);
1400
+ json_gen gen = (json_gen)arg;
1401
+ json_gen_array_open(gen);
1402
+ json_gen_value(gen, (VALUE)key);
1403
+ json_gen_value(gen, (VALUE)val);
1404
+ json_gen_array_close(gen);
1294
1405
  return ST_CONTINUE;
1295
1406
  }
1296
1407
 
1297
1408
  static void
1298
- memprof_dump_globals(yajl_gen gen)
1409
+ memprof_dump_globals(json_gen gen)
1299
1410
  {
1300
- yajl_gen_map_open(gen);
1411
+ json_gen_map_open(gen);
1301
1412
 
1302
- yajl_gen_cstr(gen, "_id");
1303
- yajl_gen_cstr(gen, "globals");
1413
+ json_gen_cstr(gen, "_id");
1414
+ json_gen_cstr(gen, "globals");
1304
1415
 
1305
- yajl_gen_cstr(gen, "type");
1306
- yajl_gen_cstr(gen, "globals");
1416
+ json_gen_cstr(gen, "type");
1417
+ json_gen_cstr(gen, "globals");
1307
1418
 
1308
- yajl_gen_cstr(gen, "variables");
1419
+ json_gen_cstr(gen, "variables");
1309
1420
 
1310
- yajl_gen_map_open(gen);
1421
+ json_gen_map_open(gen);
1311
1422
  st_foreach(rb_global_tbl, globals_each_dump, (st_data_t)gen);
1312
- yajl_gen_map_close(gen);
1423
+ json_gen_map_close(gen);
1313
1424
 
1314
- yajl_gen_map_close(gen);
1315
- yajl_gen_reset(gen);
1425
+ json_gen_map_close(gen);
1426
+ json_gen_reset(gen);
1316
1427
  }
1317
1428
 
1318
1429
  static void
1319
- memprof_dump_stack_frame(yajl_gen gen, struct FRAME *frame)
1430
+ memprof_dump_stack_frame(json_gen gen, struct FRAME *frame)
1320
1431
  {
1321
- yajl_gen_map_open(gen);
1432
+ json_gen_map_open(gen);
1322
1433
 
1323
- yajl_gen_cstr(gen, "_id");
1324
- yajl_gen_pointer(gen, frame);
1434
+ json_gen_cstr(gen, "_id");
1435
+ json_gen_pointer(gen, frame);
1325
1436
 
1326
- yajl_gen_cstr(gen, "type");
1327
- yajl_gen_cstr(gen, "frame");
1437
+ json_gen_cstr(gen, "type");
1438
+ json_gen_cstr(gen, "frame");
1328
1439
 
1329
- yajl_gen_cstr(gen, "self");
1330
- yajl_gen_value(gen, frame->self);
1440
+ json_gen_cstr(gen, "self");
1441
+ json_gen_value(gen, frame->self);
1331
1442
 
1332
1443
  if (frame->last_class) {
1333
- yajl_gen_cstr(gen, "last_class");
1334
- yajl_gen_value(gen, frame->last_class);
1444
+ json_gen_cstr(gen, "last_class");
1445
+ json_gen_value(gen, frame->last_class);
1335
1446
  }
1336
1447
 
1337
1448
  if (frame->orig_func) {
1338
- yajl_gen_cstr(gen, "orig_func");
1339
- yajl_gen_id(gen, frame->orig_func);
1449
+ json_gen_cstr(gen, "orig_func");
1450
+ json_gen_id(gen, frame->orig_func);
1340
1451
  }
1341
1452
 
1342
1453
  if (frame->last_func && frame->last_func != frame->orig_func) {
1343
- yajl_gen_cstr(gen, "last_func");
1344
- yajl_gen_id(gen, frame->last_func);
1454
+ json_gen_cstr(gen, "last_func");
1455
+ json_gen_id(gen, frame->last_func);
1345
1456
  }
1346
1457
 
1347
1458
  if (frame->node) {
1348
- yajl_gen_cstr(gen, "node");
1349
- yajl_gen_pointer(gen, (void*)frame->node);
1459
+ json_gen_cstr(gen, "node");
1460
+ json_gen_pointer(gen, (void*)frame->node);
1350
1461
  }
1351
1462
 
1352
1463
  if (frame->prev) {
1353
- yajl_gen_cstr(gen, "prev");
1354
- yajl_gen_pointer(gen, (void*)frame->prev);
1464
+ json_gen_cstr(gen, "prev");
1465
+ json_gen_pointer(gen, (void*)frame->prev);
1355
1466
  }
1356
1467
 
1357
1468
  if (frame->tmp) {
1358
- yajl_gen_cstr(gen, "tmp");
1359
- yajl_gen_pointer(gen, (void*)frame->tmp);
1469
+ json_gen_cstr(gen, "tmp");
1470
+ json_gen_pointer(gen, (void*)frame->tmp);
1360
1471
  }
1361
1472
 
1362
- yajl_gen_map_close(gen);
1363
- yajl_gen_reset(gen);
1473
+ json_gen_map_close(gen);
1474
+ json_gen_reset(gen);
1364
1475
 
1365
1476
  if (frame->prev) {
1366
1477
  memprof_dump_stack_frame(gen, frame->prev);
@@ -1368,13 +1479,13 @@ memprof_dump_stack_frame(yajl_gen gen, struct FRAME *frame)
1368
1479
  }
1369
1480
 
1370
1481
  static void
1371
- memprof_dump_stack(yajl_gen gen)
1482
+ memprof_dump_stack(json_gen gen)
1372
1483
  {
1373
1484
  memprof_dump_stack_frame(gen, ruby_frame);
1374
1485
  }
1375
1486
 
1376
1487
  static void
1377
- memprof_dump_lsof(yajl_gen gen)
1488
+ memprof_dump_lsof(json_gen gen)
1378
1489
  {
1379
1490
  VALUE cmd = rb_str_new2("lsof -np ");
1380
1491
  VALUE pid = rb_funcall(rb_mProcess, rb_intern("pid"), 0);
@@ -1388,31 +1499,31 @@ memprof_dump_lsof(yajl_gen gen)
1388
1499
  for (i=1; i < RARRAY_LEN(lines); i++) {
1389
1500
  VALUE parts = rb_funcall(RARRAY_PTR(lines)[i], rb_intern("split"), 2, Qnil, INT2FIX(9));
1390
1501
 
1391
- yajl_gen_map_open(gen);
1502
+ json_gen_map_open(gen);
1392
1503
 
1393
- yajl_gen_cstr(gen, "_id");
1394
- yajl_gen_format(gen, "lsof:%d", i);
1504
+ json_gen_cstr(gen, "_id");
1505
+ json_gen_format(gen, "lsof:%d", i);
1395
1506
 
1396
- yajl_gen_cstr(gen, "type");
1397
- yajl_gen_cstr(gen, "lsof");
1507
+ json_gen_cstr(gen, "type");
1508
+ json_gen_cstr(gen, "lsof");
1398
1509
 
1399
- yajl_gen_cstr(gen, "fd");
1400
- yajl_gen_cstr(gen, RSTRING_PTR(RARRAY_PTR(parts)[3]));
1510
+ json_gen_cstr(gen, "fd");
1511
+ json_gen_cstr(gen, RSTRING_PTR(RARRAY_PTR(parts)[3]));
1401
1512
 
1402
- yajl_gen_cstr(gen, "fd_type");
1403
- yajl_gen_cstr(gen, RSTRING_PTR(RARRAY_PTR(parts)[4]));
1513
+ json_gen_cstr(gen, "fd_type");
1514
+ json_gen_cstr(gen, RSTRING_PTR(RARRAY_PTR(parts)[4]));
1404
1515
 
1405
- yajl_gen_cstr(gen, "fd_name");
1406
- yajl_gen_cstr(gen, RSTRING_PTR(RARRAY_PTR(parts)[RARRAY_LEN(parts)-1]));
1516
+ json_gen_cstr(gen, "fd_name");
1517
+ json_gen_cstr(gen, RSTRING_PTR(RARRAY_PTR(parts)[RARRAY_LEN(parts)-1]));
1407
1518
 
1408
- yajl_gen_map_close(gen);
1409
- yajl_gen_reset(gen);
1519
+ json_gen_map_close(gen);
1520
+ json_gen_reset(gen);
1410
1521
  }
1411
1522
  }
1412
1523
  }
1413
1524
 
1414
1525
  static void
1415
- memprof_dump_ps(yajl_gen gen)
1526
+ memprof_dump_ps(json_gen gen)
1416
1527
  {
1417
1528
  VALUE cmd = rb_str_new2("ps -o rss,vsize -p ");
1418
1529
  VALUE pid = rb_funcall(rb_mProcess, rb_intern("pid"), 0);
@@ -1426,93 +1537,80 @@ memprof_dump_ps(yajl_gen gen)
1426
1537
  if (RARRAY_LEN(lines) == 2) {
1427
1538
  VALUE parts = rb_funcall(RARRAY_PTR(lines)[1], rb_intern("split"), 0);
1428
1539
 
1429
- yajl_gen_map_open(gen);
1540
+ json_gen_map_open(gen);
1430
1541
 
1431
- yajl_gen_cstr(gen, "_id");
1432
- yajl_gen_cstr(gen, "ps");
1542
+ json_gen_cstr(gen, "_id");
1543
+ json_gen_cstr(gen, "ps");
1433
1544
 
1434
- yajl_gen_cstr(gen, "type");
1435
- yajl_gen_cstr(gen, "ps");
1545
+ json_gen_cstr(gen, "type");
1546
+ json_gen_cstr(gen, "ps");
1436
1547
 
1437
- yajl_gen_cstr(gen, "rss");
1438
- yajl_gen_cstr(gen, RSTRING_PTR(RARRAY_PTR(parts)[0]));
1548
+ json_gen_cstr(gen, "rss");
1549
+ json_gen_cstr(gen, RSTRING_PTR(RARRAY_PTR(parts)[0]));
1439
1550
 
1440
- yajl_gen_cstr(gen, "vsize");
1441
- yajl_gen_cstr(gen, RSTRING_PTR(RARRAY_PTR(parts)[1]));
1551
+ json_gen_cstr(gen, "vsize");
1552
+ json_gen_cstr(gen, RSTRING_PTR(RARRAY_PTR(parts)[1]));
1442
1553
 
1443
- yajl_gen_map_close(gen);
1444
- yajl_gen_reset(gen);
1554
+ json_gen_map_close(gen);
1555
+ json_gen_reset(gen);
1445
1556
  }
1446
1557
  }
1447
1558
  }
1448
1559
 
1449
1560
  static void
1450
- memprof_dump_finalizers(yajl_gen gen)
1561
+ memprof_dump_finalizers(json_gen gen)
1451
1562
  {
1452
1563
  st_table *finalizer_table = *(st_table **)memprof_config.finalizer_table;
1453
1564
  if (finalizer_table) {
1454
- yajl_gen_map_open(gen);
1565
+ json_gen_map_open(gen);
1455
1566
 
1456
- yajl_gen_cstr(gen, "_id");
1457
- yajl_gen_cstr(gen, "finalizers");
1567
+ json_gen_cstr(gen, "_id");
1568
+ json_gen_cstr(gen, "finalizers");
1458
1569
 
1459
- yajl_gen_cstr(gen, "type");
1460
- yajl_gen_cstr(gen, "finalizers");
1570
+ json_gen_cstr(gen, "type");
1571
+ json_gen_cstr(gen, "finalizers");
1461
1572
 
1462
- yajl_gen_cstr(gen, "data");
1463
- yajl_gen_array_open(gen);
1573
+ json_gen_cstr(gen, "data");
1574
+ json_gen_array_open(gen);
1464
1575
  st_foreach(finalizer_table, finalizers_each_dump, (st_data_t)gen);
1465
- yajl_gen_array_close(gen);
1576
+ json_gen_array_close(gen);
1466
1577
 
1467
- yajl_gen_map_close(gen);
1468
- yajl_gen_reset(gen);
1578
+ json_gen_map_close(gen);
1579
+ json_gen_reset(gen);
1469
1580
  }
1470
1581
  }
1471
1582
 
1472
- static void
1473
- json_print(void *ctx, const char * str, unsigned int len)
1583
+ static int
1584
+ objs_each_dump(st_data_t key, st_data_t record, st_data_t arg)
1474
1585
  {
1475
- FILE *out = (FILE *)ctx;
1476
- size_t written = 0;
1477
- while(1) {
1478
- written += fwrite(str + written, sizeof(char), len - written, out ? out : stdout);
1479
- if (written == len) break;
1480
- }
1586
+ obj_dump((VALUE)key, (json_gen)arg);
1587
+ json_gen_reset((json_gen)arg);
1588
+ return ST_CONTINUE;
1481
1589
  }
1482
1590
 
1483
1591
  static VALUE
1484
1592
  memprof_dump(int argc, VALUE *argv, VALUE self)
1485
1593
  {
1486
- VALUE str;
1487
- FILE *out = NULL;
1594
+ VALUE ret = Qnil;
1595
+ int old = track_objs;
1488
1596
 
1489
- if (!track_objs)
1597
+ if (rb_block_given_p()) {
1598
+ memprof_start(self);
1599
+ ret = rb_yield(Qnil);
1600
+ } else if (!track_objs)
1490
1601
  rb_raise(rb_eRuntimeError, "object tracking disabled, call Memprof.start first");
1491
1602
 
1492
- rb_scan_args(argc, argv, "01", &str);
1493
-
1494
- if (RTEST(str)) {
1495
- out = fopen(StringValueCStr(str), "w");
1496
- if (!out)
1497
- rb_raise(rb_eArgError, "unable to open output file");
1498
- }
1499
-
1500
- yajl_gen_config conf = { .beautify = 1, .indentString = " " };
1501
- yajl_gen gen = yajl_gen_alloc2((yajl_print_t)&json_print, &conf, NULL, (void*)out);
1502
-
1503
1603
  track_objs = 0;
1504
1604
 
1505
- yajl_gen_array_open(gen);
1605
+ json_gen gen = json_for_args(argc, argv);
1506
1606
  st_foreach(objs, objs_each_dump, (st_data_t)gen);
1507
- yajl_gen_array_close(gen);
1508
- yajl_gen_free(gen);
1509
-
1510
- if (out)
1511
- fclose(out);
1607
+ json_free(gen);
1512
1608
 
1513
- track_objs = 1;
1609
+ if (rb_block_given_p())
1610
+ memprof_stop(self);
1611
+ track_objs = old;
1514
1612
 
1515
- return Qnil;
1613
+ return ret;
1516
1614
  }
1517
1615
 
1518
1616
  static VALUE
@@ -1550,8 +1648,8 @@ memprof_dump_all(int argc, VALUE *argv, VALUE self)
1550
1648
  rb_raise(rb_eArgError, "unable to open output file");
1551
1649
  }
1552
1650
 
1553
- yajl_gen_config conf = { .beautify = 0, .indentString = " " };
1554
- yajl_gen gen = yajl_gen_alloc2((yajl_print_t)&json_print, &conf, NULL, (void*)out);
1651
+ json_gen_config conf = { .beautify = 0, .indentString = " " };
1652
+ json_gen gen = json_gen_alloc2((json_print_t)&json_print, &conf, NULL, (void*)out);
1555
1653
 
1556
1654
  track_objs = 0;
1557
1655
 
@@ -1567,7 +1665,7 @@ memprof_dump_all(int argc, VALUE *argv, VALUE self)
1567
1665
  while (p < pend) {
1568
1666
  if (RBASIC(p)->flags) {
1569
1667
  obj_dump((VALUE)p, gen);
1570
- yajl_gen_reset(gen);
1668
+ json_gen_reset(gen);
1571
1669
  }
1572
1670
 
1573
1671
  p += memprof_config.sizeof_RVALUE;
@@ -1577,8 +1675,8 @@ memprof_dump_all(int argc, VALUE *argv, VALUE self)
1577
1675
  memprof_dump_lsof(gen);
1578
1676
  memprof_dump_ps(gen);
1579
1677
 
1580
- yajl_gen_clear(gen);
1581
- yajl_gen_free(gen);
1678
+ json_gen_clear(gen);
1679
+ json_gen_free(gen);
1582
1680
 
1583
1681
  if (out) {
1584
1682
  fclose(out);
@@ -1824,7 +1922,10 @@ Init_memprof()
1824
1922
  rb_define_singleton_method(memprof, "track", memprof_track, -1);
1825
1923
  rb_define_singleton_method(memprof, "dump", memprof_dump, -1);
1826
1924
  rb_define_singleton_method(memprof, "dump_all", memprof_dump_all, -1);
1827
- rb_define_singleton_method(memprof, "track_fun", memprof_track_fun, -1);
1925
+ rb_define_singleton_method(memprof, "trace", memprof_trace, -1);
1926
+ rb_define_singleton_method(memprof, "trace_request", memprof_trace_request, 1);
1927
+ rb_define_singleton_method(memprof, "trace_filename", memprof_trace_filename_get, 0);
1928
+ rb_define_singleton_method(memprof, "trace_filename=", memprof_trace_filename_set, -1);
1828
1929
 
1829
1930
  objs = st_init_numtable();
1830
1931
  init_memprof_config_base();
@@ -1833,6 +1934,11 @@ Init_memprof()
1833
1934
  create_tramp_table();
1834
1935
 
1835
1936
  install_malloc_tracer();
1937
+ install_gc_tracer();
1938
+ install_objects_tracer();
1939
+ install_fd_tracer();
1940
+ install_mysql_tracer();
1941
+ install_memcache_tracer();
1836
1942
 
1837
1943
  gc_hook = Data_Wrap_Struct(rb_cObject, sourcefile_marker, NULL, NULL);
1838
1944
  rb_global_variable(&gc_hook);