knu-perlstorable 0.1.2 → 0.1.3

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 (2) hide show
  1. data/lib/perlstorable.rb +115 -55
  2. metadata +2 -2
@@ -124,12 +124,6 @@ module PerlStorable
124
124
  end
125
125
  end
126
126
 
127
- class PlaceHolder # :nodoc:
128
- end
129
-
130
- PH_REF = PlaceHolder.new
131
- PH_TIED = PlaceHolder.new
132
-
133
127
  class Reader # :nodoc: all
134
128
  def initialize(io)
135
129
  @io = io
@@ -178,28 +172,32 @@ module PerlStorable
178
172
  end
179
173
 
180
174
  def remember_object(object)
181
- if @bless
182
- object = PerlStorable.bless(object, @bless)
183
- end
184
- unless object.nil?
185
- @objects.each_index { |i|
186
- @objects[i] = object if @objects[i].is_a?(PlaceHolder)
187
- }
188
- end
189
175
  @objects << object
190
176
  object
191
177
  end
192
178
 
193
- def remember_tied()
194
- @objects << PH_TIED
179
+ def remember_ahead(&block)
180
+ i = @objects.size
181
+ @objects << nil
182
+ @objects[i] = block.call
195
183
  end
196
184
 
197
- def remember_ref()
198
- @objects << PH_REF
185
+ def remember_as_blessed(package, &block)
186
+ # Blessing an object is simply labeling (does not produce a new
187
+ # reference), so just bless the object remebered last.
188
+ i = @objects.size
189
+ object = block.call
190
+ @objects[i] = PerlStorable.bless(object, package)
199
191
  end
200
192
 
201
- def remember_ref_undo()
202
- @objects.pop while @objects.last.equal?(PH_REF)
193
+ def remember_as_code(&block)
194
+ i = @objects.size
195
+ object = block.call
196
+ @objects[i] = PerlCode.new(object)
197
+ end
198
+
199
+ def remember_tied()
200
+ @objects << nil
203
201
  end
204
202
 
205
203
  def lookup_object(index)
@@ -264,28 +262,36 @@ module PerlStorable
264
262
  # In Perl, both an object and a reference to it must be
265
263
  # remembered but in Ruby, there is no difference between them
266
264
  # because everything is a reference, so remember the object
267
- # twice. remember_ref puts a placeholder for forward reference.
268
- remember_ref
269
- read
265
+ # twice.
266
+ case next_type = read_byte
267
+ when SX_OBJECT
268
+ # The following object is already remembered, so omit
269
+ # remembering.
270
+ read_object(next_type)
271
+ when SX_BLESS, SX_IX_BLESS
272
+ # Blessing an object is simply labeling (does not produce a
273
+ # new reference), so no extra remembering is needed.
274
+ read_object(next_type)
275
+ else
276
+ remember_ahead {
277
+ read_object(next_type)
278
+ }
279
+ end
270
280
  when SX_OBJECT
271
- # The following object is already remembered, so cancel
272
- # remembering.
273
- remember_ref_undo
274
281
  lookup_object(read_int32)
275
282
  when SX_OVERLOAD
276
283
  read
277
284
  when SX_BLESS
278
285
  package = read_blob(read_flexlen)
279
286
  remember_package(package)
280
- # Blessing an object is simply labeling (does not produce a
281
- # new reference), so there is no extra remember_object()
282
- # needed here, but it has to be made sure that the following
283
- # object is blessed and that is exactly what read_blessed()
284
- # does.
285
- object = read_blessed(package)
287
+ remember_as_blessed(package) {
288
+ read
289
+ }
286
290
  when SX_IX_BLESS
287
291
  package = @packages[read_flexlen]
288
- object = read_blessed(package)
292
+ remember_as_blessed(package) {
293
+ read
294
+ }
289
295
  when SX_HOOK
290
296
  flags = read_byte
291
297
 
@@ -316,13 +322,14 @@ module PerlStorable
316
322
  PerlStorable.bless(string, package)
317
323
  end
318
324
  when SX_TIED_SCALAR, SX_TIED_ARRAY, SX_TIED_HASH
319
- # Tying an object produces a new object, so there has to be a
320
- # placeholder just like the SX_REF case. However, it may not
321
- # be affected by remember_ref_undo() because tie always
322
- # produces a new object, hence remember_tied() instead of
323
- # remember_ref().
324
- remember_tied
325
- read
325
+ # Tying an object produces a new object
326
+ remember_ahead {
327
+ PerlTiedValue.new(read)
328
+ }
329
+ when SX_CODE
330
+ remember_as_code {
331
+ read
332
+ }
326
333
  when SX_SV_YES
327
334
  true
328
335
  when SX_SV_NO
@@ -334,15 +341,6 @@ module PerlStorable
334
341
  end
335
342
  end
336
343
 
337
- def read_blessed(package)
338
- # Make sure the following object is blessed before it is
339
- # remembered.
340
- @bless = package
341
- read
342
- ensure
343
- @bless = nil
344
- end
345
-
346
344
  # Reads an object at the posision.
347
345
  def read
348
346
  read_object(read_byte)
@@ -366,7 +364,11 @@ module PerlStorable
366
364
 
367
365
  # :stopdoc:
368
366
  def inspect_blessed
369
- '#<PerlBlessed(%s, %s)>' % [inspect_unblessed, perl_class.inspect]
367
+ if self.is_a?(PerlTiedValue)
368
+ '#<%s:tie(%s, %s)>' % [self.class.name, self.value.inspect, perl_class.inspect]
369
+ else
370
+ '#<%s:bless(%s, %s)>' % [self.class.name, inspect_unblessed, perl_class.inspect]
371
+ end
370
372
  end
371
373
 
372
374
  def self.included(mod)
@@ -376,7 +378,6 @@ module PerlStorable
376
378
  }
377
379
  end
378
380
  # :startdoc:
379
-
380
381
  end
381
382
 
382
383
  # This class represents a Perl scalar value that is immutable in
@@ -407,6 +408,46 @@ module PerlStorable
407
408
  end
408
409
  end
409
410
 
411
+ # This class represents a tied object.
412
+ class PerlTiedValue
413
+ attr_reader :value
414
+
415
+ def initialize(value)
416
+ @value = value
417
+ end
418
+
419
+ def to_i
420
+ @value.to_i
421
+ end
422
+ alias to_int to_i
423
+
424
+ def to_s
425
+ @value.to_s
426
+ end
427
+ alias to_str to_s
428
+
429
+ def to_f
430
+ @value.to_f
431
+ end
432
+
433
+ def inspect
434
+ '#<%s:%s>' % [self.class, @value.inspect]
435
+ end
436
+ end
437
+
438
+ # This class represents a code reference.
439
+ class PerlCode
440
+ attr_reader :source
441
+
442
+ def initialize(source)
443
+ @source = source.freeze
444
+ end
445
+
446
+ def inspect
447
+ '#<%s:%s>' % [self.class, @source.inspect]
448
+ end
449
+ end
450
+
410
451
  # call-seq:
411
452
  # bless(object, perl_class) => self
412
453
  #
@@ -419,11 +460,9 @@ module PerlStorable
419
460
  class << obj
420
461
  include PerlBlessed
421
462
  end
422
- rescue
463
+ rescue TypeError
423
464
  obj = PerlScalar.new(obj)
424
- class << obj
425
- include PerlBlessed
426
- end
465
+ retry
427
466
  end
428
467
  end
429
468
  obj.perl_bless(perl_class)
@@ -436,4 +475,25 @@ module PerlStorable
436
475
  def self.blessed?(obj)
437
476
  obj.is_a?(PerlBlessed)
438
477
  end
478
+
479
+ # call-seq:
480
+ # tied?(object) => boolean
481
+ #
482
+ # Tests if an object is a tied object.
483
+ def self.tied?(obj)
484
+ obj.is_a?(PerlTiedValue)
485
+ end
486
+
487
+ # call-seq:
488
+ # tied(tied_object) => object
489
+ #
490
+ # Returns the object a given object is tied to. Returns nil if it
491
+ # is not a tied object.
492
+ def self.tied(obj)
493
+ if tied?(obj)
494
+ obj.value
495
+ else
496
+ nil
497
+ end
498
+ end
439
499
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knu-perlstorable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Akinori MUSHA
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-05-13 00:00:00 -07:00
12
+ date: 2009-05-15 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15