ruby_deep_clone 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/deep_clone.gemspec +4 -4
- data/ext/deep_clone/deep_clone.c +6 -3
- data/ext/deep_clone/deep_clone.h +24 -4
- metadata +26 -9
data/deep_clone.gemspec
CHANGED
@@ -4,14 +4,14 @@ Gem::Specification.new do |s|
|
|
4
4
|
s.rubygems_version = '1.3.5'
|
5
5
|
|
6
6
|
s.name = 'ruby_deep_clone'
|
7
|
-
s.version = '0.
|
8
|
-
s.date = '
|
7
|
+
s.version = '0.4.0'
|
8
|
+
s.date = '2014-01-21'
|
9
9
|
|
10
10
|
s.summary = "Ruby native deep clone"
|
11
11
|
s.description = "Native implementation to create deep clones of Ruby objects"
|
12
12
|
|
13
|
-
s.authors = ["Matthias Balmer", "Andre Medeiros"]
|
14
|
-
s.email = ['balmma@sysinf.ch', 'me@andremedeiros.info']
|
13
|
+
s.authors = ["Matthias Balmer", "Andre Medeiros", "Anthony Williams"]
|
14
|
+
s.email = ['balmma@sysinf.ch', 'me@andremedeiros.info', 'hi@antw.io']
|
15
15
|
|
16
16
|
s.homepage = "https://github.com/balmma/ruby-deepclone"
|
17
17
|
|
data/ext/deep_clone/deep_clone.c
CHANGED
@@ -33,9 +33,11 @@ void Init_deep_clone()
|
|
33
33
|
|
34
34
|
static int clone_variable(st_data_t key, st_data_t index, struct dump_call_arg *arg)
|
35
35
|
{
|
36
|
-
VALUE val = rb_ivar_get(arg->obj, (ID)key)
|
36
|
+
VALUE val = rb_ivar_get(arg->obj, (ID)key);
|
37
37
|
inspect_kvp((ID)key, val);
|
38
|
-
|
38
|
+
// Check if value is nil. For some reason, if you "force" an instance value
|
39
|
+
// to nil, the ||= operator won't work.
|
40
|
+
if(!NIL_P(val)) rb_ivar_set(arg->obj, (ID)key, clone_object(val,arg->tracker));
|
39
41
|
return ST_CONTINUE;
|
40
42
|
}
|
41
43
|
|
@@ -103,7 +105,8 @@ static VALUE clone_object(VALUE object, VALUE tracker)
|
|
103
105
|
OBJ_UNFREEZE(new_obj);
|
104
106
|
|
105
107
|
rb_hash_aset(tracker,id,new_obj);
|
106
|
-
st_table *tbl =
|
108
|
+
st_table *tbl = DC_ROBJECT_IV_INDEX_TBL(object);
|
109
|
+
|
107
110
|
if(tbl) {
|
108
111
|
struct dump_call_arg arg = {new_obj,tracker, object};
|
109
112
|
TABLE_FOREACH(tbl, clone_variable, (st_data_t)&arg);
|
data/ext/deep_clone/deep_clone.h
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
#include "ruby.h"
|
5
5
|
#include "ruby/st.h"
|
6
|
+
#include "ruby/version.h"
|
6
7
|
|
7
8
|
struct dump_call_arg {
|
8
9
|
VALUE obj;
|
@@ -17,7 +18,7 @@ struct dump_call_arg {
|
|
17
18
|
#ifdef SA_EMPTY
|
18
19
|
|
19
20
|
// Gotta do this because of 1.9.3's falcon patch
|
20
|
-
|
21
|
+
struct rb_classext_struct {
|
21
22
|
sa_table m_tbl;
|
22
23
|
sa_table iv_tbl;
|
23
24
|
sa_table const_tbl;
|
@@ -25,16 +26,35 @@ struct dump_call_arg {
|
|
25
26
|
};
|
26
27
|
|
27
28
|
#define TABLE_FOREACH sa_foreach
|
28
|
-
#define
|
29
|
-
#define
|
29
|
+
#define DC_RCLASS_EXT(c) (RCLASS(c)->ptr)
|
30
|
+
#define DC_RCLASS_IV_INDEX_TBL(c) (&DC_RCLASS_EXT(c)->iv_index_tbl)
|
30
31
|
|
31
32
|
#else
|
32
33
|
// Make it work with vanilla ruby (including 2.0)
|
33
|
-
#define RCLASS_IV_INDEX_TBL(c) (RCLASS(c)->iv_index_tbl)
|
34
34
|
#define TABLE_FOREACH st_foreach
|
35
35
|
|
36
|
+
#if RUBY_API_VERSION_CODE >= 20100
|
37
|
+
|
38
|
+
// In Ruby 2.1, iv_index_tbl was moved into internal.h and cannot be accessed
|
39
|
+
// directly. We work around this by defining our own RCLASS helpers (since the
|
40
|
+
// rb_classext_struct returned by RCLASS_EXT is also effectively private).
|
41
|
+
typedef struct dc_iv_tbl_classext_struct {
|
42
|
+
struct st_table *iv_index_tbl;
|
43
|
+
} dc_iv_tbl_classext_t;
|
44
|
+
|
45
|
+
#define DC_RCLASS_EXT(c) ((dc_iv_tbl_classext_t *)RCLASS(c)->ptr)
|
46
|
+
#define DC_RCLASS_IV_INDEX_TBL(c) (DC_RCLASS_EXT(c)->iv_index_tbl)
|
47
|
+
|
48
|
+
#else
|
49
|
+
#define DC_RCLASS_IV_INDEX_TBL(c) (RCLASS(c)->iv_index_tbl)
|
50
|
+
#endif
|
36
51
|
#endif
|
37
52
|
|
53
|
+
#define DC_ROBJECT_IV_INDEX_TBL(o) \
|
54
|
+
((RBASIC(o)->flags & ROBJECT_EMBED) ? \
|
55
|
+
DC_RCLASS_IV_INDEX_TBL(rb_obj_class(o)) : \
|
56
|
+
ROBJECT(o)->as.heap.iv_index_tbl)
|
57
|
+
|
38
58
|
VALUE DeepClone = Qnil;
|
39
59
|
|
40
60
|
void Init_deep_clone();
|
metadata
CHANGED
@@ -1,20 +1,21 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_deep_clone
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Matthias Balmer
|
9
9
|
- Andre Medeiros
|
10
|
+
- Anthony Williams
|
10
11
|
autorequire:
|
11
12
|
bindir: bin
|
12
13
|
cert_chain: []
|
13
|
-
date:
|
14
|
+
date: 2014-01-21 00:00:00.000000000 Z
|
14
15
|
dependencies:
|
15
16
|
- !ruby/object:Gem::Dependency
|
16
17
|
name: rspec
|
17
|
-
requirement:
|
18
|
+
requirement: !ruby/object:Gem::Requirement
|
18
19
|
none: false
|
19
20
|
requirements:
|
20
21
|
- - ~>
|
@@ -22,10 +23,15 @@ dependencies:
|
|
22
23
|
version: 2.13.0
|
23
24
|
type: :development
|
24
25
|
prerelease: false
|
25
|
-
version_requirements:
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
28
|
+
requirements:
|
29
|
+
- - ~>
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: 2.13.0
|
26
32
|
- !ruby/object:Gem::Dependency
|
27
33
|
name: rake-compiler
|
28
|
-
requirement:
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
29
35
|
none: false
|
30
36
|
requirements:
|
31
37
|
- - ~>
|
@@ -33,10 +39,15 @@ dependencies:
|
|
33
39
|
version: 0.8.3
|
34
40
|
type: :development
|
35
41
|
prerelease: false
|
36
|
-
version_requirements:
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.8.3
|
37
48
|
- !ruby/object:Gem::Dependency
|
38
49
|
name: rake
|
39
|
-
requirement:
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
40
51
|
none: false
|
41
52
|
requirements:
|
42
53
|
- - ~>
|
@@ -44,11 +55,17 @@ dependencies:
|
|
44
55
|
version: 10.0.4
|
45
56
|
type: :development
|
46
57
|
prerelease: false
|
47
|
-
version_requirements:
|
58
|
+
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ~>
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 10.0.4
|
48
64
|
description: Native implementation to create deep clones of Ruby objects
|
49
65
|
email:
|
50
66
|
- balmma@sysinf.ch
|
51
67
|
- me@andremedeiros.info
|
68
|
+
- hi@antw.io
|
52
69
|
executables: []
|
53
70
|
extensions:
|
54
71
|
- ext/deep_clone/extconf.rb
|
@@ -80,7 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
97
|
version: '0'
|
81
98
|
requirements: []
|
82
99
|
rubyforge_project:
|
83
|
-
rubygems_version: 1.8.
|
100
|
+
rubygems_version: 1.8.25
|
84
101
|
signing_key:
|
85
102
|
specification_version: 2
|
86
103
|
summary: Ruby native deep clone
|