void Regexp::make_managed(STATE) { Regexp* obj = this; regex_t* reg = onig_data; assert(reg->chain == 0); ByteArray* reg_ba = ByteArray::create(state, sizeof(regex_t)); memcpy(reg_ba->raw_bytes(), reg, sizeof(regex_t)); regex_t* old_reg = reg; reg = reinterpret_cast<regex_t*>(reg_ba->raw_bytes()); obj->onig_data = reg; write_barrier(state, reg_ba); if(reg->p) { ByteArray* pattern = ByteArray::create(state, reg->alloc); memcpy(pattern->raw_bytes(), reg->p, reg->alloc); reg->p = reinterpret_cast<unsigned char*>(pattern->raw_bytes()); obj->write_barrier(state, pattern); } if(reg->exact) { int exact_size = reg->exact_end - reg->exact; ByteArray* exact = ByteArray::create(state, exact_size); memcpy(exact->raw_bytes(), reg->exact, exact_size); reg->exact = reinterpret_cast<unsigned char*>(exact->raw_bytes()); reg->exact_end = reg->exact + exact_size; obj->write_barrier(state, exact); } int int_map_size = sizeof(int) * ONIG_CHAR_TABLE_SIZE; if(reg->int_map) { ByteArray* intmap = ByteArray::create(state, int_map_size); memcpy(intmap->raw_bytes(), reg->int_map, int_map_size); reg->int_map = reinterpret_cast<int*>(intmap->raw_bytes()); obj->write_barrier(state, intmap); } if(reg->int_map_backward) { ByteArray* intmap_back = ByteArray::create(state, int_map_size); memcpy(intmap_back->raw_bytes(), reg->int_map_backward, int_map_size); reg->int_map_backward = reinterpret_cast<int*>(intmap_back->raw_bytes()); obj->write_barrier(state, intmap_back); } if(reg->repeat_range) { int rrange_size = sizeof(OnigRepeatRange) * reg->repeat_range_alloc; ByteArray* rrange = ByteArray::create(state, rrange_size); memcpy(rrange->raw_bytes(), reg->repeat_range, rrange_size); reg->repeat_range = reinterpret_cast<OnigRepeatRange*>(rrange->raw_bytes()); obj->write_barrier(state, rrange); } onig_free(old_reg); }