diff --git a/lib/register/positioned.rb b/lib/register/positioned.rb index 732d1227..a93e03b7 100644 --- a/lib/register/positioned.rb +++ b/lib/register/positioned.rb @@ -1,19 +1,30 @@ # Helper module that extract position attribute. module Positioned + @@positions = {} + + def self.positions + @@positions + end + def position - if @position.nil? - str = "IN machine #{Register.machine.objects.has_key?(self.object_id)}, at #{self.object_id.to_s(16)}\n" - raise str + "position not set for #{self.class} byte_length #{byte_length} for #{self.inspect[0...100]}" + pos = Positioned.positions[self] + if pos == nil + str = "position accessed but not set, " + str += "#{Register.machine.objects.has_key?(self.object_id)}, at #{self.object_id.to_s(16)}\n" + raise str + "for #{self.class} byte_length #{byte_length} for #{self.inspect[0...100]}" end - @position + pos end def position= pos - raise "Setting of nil not allowed" if pos.nil? + raise "Position must be number not :#{pos}:" unless pos.is_a?(Numeric) # resetting of position used to be error, but since relink and dynamic instruction size it is ok. # in measures (of 32) - if @position != nil and ((@position - pos).abs > 10000) - raise "position set again #{pos}!=#{@position} for #{self}" + old = Positioned.positions[self] + if old != nil and ((old - pos).abs > 10000) + raise "position set again #{pos}!=#{old} for #{self}" end - @position = pos + Positioned.positions[self] = pos end + + end diff --git a/lib/typed/parfait/symbol_adapter.rb b/lib/typed/parfait/symbol_adapter.rb index c667f7e6..36dcb9af 100644 --- a/lib/typed/parfait/symbol_adapter.rb +++ b/lib/typed/parfait/symbol_adapter.rb @@ -14,30 +14,5 @@ class Symbol def padded_length padded to_s.length + 4 end - # not the prettiest addition to the game, but it wasn't me who decided symbols are frozen in 2.x - def cache_positions - unless defined?(@@symbol_positions) - @@symbol_positions = {} - end - @@symbol_positions - end - def position - pos = cache_positions[self] - if pos == nil - str = "position accessed but not set, " - str += "Machine has object=#{Register.machine.objects.has_key?(self.object_id)} " - raise str + " for Symbol:#{self}" - end - pos - end - def position= pos - # resetting of position used to be error, but since relink and dynamic instruction size it is ok. - # in measures (of 32) - old = cache_positions[self] - if old != nil and ((old - pos).abs > 20000) - raise "position set again #{pos}!=#{old} for #{self}" - end - cache_positions[self] = pos - end end diff --git a/lib/typed/parfait/type.rb b/lib/typed/parfait/type.rb index d9e6d80a..bffa808c 100644 --- a/lib/typed/parfait/type.rb +++ b/lib/typed/parfait/type.rb @@ -51,15 +51,19 @@ module Parfait def self.hash_code_for_hash( dict ) index = 1 - hash_code = "" + hash_code = 1 dict.each do |name , type| - item_hash = name.to_s + type.to_s - hash_code += item_hash #+ (item_hash / 256 ) * index + item_hash = str_hash(name) + str_hash(type) + hash_code += item_hash + (item_hash / 256 ) * index index += 1 end - hash_code.to_sym + hash_code end + def self.str_hash(str) + str = str.hash + end + def initialize( object_class , hash = {}) super() private_add_instance_variable :type ,:Type