21 #if !defined(_WIN32) && SIZE_MAX < UINT32_MAX
22 # define SIZE_ERROR_MUL(x, y) ((x) > SIZE_MAX / (y))
23 # define SIZE_ERROR(x) ((x) > SIZE_MAX)
25 # define SIZE_ERROR_MUL(x, y) (0)
26 # define SIZE_ERROR(x) (0)
30 # error This code assumes CHAR_BIT == 8
39 for (i = sirep; i < mrb->
irep_len; i++) {
62 return ((uint8_t *)header.binary_crc - (uint8_t *)&header) +
sizeof(header.binary_crc);
66 read_rite_irep_record(
mrb_state *mrb,
const uint8_t *bin, uint32_t *len)
70 const uint8_t *src = bin;
71 uint16_t tt, pool_data_len, snl;
77 src +=
sizeof(uint32_t);
80 irep->
nlocals = bin_to_uint16(src);
81 src +=
sizeof(uint16_t);
84 irep->
nregs = bin_to_uint16(src);
85 src +=
sizeof(uint16_t);
89 irep->
ilen = bin_to_uint32(src);
90 src +=
sizeof(uint32_t);
97 if (irep->
iseq == NULL) {
101 for (i = 0; i < irep->
ilen; i++) {
102 irep->
iseq[
i] = bin_to_uint32(src);
103 src +=
sizeof(uint32_t);
108 plen = bin_to_uint32(src);
109 src +=
sizeof(uint32_t);
116 if (irep->
pool == NULL) {
121 for (i = 0; i < plen; i++) {
124 pool_data_len = bin_to_uint16(src);
125 src +=
sizeof(uint16_t);
127 src += pool_data_len;
142 irep->
pool[
i] = mrb_nil_value();
151 irep->
slen = bin_to_uint32(src);
152 src +=
sizeof(uint32_t);
153 if (irep->
slen > 0) {
159 if (irep->
syms == NULL) {
164 for (i = 0; i < irep->
slen; i++) {
165 snl = bin_to_uint16(src);
166 src +=
sizeof(uint16_t);
187 read_rite_section_irep(
mrb_state *mrb,
const uint8_t *bin)
200 nirep = bin_to_uint16(header->
nirep);
203 for (n = 0; n <
nirep; n++) {
204 result = read_rite_irep_record(mrb, bin, &len);
213 irep_free(sirep, mrb);
219 read_rite_lineno_record(
mrb_state *mrb,
const uint8_t *bin,
size_t irepno, uint32_t *len)
222 size_t i, fname_len, niseq;
228 bin +=
sizeof(uint32_t);
229 *len +=
sizeof(uint32_t);
230 fname_len = bin_to_uint16(bin);
231 bin +=
sizeof(uint16_t);
232 *len +=
sizeof(uint16_t);
237 fname = (
char *)
mrb_malloc(mrb, fname_len + 1);
242 memcpy(fname, bin, fname_len);
243 fname[fname_len] =
'\0';
247 niseq = bin_to_uint32(bin);
248 bin +=
sizeof(uint32_t);
249 *len +=
sizeof(uint32_t);
255 lines = (uint16_t *)
mrb_malloc(mrb, niseq *
sizeof(uint16_t));
260 for (i = 0; i < niseq; i++) {
261 lines[
i] = bin_to_uint16(bin);
262 bin +=
sizeof(uint16_t);
263 *len +=
sizeof(uint16_t);
275 read_rite_section_lineno(
mrb_state *mrb,
const uint8_t *bin,
size_t sirep)
288 nirep = bin_to_uint16(header->
nirep);
291 for (n = 0, i = sirep; n <
nirep; n++, i++) {
292 result = read_rite_lineno_record(mrb, bin, i, &len);
298 result = sirep + bin_to_uint16(header->
sirep);
304 read_rite_debug_record(
mrb_state *mrb,
const uint8_t *start,
size_t irepno, uint32_t *len,
const mrb_sym *filenames,
size_t filenames_len)
306 const uint8_t *bin = start;
316 record_size = bin_to_uint32(bin);
317 bin +=
sizeof(uint32_t);
321 bin +=
sizeof(uint16_t);
325 uint16_t filename_idx;
331 file->
start_pos = bin_to_uint32(bin); bin +=
sizeof(uint32_t);
334 filename_idx = bin_to_uint16(bin);
335 bin +=
sizeof(uint16_t);
342 file->
line_type = bin_to_uint8(bin); bin +=
sizeof(uint8_t);
349 file->
line_ary[l] = bin_to_uint16(bin); bin +=
sizeof(uint16_t);
367 if((
long)record_size != (bin - start)) {
377 read_rite_section_debug(
mrb_state *mrb,
const uint8_t *start,
size_t sirep)
384 size_t filenames_len;
391 nirep = bin_to_uint16(header->
nirep);
393 filenames_len = bin_to_uint16(bin);
394 bin +=
sizeof(uint16_t);
396 for(i = 0; i < filenames_len; ++
i) {
397 uint16_t f_len = bin_to_uint16(bin);
398 bin +=
sizeof(uint16_t);
399 filenames[
i] =
mrb_intern2(mrb, (
const char *)bin, f_len);
403 for(i = sirep; i < (sirep +
nirep); ++
i) {
405 result = read_rite_debug_record(mrb, bin, i, &len, filenames, filenames_len);
410 if ((bin - start) != bin_to_uint32(header->section_size)) {
414 result = sirep + bin_to_uint16(header->
sirep);
421 read_rite_binary_header(
const uint8_t *bin,
size_t *bin_size, uint16_t *crc)
445 int32_t total_nirep = 0;
452 if ((mrb == NULL) || (bin == NULL)) {
456 result = read_rite_binary_header(bin, &bin_size, &crc);
461 n = offset_crc_body();
472 result = read_rite_section_irep(mrb, bin);
476 total_nirep += result;
479 result = read_rite_section_lineno(mrb, bin, sirep);
485 result = read_rite_section_debug(mrb, bin, sirep);
490 bin += bin_to_uint32(section_header->section_size);
491 }
while (memcmp(section_header->section_identify,
RITE_BINARY_EOF,
sizeof(section_header->section_identify)) != 0);
499 static const char msg[] =
"irep load error";
511 return mrb_nil_value();
519 read_rite_section_lineno_file(
mrb_state *mrb, FILE *fp,
size_t sirep)
525 uint32_t len, buf_size;
527 const size_t record_header_size = 4;
534 nirep = bin_to_uint16(header.nirep);
536 buf_size = record_header_size;
545 for (n = 0, i = sirep; n <
nirep; n++, i++) {
548 if (fread(buf, record_header_size, 1, fp) == 0) {
552 buf_size = bin_to_uint32(&buf[0]);
562 buf = (uint8_t *)ptr;
564 if (fread(&buf[record_header_size], buf_size - record_header_size, 1, fp) == 0) {
568 result = read_rite_lineno_record(mrb, buf, i, &len);
573 result = sirep + bin_to_uint16(header.sirep);
579 irep_free(sirep, mrb);
585 read_rite_section_irep_file(
mrb_state *mrb, FILE *fp)
591 uint32_t len, buf_size;
593 const size_t record_header_size = 1 + 4;
601 nirep = bin_to_uint16(header.nirep);
603 buf_size = record_header_size;
612 for (n = 0; n <
nirep; n++) {
615 if (fread(buf, record_header_size, 1, fp) == 0) {
619 buf_size = bin_to_uint32(&buf[0]);
629 buf = (uint8_t *)ptr;
631 if (fread(&buf[record_header_size], buf_size - record_header_size, 1, fp) == 0) {
635 result = read_rite_irep_record(mrb, buf, &len);
646 irep_free(sirep, mrb);
652 mrb_read_irep_file(
mrb_state *mrb, FILE* fp)
655 int32_t total_nirep = 0;
657 uint16_t crc, crcwk = 0;
658 uint32_t section_size = 0;
663 size_t block_size = 1 << 14;
664 const uint8_t block_fallback_count = 4;
668 if ((mrb == NULL) || (fp == NULL)) {
677 if (fread(buf, buf_size, 1, fp) == 0) {
681 result = read_rite_binary_header(buf, NULL, &crc);
690 for (i = 0; i < block_fallback_count; i++,block_size >>= 1){
697 fseek(fp, offset_crc_body(), SEEK_SET);
698 while ((nbytes = fread(buf, 1, block_size, fp)) > 0) {
702 if (nbytes == 0 && ferror(fp)) {
708 fseek(fp, fpos + section_size, SEEK_SET);
717 section_size = bin_to_uint32(section_header.section_size);
720 fseek(fp, fpos, SEEK_SET);
721 result = read_rite_section_irep_file(mrb, fp);
725 total_nirep += result;
728 fseek(fp, fpos, SEEK_SET);
729 result = read_rite_section_lineno_file(mrb, fp, sirep);
735 uint8_t*
const bin =
mrb_malloc(mrb, section_size);
736 fseek(fp, fpos, SEEK_SET);
737 if(fread((
char*)bin, section_size, 1, fp) != 1) {
741 result = read_rite_section_debug(mrb, bin, sirep);
748 fseek(fp, fpos + section_size, SEEK_SET);
749 }
while (memcmp(section_header.section_identify,
RITE_BINARY_EOF,
sizeof(section_header.section_identify)) != 0);
755 mrb_load_irep_file(
mrb_state *mrb, FILE* fp)
757 int n = mrb_read_irep_file(mrb, fp);
761 return mrb_nil_value();