diff --git a/lib/register/instruction.rb b/lib/register/instruction.rb index 857c2854..9e33823f 100644 --- a/lib/register/instruction.rb +++ b/lib/register/instruction.rb @@ -119,6 +119,8 @@ end require_relative "instructions/set_slot" require_relative "instructions/get_slot" +require_relative "instructions/set_byte" +require_relative "instructions/get_byte" require_relative "instructions/load_constant" require_relative "instructions/syscall" require_relative "instructions/function_call" diff --git a/lib/register/parfait/word.rb b/lib/register/parfait/word.rb index 6fe940b0..b1d99015 100644 --- a/lib/register/parfait/word.rb +++ b/lib/register/parfait/word.rb @@ -20,7 +20,7 @@ module Parfait 2 # 2 is the amount of attributes, layout and char_length. the offset after which chars start end def self.get_indexed i - i + get_length_index + i + get_length_index * 4 end # initialize with length. For now we try to keep all non-parfait (including String) out # String will contain spaces for non-zero length @@ -89,7 +89,11 @@ module Parfait def set_char at , char raise "char not fixnum #{char.class}" unless char.kind_of? Fixnum index = range_correct_index(at) - word_index = (index - 1) / 4 + 1 + Word.get_length_index + set_internal_byte( index , char) + end + + def set_internal_byte index , char + word_index = (index - 1) / 4 + 1 rest = ((index - 1) % 4) shifted = char << (rest * 8) was = get_internal_word( word_index ) @@ -112,7 +116,12 @@ module Parfait #the return "character" is an integer def get_char at index = range_correct_index(at) - word_index = (index - 1 ) / 4 + 1 + Word.get_length_index + get_internal_byte(index) + end + + + def get_internal_byte( index ) + word_index = (index - 1 ) / 4 + 1 rest = ((index - 1) % 4) char = get_internal_word(word_index) char = 0 unless char.is_a?(Numeric) @@ -130,7 +139,7 @@ module Parfait index = self.length + at if at < 0 raise "index must be positive , not #{at}" if (index <= 0) raise "index too large #{at} > #{self.length}" if (index > self.length ) - return index + return index + Word.get_length_index * 4 end # compare the word to another @@ -182,7 +191,7 @@ module Parfait end end - # Word from string + # Word from string def self.new_word( string ) string = string.to_s if string.is_a? Symbol word = Parfait::Word.new( string.length ) diff --git a/lib/soml/parfait/word.soml b/lib/soml/parfait/word.soml index f1356737..bec7d586 100644 --- a/lib/soml/parfait/word.soml +++ b/lib/soml/parfait/word.soml @@ -1,16 +1,12 @@ class Word < Object + int correct_index(int index) + return index + 8 + end + int char_at(int index) - int word_index = index - 1 - word_index = word_index >> 2 - word_index = word_index + 3 - int rest = index - 1 - rest = rest.mod4() - int char = get_internal_word(word_index) - int shifted = 8 * rest - shifted = char >> shifted - int ret = shifted & 255 - return ret + index = correct_index(index) + return get_internal_byte(index) end int set_length(int i) @@ -18,37 +14,16 @@ class Word < Object return i end + int set_char_at( int index , int val) + index = correct_index(index) + return set_internal_byte(index , val) + end + Word push_char(int char) int index = self.char_length + 1 self.set_length(index) - int word_index = index - 1 - word_index = word_index >> 2 - word_index = word_index + 3 - - int rest = index - 1 - rest = rest.mod4() - - int shifted = rest * 8 - shifted = char << shifted - - int was = get_internal_word( word_index ) - int mask = rest * 8 - int const = 255 << 8 - const = const + 255 - const = const << 8 - const = const + 255 - const = const << 8 - const = const + 255 - - mask = 255 << mask - mask = const - mask - - int masked = was & mask - int put = masked + shifted - - set_internal_word( word_index , put ) - + set_char_at(index , char) return self end end