ruby_deep_clone 0.6.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: b1086102141290170ef6fb7dbb11f0f27f81a36a
4
- data.tar.gz: b3dbdf4d362a619fd482d82bb01ac056e0426c3d
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YmEwZmJkNDViNTAxMWUzMjFlZWVjOWMxNGMwZTE0MWI3ZDU4ZTU3ZA==
5
+ data.tar.gz: !binary |-
6
+ MjU3ZjYxNjBiMWVkZThjZDE3NzU1NTYzYWZiNjY0ZGRlNjg0NDAxZA==
5
7
  SHA512:
6
- metadata.gz: 16abbb13ac3804516a87faf43779dfe687c81fc0c65931bc5ec66c079b2e444c5c0ce8c5443f4c4b22bde68b6792b74a781b276d399e2d26fa6d103c30432a69
7
- data.tar.gz: 58b7c11fb7d664943a7994f4af913ff9b3c4db0bcba968c0c35a2960c3b3a1a0925dbf5f2190748a87d4382a45e54ef45da429a73a5ede7aa9e338b1ea61afa9
8
+ metadata.gz: !binary |-
9
+ YWIzODVlZjdlMWUwYmNkMDc1ZGIyMTY0YmJjMjBlNjg3NDQ2NzdiNjYyN2Uz
10
+ MDE1OTQyYWQ0YmQ5YzQxN2FhMTcyOWI5NTc1OGFhMDlkZTI4MTgxNGUyMGEx
11
+ Zjk5OTUxNDQ5OTk4OTNhMzk4NDA1YmE5YzBjNDVjNjZiZWFiZGM=
12
+ data.tar.gz: !binary |-
13
+ Nzg2OWE1YWRkYTZjYzM1NGVjY2E4NGZiMjI1MGIwNDQ3MzM4YTE3OTZhMTkx
14
+ YTY2YmE0ZGM0ODNhY2MxNzg2YTk5MTI0NmFhNGI2ZWI1NmMwZTc4NDJiNDlj
15
+ NGQ4OWFkYWRhNGNmNWQxOTJmMmM4ZTc0MzllOGYzMjI4M2Q5M2Q=
@@ -1,25 +1,28 @@
1
1
  #include "deep_clone.h"
2
+
2
3
  int ident = 0;
3
4
 
4
- void
5
- inspect(VALUE val) {
6
- #ifdef DC_DEBUG
7
- int i;
8
- for(i = 0; i <= ident-1; i++) {
5
+ void inspect(VALUE val)
6
+ {
7
+ #if DC_DEBUG
8
+ for(int i = 0; i <= ident - 1; ++i)
9
+ {
9
10
  printf("\t");
10
11
  }
12
+
11
13
  printf("BEFORE %d ", BUILTIN_TYPE(val));
12
14
  printf("INSPECT: %s\n", RSTRING_PTR(rb_any_to_s(val)));
13
15
  #endif
14
16
  }
15
17
 
16
- void
17
- inspect_kvp(ID key, VALUE val) {
18
- #ifdef DC_DEBUG
19
- int i;
20
- for(i = 0; i <= ident-1; i++) {
18
+ void inspect_kvp(ID key, VALUE val)
19
+ {
20
+ #if DC_DEBUG
21
+ for(int i = 0; i <= ident - 1; ++i)
22
+ {
21
23
  printf("\t");
22
24
  }
25
+
23
26
  printf("BEFORE %s %d %d", RSTRING_PTR(rb_inspect(ID2SYM(key))), val);
24
27
  printf("VALUE: %s => %s\n", RSTRING_PTR(rb_inspect(ID2SYM(key))), RSTRING_PTR(rb_any_to_s(val)));
25
28
  #endif
@@ -33,60 +36,88 @@ void Init_deep_clone()
33
36
 
34
37
  static int clone_variable(st_data_t key, st_data_t index, struct dump_call_arg *arg)
35
38
  {
36
- VALUE val = rb_ivar_get(arg->obj, (ID)key);
37
- inspect_kvp((ID)key, val);
39
+ VALUE val = rb_ivar_get(arg->obj, (ID) key);
40
+ inspect_kvp((ID) key, val);
41
+
38
42
  // Check if value is nil. For some reason, if you "force" an instance value
39
43
  // to nil, the ||= operator won't work.
40
- if(!NIL_P(val)) rb_ivar_set(arg->obj, (ID)key, clone_object(val,arg->tracker));
44
+ if(!NIL_P(val))
45
+ {
46
+ rb_ivar_set(arg->obj, (ID) key, clone_object(val, arg->tracker));
47
+ }
48
+
41
49
  return ST_CONTINUE;
42
50
  }
43
51
 
44
52
  static int hash_each(VALUE key, VALUE value, struct dump_call_arg *arg)
45
53
  {
46
- rb_hash_aset(arg->obj,clone_object(key,arg->tracker),clone_object(value,arg->tracker));
54
+ rb_hash_aset(arg->obj, clone_object(key, arg->tracker), clone_object(value, arg->tracker));
55
+
47
56
  return ST_CONTINUE;
48
57
  }
49
58
 
50
59
  static VALUE clone_object(VALUE object, VALUE tracker)
51
60
  {
52
61
  if(rb_special_const_p(object))
62
+ {
53
63
  return object;
64
+ }
54
65
 
55
66
  inspect(object);
56
67
 
57
68
  VALUE new_obj;
58
69
  VALUE id = rb_obj_id(object);
59
70
 
60
- if(st_lookup(RHASH_TBL(tracker), id, 0)) {
61
- new_obj = rb_hash_aref(tracker,id);
62
- } else {
63
- ident++;
64
- switch (BUILTIN_TYPE(object)) {
71
+ if(st_lookup(RHASH_TBL(tracker), id, 0))
72
+ {
73
+ new_obj = rb_hash_aref(tracker, id);
74
+ }
75
+ else
76
+ {
77
+ ++ident;
78
+
79
+ switch(BUILTIN_TYPE(object))
80
+ {
65
81
  case T_ARRAY:
66
82
  new_obj = rb_ary_new2(RARRAY_LEN(object));
67
83
  long len = RARRAY_LEN(object);
68
- if(len == 0) break;
69
- rb_hash_aset(tracker,id,new_obj);
84
+ if(len == 0)
85
+ {
86
+ break;
87
+ }
88
+
89
+ rb_hash_aset(tracker, id, new_obj);
90
+
70
91
  VALUE *ptr = RARRAY_PTR(object);
71
- while (len--) {
72
- rb_ary_push(new_obj,clone_object(*ptr,tracker));
73
- ptr++;
92
+ while(len--)
93
+ {
94
+ rb_ary_push(new_obj, clone_object(*ptr, tracker));
95
+
96
+ ++ptr;
74
97
  }
98
+
75
99
  break;
76
100
  case T_HASH:
77
101
  new_obj = rb_hash_new();
78
- rb_hash_aset(tracker,id,new_obj);
79
- struct dump_call_arg arg = {new_obj,tracker, object};
80
- rb_hash_foreach(object, hash_each, (st_data_t)&arg);
102
+ rb_hash_aset(tracker, id, new_obj);
103
+
104
+ struct dump_call_arg arg = { new_obj, tracker, object };
105
+ rb_hash_foreach(object, hash_each, (st_data_t) &arg);
106
+
81
107
  break;
82
108
  case T_STRING:
83
109
  case T_DATA:
84
- if(rb_obj_is_kind_of(object,rb_cNumeric)){
110
+ if(rb_obj_is_kind_of(object, rb_cNumeric))
111
+ {
85
112
  new_obj = object;
86
- } else {
113
+ }
114
+ else
115
+ {
87
116
  new_obj = rb_obj_clone(object);
88
117
  }
89
- rb_hash_aset(tracker,id,new_obj);
118
+
119
+ rb_hash_aset(tracker, id, new_obj);
120
+
90
121
  break;
91
122
  case T_CLASS:
92
123
  case T_MODULE:
@@ -100,37 +131,51 @@ static VALUE clone_object(VALUE object, VALUE tracker)
100
131
  case T_STRUCT:
101
132
  case T_FILE:
102
133
  new_obj = object;
103
- rb_hash_aset(tracker,id,new_obj);
134
+
135
+ rb_hash_aset(tracker, id, new_obj);
136
+
104
137
  break;
105
138
  default:
106
- if(rb_obj_is_kind_of(object,rb_cNumeric)){
139
+ if(rb_obj_is_kind_of(object, rb_cNumeric))
140
+ {
107
141
  new_obj = object;
108
- rb_hash_aset(tracker,id,new_obj);
109
- } else {
142
+ rb_hash_aset(tracker, id, new_obj);
143
+ }
144
+ else
145
+ {
110
146
  new_obj = rb_obj_clone(object);
111
147
 
112
148
  // Unfreeze the new object
113
149
  OBJ_UNFREEZE(new_obj);
114
150
 
115
- rb_hash_aset(tracker,id,new_obj);
151
+ rb_hash_aset(tracker, id, new_obj);
152
+
116
153
  st_table *tbl = DC_ROBJECT_IV_INDEX_TBL(object);
117
154
 
118
- if(tbl) {
119
- struct dump_call_arg arg = {new_obj,tracker, object};
120
- TABLE_FOREACH(tbl, clone_variable, (st_data_t)&arg);
155
+ if(tbl)
156
+ {
157
+ struct dump_call_arg arg = { new_obj, tracker, object };
158
+ TABLE_FOREACH(tbl, clone_variable, (st_data_t) &arg);
121
159
  }
122
160
 
123
- if(OBJ_FROZEN(object)) OBJ_FREEZE(new_obj);
161
+ if(OBJ_FROZEN(object))
162
+ {
163
+ OBJ_FREEZE(new_obj);
164
+ }
124
165
  }
166
+
125
167
  break;
126
168
  }
127
- ident--;
169
+
170
+ --ident;
128
171
  }
172
+
129
173
  return new_obj;
130
174
  }
131
175
 
132
- VALUE deep_clone(int argc,VALUE argv)
176
+ VALUE deep_clone(int argc, VALUE argv)
133
177
  {
134
178
  VALUE tracker = rb_hash_new();
135
- return clone_object(argv,tracker);
179
+
180
+ return clone_object(argv, tracker);
136
181
  }
@@ -1,7 +1,3 @@
1
1
  require 'mkmf'
2
2
 
3
- extension_name = 'deep_clone'
4
-
5
- dir_config(extension_name)
6
-
7
- create_makefile(extension_name)
3
+ create_makefile('deep_clone/deep_clone')
data/lib/deep_clone.rb CHANGED
@@ -1 +1 @@
1
- require "deep_clone/deep_clone"
1
+ require 'deep_clone/deep_clone'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_deep_clone
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthias Balmer
@@ -10,50 +10,50 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-01-21 00:00:00.000000000 Z
13
+ date: 2016-03-24 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: rspec
16
+ name: rake
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - "~>"
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 2.13.0
21
+ version: '10.5'
22
22
  type: :development
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
- - - "~>"
26
+ - - ~>
27
27
  - !ruby/object:Gem::Version
28
- version: 2.13.0
28
+ version: '10.5'
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: rake-compiler
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
- - - "~>"
33
+ - - ~>
34
34
  - !ruby/object:Gem::Version
35
35
  version: 0.8.3
36
36
  type: :development
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
- - - "~>"
40
+ - - ~>
41
41
  - !ruby/object:Gem::Version
42
42
  version: 0.8.3
43
43
  - !ruby/object:Gem::Dependency
44
- name: rake
44
+ name: rspec
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
- - - "~>"
47
+ - - ~>
48
48
  - !ruby/object:Gem::Version
49
- version: 10.0.4
49
+ version: '2.99'
50
50
  type: :development
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
- - - "~>"
54
+ - - ~>
55
55
  - !ruby/object:Gem::Version
56
- version: 10.0.4
56
+ version: '2.99'
57
57
  description: Native implementation to create deep clones of Ruby objects
58
58
  email:
59
59
  - balmma@sysinf.ch
@@ -64,33 +64,31 @@ extensions:
64
64
  - ext/deep_clone/extconf.rb
65
65
  extra_rdoc_files: []
66
66
  files:
67
- - deep_clone.gemspec
68
67
  - ext/deep_clone/deep_clone.c
69
- - ext/deep_clone/deep_clone.h
70
68
  - ext/deep_clone/extconf.rb
71
69
  - lib/deep_clone.rb
72
70
  homepage: https://github.com/balmma/ruby-deepclone
73
- licenses: []
71
+ licenses:
72
+ - MIT
74
73
  metadata: {}
75
74
  post_install_message:
76
75
  rdoc_options: []
77
76
  require_paths:
78
- - ext
79
77
  - lib
80
78
  required_ruby_version: !ruby/object:Gem::Requirement
81
79
  requirements:
82
- - - ">="
80
+ - - ! '>='
83
81
  - !ruby/object:Gem::Version
84
82
  version: '0'
85
83
  required_rubygems_version: !ruby/object:Gem::Requirement
86
84
  requirements:
87
- - - ">="
85
+ - - ! '>='
88
86
  - !ruby/object:Gem::Version
89
87
  version: '0'
90
88
  requirements: []
91
89
  rubyforge_project:
92
- rubygems_version: 2.2.1
90
+ rubygems_version: 2.4.7
93
91
  signing_key:
94
- specification_version: 2
92
+ specification_version: 4
95
93
  summary: Ruby native deep clone
96
94
  test_files: []
data/deep_clone.gemspec DELETED
@@ -1,27 +0,0 @@
1
- Gem::Specification.new do |s|
2
- s.specification_version = 2 if s.respond_to? :specification_version=
3
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
4
- s.rubygems_version = '1.3.5'
5
-
6
- s.name = 'ruby_deep_clone'
7
- s.version = '0.6.0'
8
- s.date = '2014-01-21'
9
-
10
- s.summary = "Ruby native deep clone"
11
- s.description = "Native implementation to create deep clones of Ruby objects"
12
-
13
- s.authors = ["Matthias Balmer", "Andre Medeiros", "Anthony Williams"]
14
- s.email = ['balmma@sysinf.ch', 'me@andremedeiros.info', 'hi@antw.io']
15
-
16
- s.homepage = "https://github.com/balmma/ruby-deepclone"
17
-
18
- s.extensions = ["ext/deep_clone/extconf.rb"]
19
-
20
- s.require_paths = ["ext", "lib"]
21
-
22
- s.files = ["deep_clone.gemspec","lib/deep_clone.rb","ext/deep_clone/deep_clone.c","ext/deep_clone/deep_clone.h","ext/deep_clone/extconf.rb"]
23
-
24
- s.add_development_dependency 'rspec', '~> 2.13.0'
25
- s.add_development_dependency 'rake-compiler', '~> 0.8.3'
26
- s.add_development_dependency 'rake', '~> 10.0.4'
27
- end
@@ -1,67 +0,0 @@
1
- #ifndef DEEP_CLONE_H
2
- #define DEEP_CLONE_H
3
-
4
- #include "ruby.h"
5
- #include "ruby/st.h"
6
- #include "ruby/version.h"
7
-
8
- struct dump_call_arg {
9
- VALUE obj;
10
- VALUE tracker;
11
- VALUE src;
12
- };
13
-
14
- // #define DC_DEBUG 0
15
-
16
- #define OBJ_UNFREEZE(x) FL_UNSET((x), FL_FREEZE)
17
-
18
- #ifdef SA_EMPTY
19
-
20
- // Gotta do this because of 1.9.3's falcon patch
21
- struct rb_classext_struct {
22
- sa_table m_tbl;
23
- sa_table iv_tbl;
24
- sa_table const_tbl;
25
- sa_table iv_index_tbl;
26
- };
27
-
28
- #define TABLE_FOREACH sa_foreach
29
- #define DC_RCLASS_EXT(c) (RCLASS(c)->ptr)
30
- #define DC_RCLASS_IV_INDEX_TBL(c) (&DC_RCLASS_EXT(c)->iv_index_tbl)
31
-
32
- #else
33
- // Make it work with vanilla ruby (including 2.0)
34
- #define TABLE_FOREACH st_foreach
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
51
- #endif
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
-
58
- VALUE DeepClone = Qnil;
59
-
60
- void Init_deep_clone();
61
- static int clone_variable(st_data_t key, st_data_t index, struct dump_call_arg *arg);
62
- static int hash_each(VALUE key, VALUE value, struct dump_call_arg *arg);
63
- static VALUE clone_object(VALUE object, VALUE tracker);
64
-
65
- VALUE deep_clone(int argc,VALUE argv);
66
-
67
- #endif