23 size +=
sizeof(uint32_t) * 1;
24 size +=
sizeof(uint16_t) * 2;
34 cur += uint32_to_bin(get_irep_record_size(mrb, irep), cur);
35 cur += uint16_to_bin((uint16_t)irep->
nlocals, cur);
36 cur += uint16_to_bin((uint16_t)irep->
nregs, cur);
46 size +=
sizeof(uint32_t);
47 size +=
sizeof(uint32_t) * irep->
ilen;
57 cur += uint32_to_bin(irep->
ilen, cur);
58 for (iseq_no = 0; iseq_no < irep->
ilen; iseq_no++) {
59 cur += uint32_to_bin(irep->
iseq[iseq_no], cur);
75 size +=
sizeof(uint32_t);
76 size += irep->
plen * (
sizeof(uint8_t) +
sizeof(uint16_t));
78 for (pool_no = 0; pool_no < irep->
plen; pool_no++) {
114 const char *char_ptr;
117 cur += uint32_to_bin(irep->
plen, cur);
119 for (pool_no = 0; pool_no < irep->
plen; pool_no++) {
122 cur += uint8_to_bin(
mrb_type(irep->
pool[pool_no]), cur);
133 char_ptr = &char_buf[0];
137 str = irep->
pool[pool_no];
146 cur += uint16_to_bin(len, cur);
147 memcpy(cur, char_ptr, len);
153 return (
int)(cur - buf);
164 size +=
sizeof(uint32_t);
165 for (sym_no = 0; sym_no < irep->
slen; sym_no++) {
166 size +=
sizeof(uint16_t);
167 if (irep->
syms[sym_no] != 0) {
183 cur += uint32_to_bin(irep->
slen, cur);
185 for (sym_no = 0; sym_no < irep->
slen; sym_no++) {
186 if (irep->
syms[sym_no] != 0) {
190 if (len > UINT16_MAX) {
194 cur += uint16_to_bin((uint16_t)len, cur);
195 memcpy(cur, name, len);
196 cur += (uint16_t)len;
204 return (
int)(cur - buf);
215 size += get_irep_header_size(mrb);
216 size += get_iseq_block_size(mrb, irep);
217 size += get_pool_block_size(mrb, irep);
218 size += get_syms_block_size(mrb, irep);
224 write_irep_record(
mrb_state *mrb,
mrb_irep *irep, uint8_t* bin, uint32_t *irep_record_size)
230 *irep_record_size = get_irep_record_size(mrb, irep);
231 if (*irep_record_size == 0) {
235 memset(bin, 0, *irep_record_size);
238 bin += write_irep_header(mrb, irep, bin);
239 bin += write_iseq_block(mrb, irep, bin);
240 bin += write_pool_block(mrb, irep, bin);
241 bin += write_syms_block(mrb, irep, bin);
247 mrb_write_eof(
mrb_state *mrb, uint8_t *bin)
251 memcpy(footer.section_identify,
RITE_BINARY_EOF,
sizeof(footer.section_identify));
260 mrb_write_section_irep_header(
mrb_state *mrb, uint32_t section_size, uint16_t nirep, uint16_t sirep, uint8_t *bin)
265 uint32_to_bin(section_size, header->section_size);
267 uint16_to_bin(nirep, header->
nirep);
268 uint16_to_bin(sirep, header->
sirep);
274 mrb_write_section_irep(
mrb_state *mrb,
size_t start_index, uint8_t *bin)
278 uint32_t section_size = 0, rlen = 0;
281 if (mrb == NULL || start_index >= mrb->
irep_len || bin == NULL) {
288 for (irep_no = start_index; irep_no < mrb->
irep_len; irep_no++) {
289 result = write_irep_record(mrb, mrb->
irep[irep_no], cur, &rlen);
294 section_size += rlen;
297 mrb_write_section_irep_header(mrb, section_size, mrb->
irep_len - start_index, start_index, bin);
303 mrb_write_section_lineno_header(
mrb_state *mrb, uint32_t section_size, uint16_t
nirep, uint16_t
sirep, uint8_t *bin)
309 uint32_to_bin(section_size, header->section_size);
310 uint16_to_bin(nirep, header->
nirep);
311 uint16_to_bin(sirep, header->
sirep);
321 size +=
sizeof(uint32_t);
322 size +=
sizeof(uint16_t);
326 size +=
sizeof(uint32_t);
328 size +=
sizeof(uint16_t) * irep->
ilen;
338 size_t filename_len = 0, iseq_no;
340 cur +=
sizeof(uint32_t);
343 filename_len = strlen(irep->
filename);
345 cur += uint16_to_bin(filename_len, cur);
348 memcpy(cur, irep->
filename, filename_len);
353 cur += uint32_to_bin(irep->
ilen, cur);
354 for (iseq_no = 0; iseq_no < irep->
ilen; iseq_no++) {
355 cur += uint16_to_bin(irep->
lines[iseq_no], cur);
359 cur += uint32_to_bin(0, cur);
362 uint32_to_bin(cur - bin, bin);
368 mrb_write_section_lineno(
mrb_state *mrb,
size_t start_index, uint8_t *bin)
371 uint32_t section_size = 0, rlen = 0;
374 if (mrb == NULL || start_index >= mrb->
irep_len || bin == NULL) {
381 for (irep_no = start_index; irep_no < mrb->
irep_len; irep_no++) {
382 rlen = write_lineno_record(mrb, mrb->
irep[irep_no], cur);
384 section_size += rlen;
387 mrb_write_section_lineno_header(mrb, section_size, mrb->
irep_len - start_index, start_index, bin);
398 ret +=
sizeof(uint32_t);
399 ret +=
sizeof(uint16_t);
404 ret +=
sizeof(uint32_t);
405 ret +=
sizeof(uint16_t);
408 ret +=
sizeof(uint32_t);
409 ret +=
sizeof(uint8_t);
427 find_filename_index(
const mrb_sym *ary,
size_t ary_len,
mrb_sym s)
431 for(i = 0; i < ary_len; ++
i) {
432 if(ary[i] == s) {
return i; }
444 cur = bin +
sizeof(uint32_t);
452 cur += uint32_to_bin(file->
start_pos, cur);
455 filename_idx = find_filename_index(filenames, filenames_len,
458 cur += uint16_to_bin(filename_idx, cur);
462 cur += uint8_to_bin(file->
line_type, cur);
467 cur += uint16_to_bin(file->
line_ary[l], cur);
484 uint32_to_bin(ret, bin);
486 mrb_assert((cur - bin) == (
int)get_debug_record_size(mrb, irep));
492 mrb_write_section_debug(
mrb_state *mrb,
size_t start_index, uint8_t *cur)
494 uint32_t section_size = 0;
495 const uint8_t *bin = cur;
498 size_t filenames_len;
499 uint8_t *filenames_len_out;
505 if (mrb == NULL || start_index >= mrb->
irep_len || cur == NULL) {
516 filenames_len_out = cur;
517 cur +=
sizeof(uint16_t);
518 section_size +=
sizeof(uint16_t);
519 for (irep_i = start_index; irep_i < mrb->
irep_len; ++irep_i) {
522 for(file_i = 0; file_i < debug_info->
flen; ++file_i) {
524 if(find_filename_index(filenames, filenames_len, file->
filename_sym) != -1)
continue;
531 fn_len = (uint16_t)strlen(file->
filename);
532 cur += uint16_to_bin(fn_len, cur);
533 memcpy(cur, file->
filename, fn_len);
536 section_size +=
sizeof(uint16_t) + fn_len;
539 uint16_to_bin(filenames_len, filenames_len_out);
542 for (i = start_index; i < mrb->
irep_len; ++
i) {
543 uint32_t rlen = write_debug_record(mrb, mrb->
irep[i], cur, filenames, filenames_len);
545 section_size += rlen;
549 uint32_to_bin(section_size, header->section_size);
551 uint16_to_bin(start_index, header->
sirep);
559 write_rite_binary_header(
mrb_state *mrb,
size_t binary_size, uint8_t *bin)
571 offset = (&(header->
binary_crc[0]) - bin) +
sizeof(uint16_t);
581 for (i = start_index; i < mrb->
irep_len; ++
i) {
588 mrb_dump_irep(
mrb_state *mrb,
size_t start_index,
int debug_info, uint8_t **bin,
size_t *bin_size)
591 size_t section_size = 0;
592 size_t section_irep_size;
593 size_t section_lineno_size = 0;
599 if (mrb == NULL || start_index >= mrb->
irep_len) {
605 for (irep_no = start_index; irep_no < mrb->
irep_len; irep_no++) {
606 section_irep_size += get_irep_record_size(mrb, mrb->
irep[irep_no]);
608 section_size += section_irep_size;
612 if (debug_info_defined) {
614 size_t filenames_len;
624 section_lineno_size +=
sizeof(uint16_t);
625 for (irep_i = start_index; irep_i < mrb->
irep_len; ++irep_i) {
628 for(file_i = 0; file_i < di->
flen; ++file_i) {
632 file = di->
files[file_i];
633 if(find_filename_index(filenames, filenames_len, file->
filename_sym) != -1)
continue;
641 section_lineno_size +=
sizeof(uint16_t) + filename_len;
646 for(irep_no = start_index; irep_no < mrb->
irep_len; ++irep_no) {
647 section_lineno_size += get_debug_record_size(mrb, mrb->
irep[irep_no]);
649 section_size += section_lineno_size;
653 for (irep_no = start_index; irep_no < mrb->
irep_len; irep_no++) {
654 section_lineno_size += get_lineno_record_size(mrb, mrb->
irep[irep_no]);
656 section_size += section_lineno_size;
661 cur = *bin = (uint8_t *)
mrb_malloc(mrb, *bin_size);
668 result = mrb_write_section_irep(mrb, start_index, cur);
673 cur += section_irep_size;
677 if(debug_info_defined) {
678 result = mrb_write_section_debug(mrb, start_index, cur);
682 cur += section_lineno_size;
685 result = mrb_write_section_lineno(mrb, start_index, cur);
689 cur += section_lineno_size;
693 mrb_write_eof(mrb, cur);
695 result = write_rite_binary_header(mrb, *bin_size, *bin);
709 mrb_dump_irep_binary(
mrb_state *mrb,
size_t start_index,
int debug_info, FILE* fp)
719 result = mrb_dump_irep(mrb, start_index, debug_info, &bin, &bin_size);
721 fwrite(bin, bin_size, 1, fp);
729 is_valid_c_symbol_name(
const char *name)
731 const char *c = NULL;
733 if (name == NULL || name[0] ==
'\0')
return 0;
734 if (!
ISALPHA(name[0]) && name[0] !=
'_')
return 0;
737 for (; *c !=
'\0'; ++c) {
738 if (!
ISALNUM(*c) && *c !=
'_')
return 0;
745 mrb_dump_irep_cfunc(
mrb_state *mrb,
size_t start_index,
int debug_info, FILE *fp,
const char *initname)
748 size_t bin_size = 0, bin_idx = 0;
751 if (fp == NULL || initname == NULL || !is_valid_c_symbol_name(initname)) {
755 result = mrb_dump_irep(mrb, start_index, debug_info, &bin, &bin_size);
757 fprintf(fp,
"#include <stdint.h>\n");
758 fprintf(fp,
"const uint8_t %s[] = {", initname);
759 while (bin_idx < bin_size) {
760 if (bin_idx % 16 == 0 ) fputs(
"\n", fp);
761 fprintf(fp,
"0x%02x,", bin[bin_idx++]);