PageRenderTime 67ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/marshal.c

https://github.com/wanabe/ruby
C | 2405 lines | 2386 code | 9 blank | 10 comment | 6 complexity | 5cca6bde3138d96c04a578e2284b3cf1 MD5 | raw file
Possible License(s): LGPL-2.1, AGPL-3.0, 0BSD, Unlicense, GPL-2.0, BSD-3-Clause

Large files files are truncated, but you can click here to view the full file

  1. /**********************************************************************
  2. marshal.c -
  3. $Author$
  4. created at: Thu Apr 27 16:30:01 JST 1995
  5. Copyright (C) 1993-2007 Yukihiro Matsumoto
  6. **********************************************************************/
  7. #include "ruby/internal/config.h"
  8. #include <math.h>
  9. #ifdef HAVE_FLOAT_H
  10. #include <float.h>
  11. #endif
  12. #ifdef HAVE_IEEEFP_H
  13. #include <ieeefp.h>
  14. #endif
  15. #include "encindex.h"
  16. #include "id_table.h"
  17. #include "internal.h"
  18. #include "internal/array.h"
  19. #include "internal/bignum.h"
  20. #include "internal/class.h"
  21. #include "internal/encoding.h"
  22. #include "internal/error.h"
  23. #include "internal/hash.h"
  24. #include "internal/object.h"
  25. #include "internal/struct.h"
  26. #include "internal/util.h"
  27. #include "internal/vm.h"
  28. #include "ruby/io.h"
  29. #include "ruby/ruby.h"
  30. #include "ruby/st.h"
  31. #include "ruby/util.h"
  32. #define BITSPERSHORT (2*CHAR_BIT)
  33. #define SHORTMASK ((1<<BITSPERSHORT)-1)
  34. #define SHORTDN(x) RSHIFT((x),BITSPERSHORT)
  35. #if SIZEOF_SHORT == SIZEOF_BDIGIT
  36. #define SHORTLEN(x) (x)
  37. #else
  38. static size_t
  39. shortlen(size_t len, BDIGIT *ds)
  40. {
  41. BDIGIT num;
  42. int offset = 0;
  43. num = ds[len-1];
  44. while (num) {
  45. num = SHORTDN(num);
  46. offset++;
  47. }
  48. return (len - 1)*SIZEOF_BDIGIT/2 + offset;
  49. }
  50. #define SHORTLEN(x) shortlen((x),d)
  51. #endif
  52. #define MARSHAL_MAJOR 4
  53. #define MARSHAL_MINOR 8
  54. #define TYPE_NIL '0'
  55. #define TYPE_TRUE 'T'
  56. #define TYPE_FALSE 'F'
  57. #define TYPE_FIXNUM 'i'
  58. #define TYPE_EXTENDED 'e'
  59. #define TYPE_UCLASS 'C'
  60. #define TYPE_OBJECT 'o'
  61. #define TYPE_DATA 'd'
  62. #define TYPE_USERDEF 'u'
  63. #define TYPE_USRMARSHAL 'U'
  64. #define TYPE_FLOAT 'f'
  65. #define TYPE_BIGNUM 'l'
  66. #define TYPE_STRING '"'
  67. #define TYPE_REGEXP '/'
  68. #define TYPE_ARRAY '['
  69. #define TYPE_HASH '{'
  70. #define TYPE_HASH_DEF '}'
  71. #define TYPE_STRUCT 'S'
  72. #define TYPE_MODULE_OLD 'M'
  73. #define TYPE_CLASS 'c'
  74. #define TYPE_MODULE 'm'
  75. #define TYPE_SYMBOL ':'
  76. #define TYPE_SYMLINK ';'
  77. #define TYPE_IVAR 'I'
  78. #define TYPE_LINK '@'
  79. static ID s_dump, s_load, s_mdump, s_mload;
  80. static ID s_dump_data, s_load_data, s_alloc, s_call;
  81. static ID s_getbyte, s_read, s_write, s_binmode;
  82. static ID s_encoding_short, s_ruby2_keywords_flag;
  83. #define name_s_dump "_dump"
  84. #define name_s_load "_load"
  85. #define name_s_mdump "marshal_dump"
  86. #define name_s_mload "marshal_load"
  87. #define name_s_dump_data "_dump_data"
  88. #define name_s_load_data "_load_data"
  89. #define name_s_alloc "_alloc"
  90. #define name_s_call "call"
  91. #define name_s_getbyte "getbyte"
  92. #define name_s_read "read"
  93. #define name_s_write "write"
  94. #define name_s_binmode "binmode"
  95. #define name_s_encoding_short "E"
  96. #define name_s_ruby2_keywords_flag "K"
  97. typedef struct {
  98. VALUE newclass;
  99. VALUE oldclass;
  100. VALUE (*dumper)(VALUE);
  101. VALUE (*loader)(VALUE, VALUE);
  102. } marshal_compat_t;
  103. static st_table *compat_allocator_tbl;
  104. static VALUE compat_allocator_tbl_wrapper;
  105. static VALUE rb_marshal_dump_limited(VALUE obj, VALUE port, int limit);
  106. static VALUE rb_marshal_load_with_proc(VALUE port, VALUE proc);
  107. static int
  108. mark_marshal_compat_i(st_data_t key, st_data_t value, st_data_t _)
  109. {
  110. marshal_compat_t *p = (marshal_compat_t *)value;
  111. rb_gc_mark(p->newclass);
  112. rb_gc_mark(p->oldclass);
  113. return ST_CONTINUE;
  114. }
  115. static void
  116. mark_marshal_compat_t(void *tbl)
  117. {
  118. if (!tbl) return;
  119. st_foreach(tbl, mark_marshal_compat_i, 0);
  120. }
  121. static st_table *compat_allocator_table(void);
  122. void
  123. rb_marshal_define_compat(VALUE newclass, VALUE oldclass, VALUE (*dumper)(VALUE), VALUE (*loader)(VALUE, VALUE))
  124. {
  125. marshal_compat_t *compat;
  126. rb_alloc_func_t allocator = rb_get_alloc_func(newclass);
  127. if (!allocator) {
  128. rb_raise(rb_eTypeError, "no allocator");
  129. }
  130. compat = ALLOC(marshal_compat_t);
  131. compat->newclass = Qnil;
  132. compat->oldclass = Qnil;
  133. compat->newclass = newclass;
  134. compat->oldclass = oldclass;
  135. compat->dumper = dumper;
  136. compat->loader = loader;
  137. st_insert(compat_allocator_table(), (st_data_t)allocator, (st_data_t)compat);
  138. }
  139. struct dump_arg {
  140. VALUE str, dest;
  141. st_table *symbols;
  142. st_table *data;
  143. st_table *compat_tbl;
  144. st_table *encodings;
  145. };
  146. struct dump_call_arg {
  147. VALUE obj;
  148. struct dump_arg *arg;
  149. int limit;
  150. };
  151. static VALUE
  152. check_dump_arg(VALUE ret, struct dump_arg *arg, const char *name)
  153. {
  154. if (!arg->symbols) {
  155. rb_raise(rb_eRuntimeError, "Marshal.dump reentered at %s",
  156. name);
  157. }
  158. return ret;
  159. }
  160. static VALUE
  161. check_userdump_arg(VALUE obj, ID sym, int argc, const VALUE *argv,
  162. struct dump_arg *arg, const char *name)
  163. {
  164. VALUE ret = rb_funcallv(obj, sym, argc, argv);
  165. VALUE klass = CLASS_OF(obj);
  166. if (CLASS_OF(ret) == klass) {
  167. rb_raise(rb_eRuntimeError, "%"PRIsVALUE"#%s returned same class instance",
  168. klass, name);
  169. }
  170. return check_dump_arg(ret, arg, name);
  171. }
  172. #define dump_funcall(arg, obj, sym, argc, argv) \
  173. check_userdump_arg(obj, sym, argc, argv, arg, name_##sym)
  174. #define dump_check_funcall(arg, obj, sym, argc, argv) \
  175. check_dump_arg(rb_check_funcall(obj, sym, argc, argv), arg, name_##sym)
  176. static void clear_dump_arg(struct dump_arg *arg);
  177. static void
  178. mark_dump_arg(void *ptr)
  179. {
  180. struct dump_arg *p = ptr;
  181. if (!p->symbols)
  182. return;
  183. rb_mark_set(p->symbols);
  184. rb_mark_set(p->data);
  185. rb_mark_hash(p->compat_tbl);
  186. rb_gc_mark(p->str);
  187. }
  188. static void
  189. free_dump_arg(void *ptr)
  190. {
  191. clear_dump_arg(ptr);
  192. xfree(ptr);
  193. }
  194. static size_t
  195. memsize_dump_arg(const void *ptr)
  196. {
  197. return sizeof(struct dump_arg);
  198. }
  199. static const rb_data_type_t dump_arg_data = {
  200. "dump_arg",
  201. {mark_dump_arg, free_dump_arg, memsize_dump_arg,},
  202. 0, 0, RUBY_TYPED_FREE_IMMEDIATELY
  203. };
  204. static VALUE
  205. must_not_be_anonymous(const char *type, VALUE path)
  206. {
  207. char *n = RSTRING_PTR(path);
  208. if (!rb_enc_asciicompat(rb_enc_get(path))) {
  209. /* cannot occur? */
  210. rb_raise(rb_eTypeError, "can't dump non-ascii %s name % "PRIsVALUE,
  211. type, path);
  212. }
  213. if (n[0] == '#') {
  214. rb_raise(rb_eTypeError, "can't dump anonymous %s % "PRIsVALUE,
  215. type, path);
  216. }
  217. return path;
  218. }
  219. static VALUE
  220. class2path(VALUE klass)
  221. {
  222. VALUE path = rb_class_path(klass);
  223. must_not_be_anonymous((RB_TYPE_P(klass, T_CLASS) ? "class" : "module"), path);
  224. if (rb_path_to_class(path) != rb_class_real(klass)) {
  225. rb_raise(rb_eTypeError, "% "PRIsVALUE" can't be referred to", path);
  226. }
  227. return path;
  228. }
  229. int ruby_marshal_write_long(long x, char *buf);
  230. static void w_long(long, struct dump_arg*);
  231. static int w_encoding(VALUE encname, struct dump_call_arg *arg);
  232. static VALUE encoding_name(VALUE obj, struct dump_arg *arg);
  233. static void
  234. w_nbyte(const char *s, long n, struct dump_arg *arg)
  235. {
  236. VALUE buf = arg->str;
  237. rb_str_buf_cat(buf, s, n);
  238. if (arg->dest && RSTRING_LEN(buf) >= BUFSIZ) {
  239. rb_io_write(arg->dest, buf);
  240. rb_str_resize(buf, 0);
  241. }
  242. }
  243. static void
  244. w_byte(char c, struct dump_arg *arg)
  245. {
  246. w_nbyte(&c, 1, arg);
  247. }
  248. static void
  249. w_bytes(const char *s, long n, struct dump_arg *arg)
  250. {
  251. w_long(n, arg);
  252. w_nbyte(s, n, arg);
  253. }
  254. #define w_cstr(s, arg) w_bytes((s), strlen(s), (arg))
  255. static void
  256. w_short(int x, struct dump_arg *arg)
  257. {
  258. w_byte((char)((x >> 0) & 0xff), arg);
  259. w_byte((char)((x >> 8) & 0xff), arg);
  260. }
  261. static void
  262. w_long(long x, struct dump_arg *arg)
  263. {
  264. char buf[sizeof(long)+1];
  265. int i = ruby_marshal_write_long(x, buf);
  266. if (i < 0) {
  267. rb_raise(rb_eTypeError, "long too big to dump");
  268. }
  269. w_nbyte(buf, i, arg);
  270. }
  271. int
  272. ruby_marshal_write_long(long x, char *buf)
  273. {
  274. int i;
  275. #if SIZEOF_LONG > 4
  276. if (!(RSHIFT(x, 31) == 0 || RSHIFT(x, 31) == -1)) {
  277. /* big long does not fit in 4 bytes */
  278. return -1;
  279. }
  280. #endif
  281. if (x == 0) {
  282. buf[0] = 0;
  283. return 1;
  284. }
  285. if (0 < x && x < 123) {
  286. buf[0] = (char)(x + 5);
  287. return 1;
  288. }
  289. if (-124 < x && x < 0) {
  290. buf[0] = (char)((x - 5)&0xff);
  291. return 1;
  292. }
  293. for (i=1;i<(int)sizeof(long)+1;i++) {
  294. buf[i] = (char)(x & 0xff);
  295. x = RSHIFT(x,8);
  296. if (x == 0) {
  297. buf[0] = i;
  298. break;
  299. }
  300. if (x == -1) {
  301. buf[0] = -i;
  302. break;
  303. }
  304. }
  305. return i+1;
  306. }
  307. #ifdef DBL_MANT_DIG
  308. #define DECIMAL_MANT (53-16) /* from IEEE754 double precision */
  309. #if DBL_MANT_DIG > 32
  310. #define MANT_BITS 32
  311. #elif DBL_MANT_DIG > 24
  312. #define MANT_BITS 24
  313. #elif DBL_MANT_DIG > 16
  314. #define MANT_BITS 16
  315. #else
  316. #define MANT_BITS 8
  317. #endif
  318. static double
  319. load_mantissa(double d, const char *buf, long len)
  320. {
  321. if (!len) return d;
  322. if (--len > 0 && !*buf++) { /* binary mantissa mark */
  323. int e, s = d < 0, dig = 0;
  324. unsigned long m;
  325. modf(ldexp(frexp(fabs(d), &e), DECIMAL_MANT), &d);
  326. do {
  327. m = 0;
  328. switch (len) {
  329. default: m = *buf++ & 0xff; /* fall through */
  330. #if MANT_BITS > 24
  331. case 3: m = (m << 8) | (*buf++ & 0xff); /* fall through */
  332. #endif
  333. #if MANT_BITS > 16
  334. case 2: m = (m << 8) | (*buf++ & 0xff); /* fall through */
  335. #endif
  336. #if MANT_BITS > 8
  337. case 1: m = (m << 8) | (*buf++ & 0xff);
  338. #endif
  339. }
  340. dig -= len < MANT_BITS / 8 ? 8 * (unsigned)len : MANT_BITS;
  341. d += ldexp((double)m, dig);
  342. } while ((len -= MANT_BITS / 8) > 0);
  343. d = ldexp(d, e - DECIMAL_MANT);
  344. if (s) d = -d;
  345. }
  346. return d;
  347. }
  348. #else
  349. #define load_mantissa(d, buf, len) (d)
  350. #endif
  351. #ifdef DBL_DIG
  352. #define FLOAT_DIG (DBL_DIG+2)
  353. #else
  354. #define FLOAT_DIG 17
  355. #endif
  356. static void
  357. w_float(double d, struct dump_arg *arg)
  358. {
  359. char buf[FLOAT_DIG + (DECIMAL_MANT + 7) / 8 + 10];
  360. if (isinf(d)) {
  361. if (d < 0) w_cstr("-inf", arg);
  362. else w_cstr("inf", arg);
  363. }
  364. else if (isnan(d)) {
  365. w_cstr("nan", arg);
  366. }
  367. else if (d == 0.0) {
  368. if (signbit(d)) w_cstr("-0", arg);
  369. else w_cstr("0", arg);
  370. }
  371. else {
  372. int decpt, sign, digs, len = 0;
  373. char *e, *p = ruby_dtoa(d, 0, 0, &decpt, &sign, &e);
  374. if (sign) buf[len++] = '-';
  375. digs = (int)(e - p);
  376. if (decpt < -3 || decpt > digs) {
  377. buf[len++] = p[0];
  378. if (--digs > 0) buf[len++] = '.';
  379. memcpy(buf + len, p + 1, digs);
  380. len += digs;
  381. len += snprintf(buf + len, sizeof(buf) - len, "e%d", decpt - 1);
  382. }
  383. else if (decpt > 0) {
  384. memcpy(buf + len, p, decpt);
  385. len += decpt;
  386. if ((digs -= decpt) > 0) {
  387. buf[len++] = '.';
  388. memcpy(buf + len, p + decpt, digs);
  389. len += digs;
  390. }
  391. }
  392. else {
  393. buf[len++] = '0';
  394. buf[len++] = '.';
  395. if (decpt) {
  396. memset(buf + len, '0', -decpt);
  397. len -= decpt;
  398. }
  399. memcpy(buf + len, p, digs);
  400. len += digs;
  401. }
  402. xfree(p);
  403. w_bytes(buf, len, arg);
  404. }
  405. }
  406. static void
  407. w_symbol(VALUE sym, struct dump_arg *arg)
  408. {
  409. st_data_t num;
  410. VALUE encname;
  411. if (st_lookup(arg->symbols, sym, &num)) {
  412. w_byte(TYPE_SYMLINK, arg);
  413. w_long((long)num, arg);
  414. }
  415. else {
  416. const VALUE orig_sym = sym;
  417. sym = rb_sym2str(sym);
  418. if (!sym) {
  419. rb_raise(rb_eTypeError, "can't dump anonymous ID %"PRIdVALUE, sym);
  420. }
  421. encname = encoding_name(sym, arg);
  422. if (NIL_P(encname) ||
  423. rb_enc_str_coderange(sym) == ENC_CODERANGE_7BIT) {
  424. encname = Qnil;
  425. }
  426. else {
  427. w_byte(TYPE_IVAR, arg);
  428. }
  429. w_byte(TYPE_SYMBOL, arg);
  430. w_bytes(RSTRING_PTR(sym), RSTRING_LEN(sym), arg);
  431. st_add_direct(arg->symbols, orig_sym, arg->symbols->num_entries);
  432. if (!NIL_P(encname)) {
  433. struct dump_call_arg c_arg;
  434. c_arg.limit = 1;
  435. c_arg.arg = arg;
  436. w_long(1L, arg);
  437. w_encoding(encname, &c_arg);
  438. }
  439. }
  440. }
  441. static void
  442. w_unique(VALUE s, struct dump_arg *arg)
  443. {
  444. must_not_be_anonymous("class", s);
  445. w_symbol(rb_str_intern(s), arg);
  446. }
  447. static void w_object(VALUE,struct dump_arg*,int);
  448. static int
  449. hash_each(VALUE key, VALUE value, VALUE v)
  450. {
  451. struct dump_call_arg *arg = (void *)v;
  452. w_object(key, arg->arg, arg->limit);
  453. w_object(value, arg->arg, arg->limit);
  454. return ST_CONTINUE;
  455. }
  456. #define SINGLETON_DUMP_UNABLE_P(klass) \
  457. (rb_id_table_size(RCLASS_M_TBL(klass)) > 0 || \
  458. (RCLASS_IV_TBL(klass) && RCLASS_IV_TBL(klass)->num_entries > 1))
  459. static void
  460. w_extended(VALUE klass, struct dump_arg *arg, int check)
  461. {
  462. if (check && FL_TEST(klass, FL_SINGLETON)) {
  463. VALUE origin = RCLASS_ORIGIN(klass);
  464. if (SINGLETON_DUMP_UNABLE_P(klass) ||
  465. (origin != klass && SINGLETON_DUMP_UNABLE_P(origin))) {
  466. rb_raise(rb_eTypeError, "singleton can't be dumped");
  467. }
  468. klass = RCLASS_SUPER(klass);
  469. }
  470. while (BUILTIN_TYPE(klass) == T_ICLASS) {
  471. if (!FL_TEST(klass, RICLASS_IS_ORIGIN) ||
  472. BUILTIN_TYPE(RBASIC(klass)->klass) != T_MODULE) {
  473. VALUE path = rb_class_name(RBASIC(klass)->klass);
  474. w_byte(TYPE_EXTENDED, arg);
  475. w_unique(path, arg);
  476. }
  477. klass = RCLASS_SUPER(klass);
  478. }
  479. }
  480. static void
  481. w_class(char type, VALUE obj, struct dump_arg *arg, int check)
  482. {
  483. VALUE path;
  484. st_data_t real_obj;
  485. VALUE klass;
  486. if (arg->compat_tbl &&
  487. st_lookup(arg->compat_tbl, (st_data_t)obj, &real_obj)) {
  488. obj = (VALUE)real_obj;
  489. }
  490. klass = CLASS_OF(obj);
  491. w_extended(klass, arg, check);
  492. w_byte(type, arg);
  493. path = class2path(rb_class_real(klass));
  494. w_unique(path, arg);
  495. }
  496. static void
  497. w_uclass(VALUE obj, VALUE super, struct dump_arg *arg)
  498. {
  499. VALUE klass = CLASS_OF(obj);
  500. w_extended(klass, arg, TRUE);
  501. klass = rb_class_real(klass);
  502. if (klass != super) {
  503. w_byte(TYPE_UCLASS, arg);
  504. w_unique(class2path(klass), arg);
  505. }
  506. }
  507. static bool
  508. rb_hash_ruby2_keywords_p(VALUE obj)
  509. {
  510. return (RHASH(obj)->basic.flags & RHASH_PASS_AS_KEYWORDS) != 0;
  511. }
  512. static void
  513. rb_hash_ruby2_keywords(VALUE obj)
  514. {
  515. RHASH(obj)->basic.flags |= RHASH_PASS_AS_KEYWORDS;
  516. }
  517. static inline bool
  518. to_be_skipped_id(const ID id)
  519. {
  520. if (id == s_encoding_short) return true;
  521. if (id == s_ruby2_keywords_flag) return true;
  522. if (id == rb_id_encoding()) return true;
  523. return !rb_id2str(id);
  524. }
  525. struct w_ivar_arg {
  526. struct dump_call_arg *dump;
  527. st_data_t num_ivar;
  528. };
  529. static int
  530. w_obj_each(st_data_t key, st_data_t val, st_data_t a)
  531. {
  532. ID id = (ID)key;
  533. VALUE value = (VALUE)val;
  534. struct w_ivar_arg *ivarg = (struct w_ivar_arg *)a;
  535. struct dump_call_arg *arg = ivarg->dump;
  536. if (to_be_skipped_id(id)) {
  537. if (id == s_encoding_short) {
  538. rb_warn("instance variable `"name_s_encoding_short"' on class %"PRIsVALUE" is not dumped",
  539. CLASS_OF(arg->obj));
  540. }
  541. if (id == s_ruby2_keywords_flag) {
  542. rb_warn("instance variable `"name_s_ruby2_keywords_flag"' on class %"PRIsVALUE" is not dumped",
  543. CLASS_OF(arg->obj));
  544. }
  545. return ST_CONTINUE;
  546. }
  547. if (!ivarg->num_ivar) {
  548. rb_raise(rb_eRuntimeError, "instance variable added to %"PRIsVALUE" instance",
  549. CLASS_OF(arg->obj));
  550. }
  551. --ivarg->num_ivar;
  552. w_symbol(ID2SYM(id), arg->arg);
  553. w_object(value, arg->arg, arg->limit);
  554. return ST_CONTINUE;
  555. }
  556. static int
  557. obj_count_ivars(st_data_t key, st_data_t val, st_data_t a)
  558. {
  559. ID id = (ID)key;
  560. if (!to_be_skipped_id(id) && UNLIKELY(!++*(st_index_t *)a)) {
  561. rb_raise(rb_eRuntimeError, "too many instance variables");
  562. }
  563. return ST_CONTINUE;
  564. }
  565. static VALUE
  566. encoding_name(VALUE obj, struct dump_arg *arg)
  567. {
  568. if (rb_enc_capable(obj)) {
  569. int encidx = rb_enc_get_index(obj);
  570. rb_encoding *enc = 0;
  571. st_data_t name;
  572. if (encidx <= 0 || !(enc = rb_enc_from_index(encidx))) {
  573. return Qnil;
  574. }
  575. /* special treatment for US-ASCII and UTF-8 */
  576. if (encidx == rb_usascii_encindex()) {
  577. return Qfalse;
  578. }
  579. else if (encidx == rb_utf8_encindex()) {
  580. return Qtrue;
  581. }
  582. if (arg->encodings ?
  583. !st_lookup(arg->encodings, (st_data_t)rb_enc_name(enc), &name) :
  584. (arg->encodings = st_init_strcasetable(), 1)) {
  585. name = (st_data_t)rb_str_new_cstr(rb_enc_name(enc));
  586. st_insert(arg->encodings, (st_data_t)rb_enc_name(enc), name);
  587. }
  588. return (VALUE)name;
  589. }
  590. else {
  591. return Qnil;
  592. }
  593. }
  594. static int
  595. w_encoding(VALUE encname, struct dump_call_arg *arg)
  596. {
  597. int limit = arg->limit;
  598. if (limit >= 0) ++limit;
  599. switch (encname) {
  600. case Qfalse:
  601. case Qtrue:
  602. w_symbol(ID2SYM(s_encoding_short), arg->arg);
  603. w_object(encname, arg->arg, limit);
  604. return 1;
  605. case Qnil:
  606. return 0;
  607. }
  608. w_symbol(ID2SYM(rb_id_encoding()), arg->arg);
  609. w_object(encname, arg->arg, limit);
  610. return 1;
  611. }
  612. static st_index_t
  613. has_ivars(VALUE obj, VALUE encname, VALUE *ivobj)
  614. {
  615. st_index_t num = !NIL_P(encname);
  616. if (SPECIAL_CONST_P(obj)) goto generic;
  617. switch (BUILTIN_TYPE(obj)) {
  618. case T_OBJECT:
  619. case T_CLASS:
  620. case T_MODULE:
  621. break; /* counted elsewhere */
  622. case T_HASH:
  623. if (rb_hash_ruby2_keywords_p(obj)) ++num;
  624. /* fall through */
  625. default:
  626. generic:
  627. rb_ivar_foreach(obj, obj_count_ivars, (st_data_t)&num);
  628. if (num) *ivobj = obj;
  629. }
  630. return num;
  631. }
  632. static void
  633. w_ivar_each(VALUE obj, st_index_t num, struct dump_call_arg *arg)
  634. {
  635. struct w_ivar_arg ivarg = {arg, num};
  636. if (!num) return;
  637. rb_ivar_foreach(obj, w_obj_each, (st_data_t)&ivarg);
  638. if (ivarg.num_ivar) {
  639. rb_raise(rb_eRuntimeError, "instance variable removed from %"PRIsVALUE" instance",
  640. CLASS_OF(arg->obj));
  641. }
  642. }
  643. static void
  644. w_ivar(st_index_t num, VALUE ivobj, VALUE encname, struct dump_call_arg *arg)
  645. {
  646. w_long(num, arg->arg);
  647. num -= w_encoding(encname, arg);
  648. if (RB_TYPE_P(ivobj, T_HASH) && rb_hash_ruby2_keywords_p(ivobj)) {
  649. int limit = arg->limit;
  650. if (limit >= 0) ++limit;
  651. w_symbol(ID2SYM(s_ruby2_keywords_flag), arg->arg);
  652. w_object(Qtrue, arg->arg, limit);
  653. num--;
  654. }
  655. if (ivobj != Qundef && num) {
  656. w_ivar_each(ivobj, num, arg);
  657. }
  658. }
  659. static void
  660. w_objivar(VALUE obj, struct dump_call_arg *arg)
  661. {
  662. st_data_t num = 0;
  663. rb_ivar_foreach(obj, obj_count_ivars, (st_data_t)&num);
  664. w_long(num, arg->arg);
  665. w_ivar_each(obj, num, arg);
  666. }
  667. static void
  668. w_object(VALUE obj, struct dump_arg *arg, int limit)
  669. {
  670. struct dump_call_arg c_arg;
  671. VALUE ivobj = Qundef;
  672. st_data_t num;
  673. st_index_t hasiv = 0;
  674. VALUE encname = Qnil;
  675. if (limit == 0) {
  676. rb_raise(rb_eArgError, "exceed depth limit");
  677. }
  678. if (limit > 0) limit--;
  679. c_arg.limit = limit;
  680. c_arg.arg = arg;
  681. c_arg.obj = obj;
  682. if (st_lookup(arg->data, obj, &num)) {
  683. w_byte(TYPE_LINK, arg);
  684. w_long((long)num, arg);
  685. return;
  686. }
  687. if (obj == Qnil) {
  688. w_byte(TYPE_NIL, arg);
  689. }
  690. else if (obj == Qtrue) {
  691. w_byte(TYPE_TRUE, arg);
  692. }
  693. else if (obj == Qfalse) {
  694. w_byte(TYPE_FALSE, arg);
  695. }
  696. else if (FIXNUM_P(obj)) {
  697. #if SIZEOF_LONG <= 4
  698. w_byte(TYPE_FIXNUM, arg);
  699. w_long(FIX2INT(obj), arg);
  700. #else
  701. if (RSHIFT((long)obj, 31) == 0 || RSHIFT((long)obj, 31) == -1) {
  702. w_byte(TYPE_FIXNUM, arg);
  703. w_long(FIX2LONG(obj), arg);
  704. }
  705. else {
  706. w_object(rb_int2big(FIX2LONG(obj)), arg, limit);
  707. }
  708. #endif
  709. }
  710. else if (SYMBOL_P(obj)) {
  711. w_symbol(obj, arg);
  712. }
  713. else if (FLONUM_P(obj)) {
  714. st_add_direct(arg->data, obj, arg->data->num_entries);
  715. w_byte(TYPE_FLOAT, arg);
  716. w_float(RFLOAT_VALUE(obj), arg);
  717. }
  718. else {
  719. VALUE v;
  720. if (!RBASIC_CLASS(obj)) {
  721. rb_raise(rb_eTypeError, "can't dump internal %s",
  722. rb_builtin_type_name(BUILTIN_TYPE(obj)));
  723. }
  724. if (rb_obj_respond_to(obj, s_mdump, TRUE)) {
  725. st_add_direct(arg->data, obj, arg->data->num_entries);
  726. v = dump_funcall(arg, obj, s_mdump, 0, 0);
  727. w_class(TYPE_USRMARSHAL, obj, arg, FALSE);
  728. w_object(v, arg, limit);
  729. return;
  730. }
  731. if (rb_obj_respond_to(obj, s_dump, TRUE)) {
  732. VALUE ivobj2 = Qundef;
  733. st_index_t hasiv2;
  734. VALUE encname2;
  735. v = INT2NUM(limit);
  736. v = dump_funcall(arg, obj, s_dump, 1, &v);
  737. if (!RB_TYPE_P(v, T_STRING)) {
  738. rb_raise(rb_eTypeError, "_dump() must return string");
  739. }
  740. hasiv = has_ivars(obj, (encname = encoding_name(obj, arg)), &ivobj);
  741. hasiv2 = has_ivars(v, (encname2 = encoding_name(v, arg)), &ivobj2);
  742. if (hasiv2) {
  743. hasiv = hasiv2;
  744. ivobj = ivobj2;
  745. encname = encname2;
  746. }
  747. if (hasiv) w_byte(TYPE_IVAR, arg);
  748. w_class(TYPE_USERDEF, obj, arg, FALSE);
  749. w_bytes(RSTRING_PTR(v), RSTRING_LEN(v), arg);
  750. if (hasiv) {
  751. w_ivar(hasiv, ivobj, encname, &c_arg);
  752. }
  753. st_add_direct(arg->data, obj, arg->data->num_entries);
  754. return;
  755. }
  756. st_add_direct(arg->data, obj, arg->data->num_entries);
  757. hasiv = has_ivars(obj, (encname = encoding_name(obj, arg)), &ivobj);
  758. {
  759. st_data_t compat_data;
  760. rb_alloc_func_t allocator = rb_get_alloc_func(RBASIC(obj)->klass);
  761. if (st_lookup(compat_allocator_tbl,
  762. (st_data_t)allocator,
  763. &compat_data)) {
  764. marshal_compat_t *compat = (marshal_compat_t*)compat_data;
  765. VALUE real_obj = obj;
  766. obj = compat->dumper(real_obj);
  767. if (!arg->compat_tbl) {
  768. arg->compat_tbl = rb_init_identtable();
  769. }
  770. st_insert(arg->compat_tbl, (st_data_t)obj, (st_data_t)real_obj);
  771. if (obj != real_obj && ivobj == Qundef) hasiv = 0;
  772. }
  773. }
  774. if (hasiv) w_byte(TYPE_IVAR, arg);
  775. switch (BUILTIN_TYPE(obj)) {
  776. case T_CLASS:
  777. if (FL_TEST(obj, FL_SINGLETON)) {
  778. rb_raise(rb_eTypeError, "singleton class can't be dumped");
  779. }
  780. w_byte(TYPE_CLASS, arg);
  781. {
  782. VALUE path = class2path(obj);
  783. w_bytes(RSTRING_PTR(path), RSTRING_LEN(path), arg);
  784. RB_GC_GUARD(path);
  785. }
  786. break;
  787. case T_MODULE:
  788. w_byte(TYPE_MODULE, arg);
  789. {
  790. VALUE path = class2path(obj);
  791. w_bytes(RSTRING_PTR(path), RSTRING_LEN(path), arg);
  792. RB_GC_GUARD(path);
  793. }
  794. break;
  795. case T_FLOAT:
  796. w_byte(TYPE_FLOAT, arg);
  797. w_float(RFLOAT_VALUE(obj), arg);
  798. break;
  799. case T_BIGNUM:
  800. w_byte(TYPE_BIGNUM, arg);
  801. {
  802. char sign = BIGNUM_SIGN(obj) ? '+' : '-';
  803. size_t len = BIGNUM_LEN(obj);
  804. size_t slen;
  805. size_t j;
  806. BDIGIT *d = BIGNUM_DIGITS(obj);
  807. slen = SHORTLEN(len);
  808. if (LONG_MAX < slen) {
  809. rb_raise(rb_eTypeError, "too big Bignum can't be dumped");
  810. }
  811. w_byte(sign, arg);
  812. w_long((long)slen, arg);
  813. for (j = 0; j < len; j++) {
  814. #if SIZEOF_BDIGIT > SIZEOF_SHORT
  815. BDIGIT num = *d;
  816. int i;
  817. for (i=0; i<SIZEOF_BDIGIT; i+=SIZEOF_SHORT) {
  818. w_short(num & SHORTMASK, arg);
  819. num = SHORTDN(num);
  820. if (j == len - 1 && num == 0) break;
  821. }
  822. #else
  823. w_short(*d, arg);
  824. #endif
  825. d++;
  826. }
  827. }
  828. break;
  829. case T_STRING:
  830. w_uclass(obj, rb_cString, arg);
  831. w_byte(TYPE_STRING, arg);
  832. w_bytes(RSTRING_PTR(obj), RSTRING_LEN(obj), arg);
  833. break;
  834. case T_REGEXP:
  835. w_uclass(obj, rb_cRegexp, arg);
  836. w_byte(TYPE_REGEXP, arg);
  837. {
  838. int opts = rb_reg_options(obj);
  839. w_bytes(RREGEXP_SRC_PTR(obj), RREGEXP_SRC_LEN(obj), arg);
  840. w_byte((char)opts, arg);
  841. }
  842. break;
  843. case T_ARRAY:
  844. w_uclass(obj, rb_cArray, arg);
  845. w_byte(TYPE_ARRAY, arg);
  846. {
  847. long i, len = RARRAY_LEN(obj);
  848. w_long(len, arg);
  849. for (i=0; i<RARRAY_LEN(obj); i++) {
  850. w_object(RARRAY_AREF(obj, i), arg, limit);
  851. if (len != RARRAY_LEN(obj)) {
  852. rb_raise(rb_eRuntimeError, "array modified during dump");
  853. }
  854. }
  855. }
  856. break;
  857. case T_HASH:
  858. w_uclass(obj, rb_cHash, arg);
  859. if (NIL_P(RHASH_IFNONE(obj))) {
  860. w_byte(TYPE_HASH, arg);
  861. }
  862. else if (FL_TEST(obj, RHASH_PROC_DEFAULT)) {
  863. rb_raise(rb_eTypeError, "can't dump hash with default proc");
  864. }
  865. else {
  866. w_byte(TYPE_HASH_DEF, arg);
  867. }
  868. w_long(rb_hash_size_num(obj), arg);
  869. rb_hash_foreach(obj, hash_each, (st_data_t)&c_arg);
  870. if (!NIL_P(RHASH_IFNONE(obj))) {
  871. w_object(RHASH_IFNONE(obj), arg, limit);
  872. }
  873. break;
  874. case T_STRUCT:
  875. w_class(TYPE_STRUCT, obj, arg, TRUE);
  876. {
  877. long len = RSTRUCT_LEN(obj);
  878. VALUE mem;
  879. long i;
  880. w_long(len, arg);
  881. mem = rb_struct_members(obj);
  882. for (i=0; i<len; i++) {
  883. w_symbol(RARRAY_AREF(mem, i), arg);
  884. w_object(RSTRUCT_GET(obj, i), arg, limit);
  885. }
  886. }
  887. break;
  888. case T_OBJECT:
  889. w_class(TYPE_OBJECT, obj, arg, TRUE);
  890. w_objivar(obj, &c_arg);
  891. break;
  892. case T_DATA:
  893. {
  894. VALUE v;
  895. if (!rb_obj_respond_to(obj, s_dump_data, TRUE)) {
  896. rb_raise(rb_eTypeError,
  897. "no _dump_data is defined for class %"PRIsVALUE,
  898. rb_obj_class(obj));
  899. }
  900. v = dump_funcall(arg, obj, s_dump_data, 0, 0);
  901. w_class(TYPE_DATA, obj, arg, TRUE);
  902. w_object(v, arg, limit);
  903. }
  904. break;
  905. default:
  906. rb_raise(rb_eTypeError, "can't dump %"PRIsVALUE,
  907. rb_obj_class(obj));
  908. break;
  909. }
  910. RB_GC_GUARD(obj);
  911. }
  912. if (hasiv) {
  913. w_ivar(hasiv, ivobj, encname, &c_arg);
  914. }
  915. }
  916. static void
  917. clear_dump_arg(struct dump_arg *arg)
  918. {
  919. if (!arg->symbols) return;
  920. st_free_table(arg->symbols);
  921. arg->symbols = 0;
  922. st_free_table(arg->data);
  923. arg->data = 0;
  924. if (arg->compat_tbl) {
  925. st_free_table(arg->compat_tbl);
  926. arg->compat_tbl = 0;
  927. }
  928. if (arg->encodings) {
  929. st_free_table(arg->encodings);
  930. arg->encodings = 0;
  931. }
  932. }
  933. NORETURN(static inline void io_needed(void));
  934. static inline void
  935. io_needed(void)
  936. {
  937. rb_raise(rb_eTypeError, "instance of IO needed");
  938. }
  939. /*
  940. * call-seq:
  941. * dump( obj [, anIO] , limit=-1 ) -> anIO
  942. *
  943. * Serializes obj and all descendant objects. If anIO is
  944. * specified, the serialized data will be written to it, otherwise the
  945. * data will be returned as a String. If limit is specified, the
  946. * traversal of subobjects will be limited to that depth. If limit is
  947. * negative, no checking of depth will be performed.
  948. *
  949. * class Klass
  950. * def initialize(str)
  951. * @str = str
  952. * end
  953. * def say_hello
  954. * @str
  955. * end
  956. * end
  957. *
  958. * (produces no output)
  959. *
  960. * o = Klass.new("hello\n")
  961. * data = Marshal.dump(o)
  962. * obj = Marshal.load(data)
  963. * obj.say_hello #=> "hello\n"
  964. *
  965. * Marshal can't dump following objects:
  966. * * anonymous Class/Module.
  967. * * objects which are related to system (ex: Dir, File::Stat, IO, File, Socket
  968. * and so on)
  969. * * an instance of MatchData, Data, Method, UnboundMethod, Proc, Thread,
  970. * ThreadGroup, Continuation
  971. * * objects which define singleton methods
  972. */
  973. static VALUE
  974. marshal_dump(int argc, VALUE *argv, VALUE _)
  975. {
  976. VALUE obj, port, a1, a2;
  977. int limit = -1;
  978. port = Qnil;
  979. rb_scan_args(argc, argv, "12", &obj, &a1, &a2);
  980. if (argc == 3) {
  981. if (!NIL_P(a2)) limit = NUM2INT(a2);
  982. if (NIL_P(a1)) io_needed();
  983. port = a1;
  984. }
  985. else if (argc == 2) {
  986. if (FIXNUM_P(a1)) limit = FIX2INT(a1);
  987. else if (NIL_P(a1)) io_needed();
  988. else port = a1;
  989. }
  990. return rb_marshal_dump_limited(obj, port, limit);
  991. }
  992. VALUE
  993. rb_marshal_dump_limited(VALUE obj, VALUE port, int limit)
  994. {
  995. struct dump_arg *arg;
  996. VALUE wrapper; /* used to avoid memory leak in case of exception */
  997. wrapper = TypedData_Make_Struct(0, struct dump_arg, &dump_arg_data, arg);
  998. arg->dest = 0;
  999. arg->symbols = st_init_numtable();
  1000. arg->data = rb_init_identtable();
  1001. arg->compat_tbl = 0;
  1002. arg->encodings = 0;
  1003. arg->str = rb_str_buf_new(0);
  1004. if (!NIL_P(port)) {
  1005. if (!rb_respond_to(port, s_write)) {
  1006. io_needed();
  1007. }
  1008. arg->dest = port;
  1009. dump_check_funcall(arg, port, s_binmode, 0, 0);
  1010. }
  1011. else {
  1012. port = arg->str;
  1013. }
  1014. w_byte(MARSHAL_MAJOR, arg);
  1015. w_byte(MARSHAL_MINOR, arg);
  1016. w_object(obj, arg, limit);
  1017. if (arg->dest) {
  1018. rb_io_write(arg->dest, arg->str);
  1019. rb_str_resize(arg->str, 0);
  1020. }
  1021. clear_dump_arg(arg);
  1022. RB_GC_GUARD(wrapper);
  1023. return port;
  1024. }
  1025. struct load_arg {
  1026. VALUE src;
  1027. char *buf;
  1028. long buflen;
  1029. long readable;
  1030. long offset;
  1031. st_table *symbols;
  1032. st_table *data;
  1033. VALUE proc;
  1034. st_table *compat_tbl;
  1035. };
  1036. static VALUE
  1037. check_load_arg(VALUE ret, struct load_arg *arg, const char *name)
  1038. {
  1039. if (!arg->symbols) {
  1040. rb_raise(rb_eRuntimeError, "Marshal.load reentered at %s",
  1041. name);
  1042. }
  1043. return ret;
  1044. }
  1045. #define load_funcall(arg, obj, sym, argc, argv) \
  1046. check_load_arg(rb_funcallv(obj, sym, argc, argv), arg, name_##sym)
  1047. static void clear_load_arg(struct load_arg *arg);
  1048. static void
  1049. mark_load_arg(void *ptr)
  1050. {
  1051. struct load_arg *p = ptr;
  1052. if (!p->symbols)
  1053. return;
  1054. rb_mark_tbl(p->symbols);
  1055. rb_mark_tbl(p->data);
  1056. rb_mark_hash(p->compat_tbl);
  1057. }
  1058. static void
  1059. free_load_arg(void *ptr)
  1060. {
  1061. clear_load_arg(ptr);
  1062. xfree(ptr);
  1063. }
  1064. static size_t
  1065. memsize_load_arg(const void *ptr)
  1066. {
  1067. return sizeof(struct load_arg);
  1068. }
  1069. static const rb_data_type_t load_arg_data = {
  1070. "load_arg",
  1071. {mark_load_arg, free_load_arg, memsize_load_arg,},
  1072. 0, 0, RUBY_TYPED_FREE_IMMEDIATELY
  1073. };
  1074. #define r_entry(v, arg) r_entry0((v), (arg)->data->num_entries, (arg))
  1075. static VALUE r_object(struct load_arg *arg);
  1076. static VALUE r_symbol(struct load_arg *arg);
  1077. NORETURN(static void too_short(void));
  1078. static void
  1079. too_short(void)
  1080. {
  1081. rb_raise(rb_eArgError, "marshal data too short");
  1082. }
  1083. static st_index_t
  1084. r_prepare(struct load_arg *arg)
  1085. {
  1086. st_index_t idx = arg->data->num_entries;
  1087. st_insert(arg->data, (st_data_t)idx, (st_data_t)Qundef);
  1088. return idx;
  1089. }
  1090. static unsigned char
  1091. r_byte1_buffered(struct load_arg *arg)
  1092. {
  1093. if (arg->buflen == 0) {
  1094. long readable = arg->readable < BUFSIZ ? arg->readable : BUFSIZ;
  1095. VALUE str, n = LONG2NUM(readable);
  1096. str = load_funcall(arg, arg->src, s_read, 1, &n);
  1097. if (NIL_P(str)) too_short();
  1098. StringValue(str);
  1099. memcpy(arg->buf, RSTRING_PTR(str), RSTRING_LEN(str));
  1100. arg->offset = 0;
  1101. arg->buflen = RSTRING_LEN(str);
  1102. }
  1103. arg->buflen--;
  1104. return arg->buf[arg->offset++];
  1105. }
  1106. static int
  1107. r_byte(struct load_arg *arg)
  1108. {
  1109. int c;
  1110. if (RB_TYPE_P(arg->src, T_STRING)) {
  1111. if (RSTRING_LEN(arg->src) > arg->offset) {
  1112. c = (unsigned char)RSTRING_PTR(arg->src)[arg->offset++];
  1113. }
  1114. else {
  1115. too_short();
  1116. }
  1117. }
  1118. else {
  1119. if (arg->readable >0 || arg->buflen > 0) {
  1120. c = r_byte1_buffered(arg);
  1121. }
  1122. else {
  1123. VALUE v = load_funcall(arg, arg->src, s_getbyte, 0, 0);
  1124. if (NIL_P(v)) rb_eof_error();
  1125. c = (unsigned char)NUM2CHR(v);
  1126. }
  1127. }
  1128. return c;
  1129. }
  1130. NORETURN(static void long_toobig(int size));
  1131. static void
  1132. long_toobig(int size)
  1133. {
  1134. rb_raise(rb_eTypeError, "long too big for this architecture (size "
  1135. STRINGIZE(SIZEOF_LONG)", given %d)", size);
  1136. }
  1137. static long
  1138. r_long(struct load_arg *arg)
  1139. {
  1140. register long x;
  1141. int c = (signed char)r_byte(arg);
  1142. long i;
  1143. if (c == 0) return 0;
  1144. if (c > 0) {
  1145. if (4 < c && c < 128) {
  1146. return c - 5;
  1147. }
  1148. if (c > (int)sizeof(long)) long_toobig(c);
  1149. x = 0;
  1150. for (i=0;i<c;i++) {
  1151. x |= (long)r_byte(arg) << (8*i);
  1152. }
  1153. }
  1154. else {
  1155. if (-129 < c && c < -4) {
  1156. return c + 5;
  1157. }
  1158. c = -c;
  1159. if (c > (int)sizeof(long)) long_toobig(c);
  1160. x = -1;
  1161. for (i=0;i<c;i++) {
  1162. x &= ~((long)0xff << (8*i));
  1163. x |= (long)r_byte(arg) << (8*i);
  1164. }
  1165. }
  1166. return x;
  1167. }
  1168. long
  1169. ruby_marshal_read_long(const char **buf, long len)
  1170. {
  1171. long x;
  1172. struct RString src;
  1173. struct load_arg arg;
  1174. memset(&arg, 0, sizeof(arg));
  1175. arg.src = rb_setup_fake_str(&src, *buf, len, 0);
  1176. x = r_long(&arg);
  1177. *buf += arg.offset;
  1178. return x;
  1179. }
  1180. static VALUE
  1181. r_bytes1(long len, struct load_arg *arg)
  1182. {
  1183. VALUE str, n = LONG2NUM(len);
  1184. str = load_funcall(arg, arg->src, s_read, 1, &n);
  1185. if (NIL_P(str)) too_short();
  1186. StringValue(str);
  1187. if (RSTRING_LEN(str) != len) too_short();
  1188. return str;
  1189. }
  1190. static VALUE
  1191. r_bytes1_buffered(long len, struct load_arg *arg)
  1192. {
  1193. VALUE str;
  1194. if (len <= arg->buflen) {
  1195. str = rb_str_new(arg->buf+arg->offset, len);
  1196. arg->offset += len;
  1197. arg->buflen -= len;
  1198. }
  1199. else {
  1200. long buflen = arg->buflen;
  1201. long readable = arg->readable + 1;
  1202. long tmp_len, read_len, need_len = len - buflen;
  1203. VALUE tmp, n;
  1204. readable = readable < BUFSIZ ? readable : BUFSIZ;
  1205. read_len = need_len > readable ? need_len : readable;
  1206. n = LONG2NUM(read_len);
  1207. tmp = load_funcall(arg, arg->src, s_read, 1, &n);
  1208. if (NIL_P(tmp)) too_short();
  1209. StringValue(tmp);
  1210. tmp_len = RSTRING_LEN(tmp);
  1211. if (tmp_len < need_len) too_short();
  1212. str = rb_str_new(arg->buf+arg->offset, buflen);
  1213. rb_str_cat(str, RSTRING_PTR(tmp), need_len);
  1214. if (tmp_len > need_len) {
  1215. buflen = tmp_len - need_len;
  1216. memcpy(arg->buf, RSTRING_PTR(tmp)+need_len, buflen);
  1217. arg->buflen = buflen;
  1218. }
  1219. else {
  1220. arg->buflen = 0;
  1221. }
  1222. arg->offset = 0;
  1223. }
  1224. return str;
  1225. }
  1226. #define r_bytes(arg) r_bytes0(r_long(arg), (arg))
  1227. static VALUE
  1228. r_bytes0(long len, struct load_arg *arg)
  1229. {
  1230. VALUE str;
  1231. if (len == 0) return rb_str_new(0, 0);
  1232. if (RB_TYPE_P(arg->src, T_STRING)) {
  1233. if (RSTRING_LEN(arg->src) - arg->offset >= len) {
  1234. str = rb_str_new(RSTRING_PTR(arg->src)+arg->offset, len);
  1235. arg->offset += len;
  1236. }
  1237. else {
  1238. too_short();
  1239. }
  1240. }
  1241. else {
  1242. if (arg->readable > 0 || arg->buflen > 0) {
  1243. str = r_bytes1_buffered(len, arg);
  1244. }
  1245. else {
  1246. str = r_bytes1(len, arg);
  1247. }
  1248. }
  1249. return str;
  1250. }
  1251. static inline int
  1252. name_equal(const char *name, size_t nlen, const char *p, long l)
  1253. {
  1254. if ((size_t)l != nlen || *p != *name) return 0;
  1255. return nlen == 1 || memcmp(p+1, name+1, nlen-1) == 0;
  1256. }
  1257. static int
  1258. sym2encidx(VALUE sym, VALUE val)
  1259. {
  1260. static const char name_encoding[8] = "encoding";
  1261. const char *p;
  1262. long l;
  1263. if (rb_enc_get_index(sym) != ENCINDEX_US_ASCII) return -1;
  1264. RSTRING_GETMEM(sym, p, l);
  1265. if (l <= 0) return -1;
  1266. if (name_equal(name_encoding, sizeof(name_encoding), p, l)) {
  1267. int idx = rb_enc_find_index(StringValueCStr(val));
  1268. return idx;
  1269. }
  1270. if (name_equal(name_s_encoding_short, rb_strlen_lit(name_s_encoding_short), p, l)) {
  1271. if (val == Qfalse) return rb_usascii_encindex();
  1272. else if (val == Qtrue) return rb_utf8_encindex();
  1273. /* bogus ignore */
  1274. }
  1275. return -1;
  1276. }
  1277. static int
  1278. ruby2_keywords_flag_check(VALUE sym)
  1279. {
  1280. const char *p;
  1281. long l;
  1282. if (rb_enc_get_index(sym) != ENCINDEX_US_ASCII) return 0;
  1283. RSTRING_GETMEM(sym, p, l);
  1284. if (l <= 0) return 0;
  1285. if (name_equal(name_s_ruby2_keywords_flag, rb_strlen_lit(name_s_ruby2_keywords_flag), p, l)) {
  1286. return 1;
  1287. }
  1288. return 0;
  1289. }
  1290. static VALUE
  1291. r_symlink(struct load_arg *arg)
  1292. {
  1293. st_data_t sym;
  1294. long num = r_long(arg);
  1295. if (!st_lookup(arg->symbols, num, &sym)) {
  1296. rb_raise(rb_eArgError, "bad symbol");
  1297. }
  1298. return (VALUE)sym;
  1299. }
  1300. static VALUE
  1301. r_symreal(struct load_arg *arg, int ivar)
  1302. {
  1303. VALUE s = r_bytes(arg);
  1304. VALUE sym;
  1305. int idx = -1;
  1306. st_index_t n = arg->symbols->num_entries;
  1307. if (rb_enc_str_asciionly_p(s)) rb_enc_associate_index(s, ENCINDEX_US_ASCII);
  1308. st_insert(arg->symbols, (st_data_t)n, (st_data_t)s);
  1309. if (ivar) {
  1310. long num = r_long(arg);
  1311. while (num-- > 0) {
  1312. sym = r_symbol(arg);
  1313. idx = sym2encidx(sym, r_object(arg));
  1314. }
  1315. }
  1316. if (idx > 0) {
  1317. rb_enc_associate_index(s, idx);
  1318. if (rb_enc_str_coderange(s) == ENC_CODERANGE_BROKEN) {
  1319. rb_raise(rb_eArgError, "invalid byte sequence in %s: %+"PRIsVALUE,
  1320. rb_enc_name(rb_enc_from_index(idx)), s);
  1321. }
  1322. }
  1323. return s;
  1324. }
  1325. static VALUE
  1326. r_symbol(struct load_arg *arg)
  1327. {
  1328. int type, ivar = 0;
  1329. again:
  1330. switch ((type = r_byte(arg))) {
  1331. default:
  1332. rb_raise(rb_eArgError, "dump format error for symbol(0x%x)", type);
  1333. case TYPE_IVAR:
  1334. ivar = 1;
  1335. goto again;
  1336. case TYPE_SYMBOL:
  1337. return r_symreal(arg, ivar);
  1338. case TYPE_SYMLINK:
  1339. if (ivar) {
  1340. rb_raise(rb_eArgError, "dump format error (symlink with encoding)");
  1341. }
  1342. return r_symlink(arg);
  1343. }
  1344. }
  1345. static VALUE
  1346. r_unique(struct load_arg *arg)
  1347. {
  1348. return r_symbol(arg);
  1349. }
  1350. static VALUE
  1351. r_string(struct load_arg *arg)
  1352. {
  1353. return r_bytes(arg);
  1354. }
  1355. static VALUE
  1356. r_entry0(VALUE v, st_index_t num, struct load_arg *arg)
  1357. {
  1358. st_data_t real_obj = (st_data_t)v;
  1359. if (arg->compat_tbl) {
  1360. /* real_obj is kept if not found */
  1361. st_lookup(arg->compat_tbl, v, &real_obj);
  1362. }
  1363. st_insert(arg->data, num, real_obj);
  1364. return v;
  1365. }
  1366. static VALUE
  1367. r_fixup_compat(VALUE v, struct load_arg *arg)
  1368. {
  1369. st_data_t data;
  1370. st_data_t key = (st_data_t)v;
  1371. if (arg->compat_tbl && st_delete(arg->compat_tbl, &key, &data)) {
  1372. VALUE real_obj = (VALUE)data;
  1373. rb_alloc_func_t allocator = rb_get_alloc_func(CLASS_OF(real_obj));
  1374. if (st_lookup(compat_allocator_tbl, (st_data_t)allocator, &data)) {
  1375. marshal_compat_t *compat = (marshal_compat_t*)data;
  1376. compat->loader(real_obj, v);
  1377. }
  1378. v = real_obj;
  1379. }
  1380. return v;
  1381. }
  1382. static VALUE
  1383. r_post_proc(VALUE v, struct load_arg *arg)
  1384. {
  1385. if (arg->proc) {
  1386. v = load_funcall(arg, arg->proc, s_call, 1, &v);
  1387. }
  1388. return v;
  1389. }
  1390. static VALUE
  1391. r_leave(VALUE v, struct load_arg *arg)
  1392. {
  1393. v = r_fixup_compat(v, arg);
  1394. v = r_post_proc(v, arg);
  1395. return v;
  1396. }
  1397. static int
  1398. copy_ivar_i(st_data_t key, st_data_t val, st_data_t arg)
  1399. {
  1400. VALUE obj = (VALUE)arg, value = (VALUE)val;
  1401. ID vid = (ID)key;
  1402. if (!rb_ivar_defined(obj, vid))
  1403. rb_ivar_set(obj, vid, value);
  1404. return ST_CONTINUE;
  1405. }
  1406. static VALUE
  1407. r_copy_ivar(VALUE v, VALUE data)
  1408. {
  1409. rb_ivar_foreach(data, copy_ivar_i, (st_data_t)v);
  1410. return v;
  1411. }
  1412. static void
  1413. r_ivar(VALUE obj, int *has_encoding, struct load_arg *arg)
  1414. {
  1415. long len;
  1416. len = r_long(arg);
  1417. if (len > 0) {
  1418. do {
  1419. VALUE sym = r_symbol(arg);
  1420. VALUE val = r_object(arg);
  1421. int idx = sym2encidx(sym, val);
  1422. if (idx >= 0) {
  1423. if (rb_enc_capable(obj)) {
  1424. rb_enc_associate_index(obj, idx);
  1425. }
  1426. else {
  1427. rb_raise(rb_eArgError, "%"PRIsVALUE" is not enc_capable", obj);
  1428. }
  1429. if (has_encoding) *has_encoding = TRUE;
  1430. }
  1431. else if (ruby2_keywords_flag_check(sym)) {
  1432. if (RB_TYPE_P(obj, T_HASH)) {
  1433. rb_hash_ruby2_keywords(obj);
  1434. }
  1435. else {
  1436. rb_raise(rb_eArgError, "ruby2_keywords flag is given but %"PRIsVALUE" is not a Hash", obj);
  1437. }
  1438. }
  1439. else {
  1440. rb_ivar_set(obj, rb_intern_str(sym), val);
  1441. }
  1442. } while (--len > 0);
  1443. }
  1444. }
  1445. static VALUE
  1446. path2class(VALUE path)
  1447. {
  1448. VALUE v = rb_path_to_class(path);
  1449. if (!RB_TYPE_P(v, T_CLASS)) {
  1450. rb_raise(rb_eArgError, "%"PRIsVALUE" does not refer to class", path);
  1451. }
  1452. return v;
  1453. }
  1454. #define path2module(path) must_be_module(rb_path_to_class(path), path)
  1455. static VALUE
  1456. must_be_module(VALUE v, VALUE path)
  1457. {
  1458. if (!RB_TYPE_P(v, T_MODULE)) {
  1459. rb_raise(rb_eArgError, "%"PRIsVALUE" does not refer to module", path);
  1460. }
  1461. return v;
  1462. }
  1463. static VALUE
  1464. obj_alloc_by_klass(VALUE klass, struct load_arg *arg, VALUE *oldclass)
  1465. {
  1466. st_data_t data;
  1467. rb_alloc_func_t allocator;
  1468. allocator = rb_get_alloc_func(klass);
  1469. if (st_lookup(compat_allocator_tbl, (st_data_t)allocator, &data)) {
  1470. marshal_compat_t *compat = (marshal_compat_t*)data;
  1471. VALUE real_obj = rb_obj_alloc(klass);
  1472. VALUE obj = rb_obj_alloc(compat->oldclass);
  1473. if (oldclass) *oldclass = compat->oldclass;
  1474. if (!arg->compat_tbl) {
  1475. arg->compat_tbl = rb_init_identtable();
  1476. }
  1477. st_insert(arg->compat_tbl, (st_data_t)obj, (st_data_t)real_obj);
  1478. return obj;
  1479. }
  1480. return rb_obj_alloc(klass);
  1481. }
  1482. static VALUE
  1483. obj_alloc_by_path(VALUE path, struct load_arg *arg)
  1484. {
  1485. return obj_alloc_by_klass(path2class(path), arg, 0);
  1486. }
  1487. static VALUE
  1488. append_extmod(VALUE obj, VALUE extmod)
  1489. {
  1490. long i = RARRAY_LEN(extmod);
  1491. while (i > 0) {
  1492. VALUE m = RARRAY_AREF(extmod, --i);
  1493. rb_extend_object(obj, m);
  1494. }
  1495. return obj;
  1496. }
  1497. #define prohibit_ivar(type, str) do { \
  1498. if (!ivp || !*ivp) break; \
  1499. rb_raise(rb_eTypeError, \
  1500. "can't override instance variable of "type" `%"PRIsVALUE"'", \
  1501. (str)); \
  1502. } while (0)
  1503. static VALUE
  1504. r_object0(struct load_arg *arg, int *ivp, VALUE extmod)
  1505. {
  1506. VALUE v = Qnil;
  1507. int type = r_byte(arg);
  1508. long id;
  1509. st_data_t link;
  1510. switch (type) {
  1511. case TYPE_LINK:
  1512. id = r_long(arg);
  1513. if (!st_lookup(arg->data, (st_data_t)id, &link)) {
  1514. rb_raise(rb_eArgError, "dump format error (unlinked)");
  1515. }
  1516. v = (VALUE)link;
  1517. v = r_post_proc(v, arg);
  1518. break;
  1519. case TYPE_IVAR:
  1520. {
  1521. int ivar = TRUE;
  1522. v = r_object0(arg, &ivar, extmod);
  1523. if (ivar) r_ivar(v, NULL, arg);
  1524. if (RB_TYPE_P(v, T_STRING)) {
  1525. v = r_leave(v, arg);
  1526. }
  1527. }
  1528. break;
  1529. case TYPE_EXTENDED:
  1530. {
  1531. VALUE path = r_unique(arg);
  1532. VALUE m = rb_path_to_class(path);
  1533. if (NIL_P(extmod)) extmod = rb_ary_tmp_new(0);
  1534. if (RB_TYPE_P(m, T_CLASS)) { /* prepended */
  1535. VALUE c;
  1536. v = r_object0(arg, 0, Qnil);
  1537. c = CLASS_OF(v);
  1538. if (c != m || FL_TEST(c, FL_SINGLETON)) {
  1539. rb_raise(rb_eArgError,
  1540. "prepended class %"PRIsVALUE" differs from class %"PRIsVALUE,
  1541. path, rb_class_name(c));
  1542. }
  1543. c = rb_singleton_class(v);
  1544. while (RARRAY_LEN(extmod) > 0) {
  1545. m = rb_ary_pop(extmod);
  1546. rb_prepend_module(c, m);
  1547. }
  1548. }
  1549. else {
  1550. must_be_module(m, path);
  1551. rb_ary_push(extmod, m);
  1552. v = r_object0(arg, 0, extmod);
  1553. while (RARRAY_LEN(extmod) > 0) {
  1554. m = rb_ary_pop(extmod);
  1555. rb_extend_object(v, m);
  1556. }
  1557. }
  1558. }
  1559. break;
  1560. case TYPE_UCLASS:
  1561. {
  1562. VALUE c = path2class(r_unique(arg));
  1563. if (FL_TEST(c, FL_SINGLETON)) {
  1564. rb_raise(rb_eTypeError, "singleton can't be loaded");
  1565. }
  1566. v = r_object0(arg, 0, extmod);
  1567. if (rb_special_const_p(v) || RB_TYPE_P(v, T_OBJECT) || RB_TYPE_P(v, T_CLASS)) {
  1568. goto format_error;
  1569. }
  1570. if (RB_TYPE_P(v, T_MODULE) || !RTEST(rb_class_inherited_p(c, RBASIC(v)->klass))) {
  1571. VALUE tmp = rb_obj_alloc(c);
  1572. if (TYPE(v) != TYPE(tmp)) goto format_error;
  1573. }
  1574. RBASIC_SET_CLASS(v, c);
  1575. }
  1576. break;
  1577. format_error:
  1578. rb_raise(rb_eArgError, "dump format error (user class)");
  1579. case TYPE_NIL:
  1580. v = Qnil;
  1581. v = r_leave(v, arg);
  1582. break;
  1583. case TYPE_TRUE:
  1584. v = Qtrue;
  1585. v = r_leave(v, arg);
  1586. break;
  1587. case TYPE_FALSE:
  1588. v = Qfalse;
  1589. v = r_leave(v, arg);
  1590. break;
  1591. case TYPE_FIXNUM:
  1592. {
  1593. long i = r_long(arg);
  1594. v = LONG2FIX(i);
  1595. }
  1596. v = r_leave(v, arg);
  1597. break;
  1598. case TYPE_FLOAT:
  1599. {
  1600. double d;
  1601. VALUE str = r_bytes(arg);
  1602. const char *ptr = RSTRING_PTR(str);
  1603. if (strcmp(ptr, "nan") == 0) {
  1604. d = nan("");
  1605. }
  1606. else if (strcmp(ptr, "inf") == 0) {
  1607. d = HUGE_VAL;
  1608. }
  1609. else if (strcmp(ptr, "-inf") == 0) {
  1610. d = -HUGE_VAL;
  1611. }
  1612. else {
  1613. char *e;
  1614. d = strtod(ptr, &e);
  1615. d = load_mantissa(d, e, RSTRING_LEN(str) - (e - ptr));
  1616. }
  1617. v = DBL2NUM(d);
  1618. v = r_entry(v, arg);
  1619. v = r_leave(v, arg);
  1620. }
  1621. break;
  1622. case TYPE_BIGNUM:
  1623. {
  1624. long len;
  1625. VALUE data;
  1626. int sign;
  1627. sign = r_byte(arg);
  1628. len = r_long(arg);
  1629. data = r_bytes0(len * 2, arg);
  1630. v = rb_integer_unpack(RSTRING_PTR(data), len, 2, 0,
  1631. INTEGER_PACK_LITTLE_ENDIAN | (sign == '-' ? INTEGER_PACK_NEGATIVE : 0));
  1632. rb_str_resize(data, 0L);
  1633. v = r_entry(v, arg);
  1634. v = r_leave(v, arg);
  1635. }
  1636. break;
  1637. case TYPE_STRING:
  1638. v = r_entry(r_string(arg), arg);
  1639. if (!ivp) {
  1640. v = r_leave(v, arg);
  1641. }
  1642. break;
  1643. case TYPE_REGEXP:
  1644. {
  1645. VALUE str = r_bytes(arg);
  1646. int options = r_byte(arg);
  1647. int has_encoding = FALSE;
  1648. st_index_t idx = r_prepare(arg);
  1649. if (ivp) {
  1650. r_ivar(str, &has_encoding, arg);
  1651. *ivp = FALSE;
  1652. }
  1653. if (!has_encoding) {
  1654. /* 1.8 compatibility; remove escapes undefined in 1.8 */
  1655. char *ptr = RSTRING_PTR(str), *dst = ptr, *src = ptr;
  1656. long len = RSTRING_LEN(str);
  1657. long bs = 0;
  1658. for (; len-- > 0; *dst++ = *src++) {
  1659. switch (*src) {
  1660. case '\\': bs++; break;
  1661. case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
  1662. case 'm': case 'o': case 'p': case 'q': case 'u': case 'y':
  1663. case 'E': case 'F': case 'H': case 'I': case 'J': case 'K':
  1664. case 'L': case 'N': case 'O': case 'P': case 'Q': case 'R':
  1665. case 'S': case 'T': case 'U': case 'V': case 'X': case 'Y':
  1666. if (bs & 1) --dst;
  1667. /* fall through */
  1668. default: bs = 0; break;
  1669. }
  1670. }
  1671. rb_str_set_len(str, dst - ptr);
  1672. }
  1673. v = r_entry0(rb_reg_new_str(str, options), idx, arg);
  1674. v = r_leave(v, arg);
  1675. }
  1676. break;
  1677. case TYPE_ARRAY:
  1678. {
  1679. long len = r_long(arg);
  1680. v = rb_ary_new2(len);
  1681. v = r_entry(v, arg);
  1682. arg->readable += len - 1;
  1683. while (len--) {
  1684. rb_ary_push(v, r_object(arg));
  1685. arg->readable--;
  1686. }
  1687. v = r_leave(v, arg);
  1688. arg->readable++;
  1689. }
  1690. break;
  1691. case TYPE_HASH:
  1692. case TYPE_HASH_DEF:
  1693. {
  1694. long len = r_long(arg);
  1695. v = rb_hash_new_with_size(len);
  1696. v = r_entry(v, arg);
  1697. arg->readable += (len - 1) * 2;
  1698. while (len--) {
  1699. VALUE key = r_object(arg);
  1700. VALUE value = r_object(arg);
  1701. rb_hash_aset(v, key, value);
  1702. arg->readable -= 2;
  1703. }
  1704. arg->readable += 2;
  1705. if (type == TYPE_HASH_DEF) {
  1706. RHASH_SET_IFNONE(v, r_object(arg));
  1707. }
  1708. v = r_leave(v, arg);
  1709. }
  1710. break;
  1711. case TYPE_STRUCT:
  1712. {
  1713. VALUE mem, values;
  1714. long i;
  1715. VALUE slot;
  1716. st_index_t idx = r_prepare(arg);
  1717. VALUE klass = path2class(r_unique(arg));
  1718. long len = r_long(arg);
  1719. v = rb_obj_alloc(klass);
  1720. if (!RB_TYPE_P(v, T_STRUCT)) {
  1721. rb_raise(rb_eTypeError, "class %"PRIsVALUE" not a struct", rb_class_name(klass));
  1722. }
  1723. mem = rb_struct_s_members(klass);
  1724. if (RARRAY_LEN(mem) != len) {
  1725. rb_raise(rb_eTypeError, "struct %"PRIsVALUE" not compatible (struct size differs)",
  1726. rb_class_name(klass));
  1727. }
  1728. arg->readable += (len - 1) * 2;
  1729. v = r_entry0(v, idx, arg);
  1730. values = rb_ary_new2(len);
  1731. {
  1732. VALUE keywords = Qfalse;
  1733. if (RTEST(rb_struct_s_keyword_init(klass))) {
  1734. keywords = rb_hash_new();
  1735. rb_ary_push(values, keywords);
  1736. }
  1737. for (i=0; i<len; i++) {
  1738. VALUE n = rb_sym2str(RARRAY_AREF(mem, i));
  1739. slot = r_symbol(arg);
  1740. if (!rb_str_equal(n, slot)) {
  1741. rb_raise(rb_eTypeError, "struct %"PRIsVALUE" not compatible (:%"PRIsVALUE" for :%"PRIsVALUE")",
  1742. rb_class_name(klass),
  1743. slot, n);
  1744. }
  1745. if (keywords) {
  1746. rb_hash_aset(keywords, RARRAY_AREF(mem, i), r_object(arg));
  1747. }
  1748. else {
  1749. rb_ary_push(values, r_object(arg));
  1750. }
  1751. arg->readable -= 2;
  1752. }
  1753. }
  1754. rb_struct_initialize(v, values);
  1755. v = r_leave(v, arg);
  1756. arg->readable += 2;
  1757. }
  1758. break;
  1759. case TYPE_USERDEF:
  1760. {
  1761. VALUE name = r_unique(arg);
  1762. VALUE klass = path2class(name);
  1763. VALUE data;
  1764. st_data_t d;
  1765. if (!rb_obj_respond_to(klass, s_load, TRUE)) {
  1766. rb_raise(rb_eTypeError, "class %"PRIsVALUE" needs to have method `_load'",
  1767. name);
  1768. }
  1769. data = r_string(arg);
  1770. if (ivp) {
  1771. r_ivar(data, NULL, arg);
  1772. *ivp = FALSE;
  1773. }
  1774. v = load_funcall(arg, klass, s_load, 1, &data);
  1775. v = r_entry(v, arg);
  1776. if (st_lookup(compat_allocator_tbl, (st_data_t)rb_get_alloc_func(klass), &d)) {
  1777. marshal_compat_t *compat = (marshal_compat_t*)d;
  1778. v = compat->loader(klass, v);
  1779. }
  1780. v = r_post_proc(v, arg);
  1781. }
  1782. break;
  1783. case TYPE_USRMARSHAL:
  1784. {
  1785. VALUE name = r_unique(arg);
  1786. VALUE klass = path2class(name);
  1787. VALUE oldclass = 0;
  1788. VALUE data;
  1789. v = obj_alloc_by_klass(klass, arg, &oldclass);
  1790. if (!NIL_P(extmod)) {
  1791. /* for the case marshal_load is overridden */
  1792. append_extmod(v, extmod);
  1793. }
  1794. if (!rb_obj_respond_to(v, s_mload, TRUE)) {
  1795. rb_raise(rb_eTypeError, "instance of %"PRIsVALUE" needs to have method `marshal_load'",
  1796. name);
  1797. }
  1798. v = r_entry(v, arg);
  1799. data = r_object(arg);
  1800. load_funcall(arg, v, s_mload, 1, &data);
  1801. v = r_fixup_compat(v, arg);
  1802. v = r_copy_ivar(v, data);
  1803. v = r_post_proc(v, arg);
  1804. if (!NIL_P(extmod)) {
  1805. if (oldclass) append_extmod(v, extmod);
  1806. rb_ary_clear(extmod);
  1807. }
  1808. }
  1809. break;
  1810. case TYPE_OBJECT:
  1811. {
  1812. st_index_t idx = r_prepare(arg);
  1813. v = obj_alloc_by_path(r_unique(arg), arg);
  1814. if (!RB_TYPE_P(v, T_OBJECT)) {
  1815. rb_raise(rb_eArgError, "dump format error");
  1816. }
  1817. v = r_entry0(v, idx, arg);
  1818. r_ivar(v, NULL, arg);
  1819. v = r_leave(v, arg);
  1820. }
  1821. break;
  1822. case TYPE_DATA:
  1823. {
  1824. VALUE name = r_unique(arg);
  1825. VALUE klass = path2class(name);
  1826. VALUE oldclass = 0;
  1827. VALUE r;
  1828. v = obj_alloc_by_klass(klass, arg, &oldclass);
  1829. if (!RB_TYPE_P(v, T_DATA)) {
  1830. rb_raise(rb_eArgError, "dump format error");
  1831. }
  1832. v = r_entry(v, arg);
  1833. if (!rb_obj_respond_to(v, s_load_data, TRUE)) {
  1834. rb_raise(rb_eTypeError,
  1835. "class %"PRIsVALUE" needs to have instance method `_load_data'",
  1836. name);
  1837. }
  1838. r = r_object0(arg, 0, extmod);
  1839. load_funcall(arg, v, s_load_data, 1, &r);
  1840. v = r_leave(v, arg);
  1841. }
  1842. break;
  1843. case TYPE_MODULE_OLD:
  1844. {
  1845. VALUE str = r_bytes(arg);
  1846. v = rb_path_to_class(str);
  1847. prohibit_ivar("class/module", str);
  1848. v = r_entry(v, arg);
  1849. v = r_leave(v, arg);
  1850. }
  1851. break;
  1852. case TYPE_CLASS:
  1853. {
  1854. VALUE str = r_bytes(arg);
  1855. v = path2class(str);
  1856. prohibit_ivar("class", str);
  1857. v = r_entry(v, arg);
  1858. v = r_leave(v, arg);
  1859. }
  1860. break;
  1861. case TYPE_MODULE:
  1862. {
  1863. VALUE str = r_bytes(arg);
  1864. v = path2module(str);
  1865. prohibit_ivar("module", str);
  1866. v = r_entry(v, arg);
  1867. v = r_leave(v, arg);
  1868. }
  1869. break;
  1870. case TYPE_SYMBOL:
  1871. if (ivp) {
  1872. v = r_symreal(arg, *ivp);
  1873. *ivp = FALSE;
  1874. }
  1875. else {
  1876. v = r_symreal(arg, 0);
  1877. }
  1878. v = rb_str_intern(v);
  1879. v = r_leave(v, arg);
  1880. break;
  1881. case TYPE_SYMLINK:
  1882. v = rb_str_intern(r_symlink(arg));
  1883. break;
  1884. default:
  1885. rb_raise(rb_eArgError, "dump format error(0x%x)", type);
  1886. break;
  1887. }
  1888. if (v == Qundef) {
  1889. rb_raise(rb_eArgError, "dump format error (bad link)");
  1890. }
  1891. return v;
  1892. }

Large files files are truncated, but you can click here to view the full file