get binary code to work

This commit is contained in:
Torsten Ruger 2015-05-28 21:10:27 +03:00
parent 5845bde33a
commit c28430698c
4 changed files with 36 additions and 13 deletions

View File

@ -10,5 +10,17 @@ module Parfait
# obviously not a "Word" but a ByteArray , but no such class yet
# As on the other hand has no encoding (yet) it is close enough
class BinaryCode < Word
def initialize name
super(0)
@name = name
end
# this is a sof check if there are instance variables or "structure"
# have to override false, as word answers true
def is_value?
false
end
def to_s
"BinaryCode #{@name}"
end
end
end

View File

@ -24,7 +24,7 @@ module Parfait
raise "No class #{name}" unless clazz
@for_class = clazz
@name = name
@code = BinaryCode.new_object 0
@code = BinaryCode.new_object name
@arg_names = arg_names
@locals = []
@tmps = []

View File

@ -41,6 +41,21 @@ module Parfait
return obj_len
end
# make every char equal the given one
def fill_with char
fill_from_with(0 , char)
end
def fill_from_with from , char
len = self.length()
return if from <= 0
while( from <= len)
set_char( from , char)
from = from + 1
end
from
end
# true if no characters
def empty?
return self.length == 0
@ -53,11 +68,7 @@ module Parfait
counter = self.length()
return if counter >= len
internal_object_grow( len + 1)
counter = counter + 1
while( counter <= len)
set_char( counter , fill_char)
counter = counter + 1
end
fill_from_with( counter + 1 , fill_char )
end
# set the character at the given index to the given character
@ -120,10 +131,5 @@ module Parfait
def mem_length
padded(1 + string.length)
end
def position
return @position if @position
return @string.position if @string.position
super
end
end
end

View File

@ -21,7 +21,7 @@ module Register
def link
# want to have the methods first in the executable
# so first we determine the code length for the methods and set the
# code array to right length
# binary code (array) to right length
@space.objects.each do |objekt|
next unless objekt.is_a? Parfait::Method
objekt.code.set_length(objekt.info.mem_length / 4 , 0)
@ -35,6 +35,11 @@ module Register
end
# and then everything else
@space.objects.each do | objekt|
# have to tell the code that will be assembled where it is to
# get the jumps/calls right
if objekt.is_a? Parfait::Method
objekt.info.set_position( objekt.code.position )
end
next if objekt.is_a? Parfait::BinaryCode
objekt.set_position at
at += objekt.mem_length
@ -83,7 +88,7 @@ module Register
code.assemble( stream )
end
end
method.code.clear
method.code.fill_with 0
index = 1
stream.each_byte do |b|
method.set_char(index , b )