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.
- 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
|
|