yabfi 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +5 -3
  3. data/ext/yabfi/vm.c +41 -33
  4. data/lib/yabfi/version.rb +1 -1
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 554b1d443d15e2f2b4668bf8bcc779323f9336d0
4
- data.tar.gz: b5a416154d4f62938536db6129aee81729d90d94
3
+ metadata.gz: f9633d4e62ce949c21115b65a315f836a40620ac
4
+ data.tar.gz: 6a66c94a80e5dfcc1d65590948b637782f96da63
5
5
  SHA512:
6
- metadata.gz: b0f9709ea4c6972d404aa93e9eab485e6aedfbb3386089c47ec89779f9158a8917af323b3c1dc9f62108fb3e3bf33c9f63b4865a1b82be0b120963210dcaae54
7
- data.tar.gz: a318644c09f22cd341ec8950eb452d449fb08f7548cdaa4949af8b55b1501a32b7af4ec77248607070bf53a20eb78b5cf50c6ded99d4a83db4238c3b388ecfb3
6
+ metadata.gz: 15ca15fccdffd34bf6a1c1b560213952b6c58c3fd292b62fa0b6bd7fbfc899774333f194912147733e72b3221f79f56b34a555ea2c54886312d6f5dd403ce7e0
7
+ data.tar.gz: cc3808bc3061ba529f71496127e3247130a26bbe130d1a8fb2a8661b494712c3a2eab73e05c58b4f94c6ee8076ca9fb29eb45cc5d765dcebbc0f8bd3be1e0147
data/Rakefile CHANGED
@@ -23,7 +23,9 @@ desc 'Run the specs'
23
23
  RSpec::Core::RakeTask.new(spec: :compile)
24
24
 
25
25
  desc 'Run the code quality metrics'
26
- RuboCop::RakeTask.new(:quality)
26
+ RuboCop::RakeTask.new(:quality) do |task|
27
+ task.patterns = GEMSPEC.files.grep(/((\.rb)|(Rakefile))\z/)
28
+ end
27
29
 
28
30
  desc 'Generate gem documentation'
29
31
  YARD::Rake::YardocTask.new(:doc)
@@ -41,7 +43,7 @@ task shell: :environment do
41
43
  end
42
44
 
43
45
  desc 'Clean the files generated by other tasks'
44
- task :clean do
46
+ task blank: :clobber do
45
47
  %w(coverage doc pkg tmp).each do |partial|
46
48
  path = File.expand_path(partial, File.dirname(__FILE__))
47
49
  next unless File.exist?(path)
@@ -50,4 +52,4 @@ task :clean do
50
52
  end
51
53
 
52
54
  desc 'Run the specs, quality metrics, and documentation tasks'
53
- task default: [:clean, :spec, :quality, :doc]
55
+ task default: [:blank, :spec, :quality, :doc]
data/ext/yabfi/vm.c CHANGED
@@ -40,12 +40,15 @@ typedef struct {
40
40
  int eof;
41
41
 
42
42
  instruction *instructions;
43
- size_t instructions_length;
43
+ size_t instructions_size;
44
44
  size_t program_counter;
45
45
 
46
46
  int *memory;
47
- size_t memory_length;
47
+ size_t memory_size;
48
48
  size_t memory_cursor;
49
+
50
+ char *buffer;
51
+ size_t buffer_size;
49
52
  } vm;
50
53
 
51
54
  /**
@@ -83,13 +86,17 @@ static void
83
86
  vm_free(void *p) {
84
87
  vm *ptr = p;
85
88
 
86
- if (ptr->instructions_length > 0) {
89
+ if (ptr->instructions_size > 0) {
87
90
  free(ptr->instructions);
88
91
  }
89
92
 
90
- if (ptr->memory_length > 0) {
93
+ if (ptr->memory_size > 0) {
91
94
  free(ptr->memory);
92
95
  }
96
+
97
+ if (ptr->buffer_size > 0) {
98
+ free(ptr->buffer);
99
+ }
93
100
  }
94
101
 
95
102
  /**
@@ -107,13 +114,16 @@ vm_alloc(VALUE klass) {
107
114
  ptr->eof = 0;
108
115
 
109
116
  ptr->instructions = NULL;
110
- ptr->instructions_length = 0;
117
+ ptr->instructions_size = 0;
111
118
  ptr->program_counter = 0;
112
119
 
113
120
  ptr->memory = NULL;
114
- ptr->memory_length = 0;
121
+ ptr->memory_size = 0;
115
122
  ptr->memory_cursor = 0;
116
123
 
124
+ ptr->buffer = NULL;
125
+ ptr->buffer_size = 0;
126
+
117
127
  return instance;
118
128
  }
119
129
 
@@ -166,15 +176,20 @@ vm_load(VALUE self, VALUE ary) {
166
176
 
167
177
  Check_Type(ary, T_ARRAY);
168
178
 
179
+ vm_free(ptr);
180
+
169
181
  ptr->memory_cursor = 0;
170
- ptr->memory_length = INITIAL_MEMORY_SIZE;
182
+ ptr->memory_size = INITIAL_MEMORY_SIZE;
171
183
  ptr->memory = calloc(INITIAL_MEMORY_SIZE, sizeof(int));
172
184
 
173
185
  ptr->program_counter = 0;
174
- ptr->instructions_length = RARRAY_LEN(ary);
175
- ptr->instructions = malloc(sizeof(instruction) * ptr->instructions_length);
186
+ ptr->instructions_size = RARRAY_LEN(ary);
187
+ ptr->instructions = malloc(sizeof(instruction) * ptr->instructions_size);
188
+
189
+ ptr->buffer_size = INITIAL_BUFFER_SIZE;
190
+ ptr->buffer = malloc(INITIAL_BUFFER_SIZE * sizeof(char));
176
191
 
177
- for (iter = 0; iter < (int) ptr->instructions_length; iter++) {
192
+ for (iter = 0; iter < (int) ptr->instructions_size; iter++) {
178
193
  entry = rb_ary_entry(ary, iter);
179
194
  Check_Type(entry, T_ARRAY);
180
195
  if (RARRAY_LEN(entry) != 2) {
@@ -206,18 +221,14 @@ vm_load(VALUE self, VALUE ary) {
206
221
  static VALUE
207
222
  vm_execute(VALUE self) {
208
223
  vm *ptr;
209
- char *buffer;
210
224
  int *tmp_memory;
211
- int buffer_size;
212
225
  int delta;
213
226
  int iter;
214
227
  instruction curr;
215
228
 
216
229
  Data_Get_Struct(self, vm, ptr);
217
- buffer_size = INITIAL_BUFFER_SIZE;
218
- buffer = malloc(buffer_size * sizeof(char));
219
230
 
220
- while (ptr->program_counter < ptr->instructions_length) {
231
+ while (ptr->program_counter < ptr->instructions_size) {
221
232
  curr = ptr->instructions[ptr->program_counter];
222
233
  switch (curr.code) {
223
234
  case INSTRUCTION_CHANGE_VALUE:
@@ -229,16 +240,16 @@ vm_execute(VALUE self) {
229
240
  rb_raise(rb_cMemoryOutOfBounds, "The memory cursor went below zero");
230
241
  }
231
242
  ptr->memory_cursor += curr.argument;
232
- while (ptr->memory_cursor >= ptr->memory_length) {
233
- delta = ptr->memory_length;
243
+ while (ptr->memory_cursor >= ptr->memory_size) {
244
+ delta = ptr->memory_size;
234
245
  if (delta > MAX_REALLOCATION) {
235
246
  delta = MAX_REALLOCATION;
236
247
  }
237
248
  tmp_memory = ptr->memory;
238
- ptr->memory = malloc((ptr->memory_length + delta) * sizeof(int));
239
- memcpy(ptr->memory, tmp_memory, ptr->memory_length * sizeof(int));
240
- memset(ptr->memory + ptr->memory_length, 0, delta * sizeof(int));
241
- ptr->memory_length += delta;
249
+ ptr->memory = malloc((ptr->memory_size + delta) * sizeof(int));
250
+ memcpy(ptr->memory, tmp_memory, ptr->memory_size * sizeof(int));
251
+ memset(ptr->memory + ptr->memory_size, 0, delta * sizeof(int));
252
+ ptr->memory_size += delta;
242
253
  free(tmp_memory);
243
254
  }
244
255
  ptr->program_counter++;
@@ -269,25 +280,22 @@ vm_execute(VALUE self) {
269
280
  ptr->program_counter++;
270
281
  break;
271
282
  case INSTRUCTION_PUT:
272
- if (buffer_size < curr.argument) {
273
- free(buffer);
274
- buffer_size = curr.argument;
275
- buffer = malloc(buffer_size * sizeof(char));
283
+ if (ptr->buffer_size < curr.argument) {
284
+ free(ptr->buffer);
285
+ ptr->buffer_size = curr.argument;
286
+ ptr->buffer = malloc(ptr->buffer_size * sizeof(char));
276
287
  }
277
- memset(buffer, ptr->memory[ptr->memory_cursor],
288
+ memset(ptr->buffer, ptr->memory[ptr->memory_cursor],
278
289
  curr.argument * sizeof(char));
279
290
  rb_funcall(ptr->output, rb_intern("write"), 1,
280
- rb_str_new(buffer, curr.argument));
291
+ rb_str_new(ptr->buffer, curr.argument));
281
292
  ptr->program_counter++;
282
293
  break;
283
294
  default:
284
- free(buffer);
285
295
  rb_raise(rb_cInvalidCommand, "Invalid command code: %i", curr.code);
286
296
  }
287
297
  }
288
298
 
289
- free(buffer);
290
-
291
299
  return Qnil;
292
300
  }
293
301
 
@@ -304,11 +312,11 @@ vm_state(VALUE self) {
304
312
 
305
313
  rb_hash_aset(hash, ID2SYM(rb_intern("memory_cursor")),
306
314
  INT2FIX(ptr->memory_cursor));
307
- rb_hash_aset(hash, ID2SYM(rb_intern("memory_length")),
308
- INT2FIX(ptr->memory_length));
315
+ rb_hash_aset(hash, ID2SYM(rb_intern("memory_size")),
316
+ INT2FIX(ptr->memory_size));
309
317
  rb_hash_aset(hash, ID2SYM(rb_intern("program_counter")),
310
318
  INT2FIX(ptr->program_counter));
311
- if (ptr->memory_cursor < ptr->memory_length) {
319
+ if (ptr->memory_cursor < ptr->memory_size) {
312
320
  rb_hash_aset(hash, ID2SYM(rb_intern("current_value")),
313
321
  INT2FIX(ptr->memory[ptr->memory_cursor]));
314
322
  } else {
data/lib/yabfi/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # YABFI is the top level module for the gem.
2
2
  module YABFI
3
3
  # Gem (semantic) version.
4
- VERSION = '0.1.1'
4
+ VERSION = '0.1.2'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yabfi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Hulihan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-30 00:00:00.000000000 Z
11
+ date: 2015-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler