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.
- data/lib/perlstorable.rb +115 -55
- metadata +2 -2
data/lib/perlstorable.rb
CHANGED
|
@@ -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
|
|
194
|
-
@objects
|
|
179
|
+
def remember_ahead(&block)
|
|
180
|
+
i = @objects.size
|
|
181
|
+
@objects << nil
|
|
182
|
+
@objects[i] = block.call
|
|
195
183
|
end
|
|
196
184
|
|
|
197
|
-
def
|
|
198
|
-
|
|
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
|
|
202
|
-
|
|
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.
|
|
268
|
-
|
|
269
|
-
|
|
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
|
-
|
|
281
|
-
|
|
282
|
-
|
|
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
|
-
|
|
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
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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-
|
|
12
|
+
date: 2009-05-15 00:00:00 -07:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies: []
|
|
15
15
|
|