knu-perlstorable 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
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