Module: ASIR::CodeBlock

Included in:
CodeMore
Defined in:
lib/asir/code_block.rb

Overview

!SLIDE Code Block

Encode/decode Message#block.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.block_cacheObject

Returns a block_cache Hash. Flushed every 1000 accesses.



29
30
31
32
33
34
35
36
37
38
39
# File 'lib/asir/code_block.rb', line 29

def self.block_cache
  cache = Thread.current[:'ASIR::CodeBlock.block_cache'] ||= { }
  count = Thread.current[:'ASIR::CodeBlock.block_cache_count'] ||= 0
  count += 1
  if count >= 1000
    cache.clear
    count = 0
  end
  Thread.current[:'ASIR::CodeBlock.block_cache_count'] = count
  cache
end

.block_to_code(block) ⇒ Object

Uses ruby2ruby, if loaded.



42
43
44
45
46
# File 'lib/asir/code_block.rb', line 42

def self.block_to_code block
  (block_cache[block.object_id] ||=
    [ block.respond_to?(:to_ruby) && block.to_ruby, block ]).
    first
end

.code_to_block(code) ⇒ Object

Calls eval. May be unsafe.



50
51
52
53
54
# File 'lib/asir/code_block.rb', line 50

def self.code_to_block code
  (block_cache[code.dup.freeze] ||=
    [ eval(@block_code), code ]).
    first
end

Instance Method Details

#decode_block!Object



19
20
21
22
23
24
25
# File 'lib/asir/code_block.rb', line 19

def decode_block!
  if ::String === @block_code
    @block ||= CodeBlock.code_to_block(@block_code)
    @block_code = nil
  end
  self
end

#encode_block!Object

Most coders cannot serialize Procs. But we can attempt to serialize a String representing a Proc.



9
10
11
12
13
14
15
16
17
# File 'lib/asir/code_block.rb', line 9

def encode_block!
  obj = nil
  if @block && ! ::String === @block_code
    obj ||= self.dup
    obj.block_code = CodeBlock.block_to_code(obj.block)
    obj.block = nil 
  end
  obj
end