57dc6c45bb
this is core of #11 rename compiler_builder to just builder and change all builder uses to use that some test change as code is not returned anymore
68 lines
2.3 KiB
Ruby
68 lines
2.3 KiB
Ruby
module Risc
|
|
module Builtin
|
|
module Word
|
|
module ClassMethods
|
|
include CompileHelper
|
|
|
|
# wrapper for the syscall
|
|
# io/file currently hardcoded to stdout
|
|
# set up registers for syscall, ie
|
|
# - pointer in r1
|
|
# - length in r2
|
|
# - emit_syscall (which does the return of an integer, see there)
|
|
def putstring( context)
|
|
compiler = compiler_for(:Word , :putstring ,{})
|
|
builder = compiler.builder(compiler.source)
|
|
builder.build do
|
|
word! << message[:receiver]
|
|
integer! << word[Parfait::Word.get_length_index]
|
|
end
|
|
Risc::Builtin::Object.emit_syscall( builder , :putstring )
|
|
compiler.add_mom( Mom::ReturnSequence.new)
|
|
compiler
|
|
end
|
|
|
|
# self[index] basically. Index is the first arg > 0
|
|
# return a word sized new int, in return_value
|
|
def get_internal_byte( context)
|
|
compiler = compiler_for(:Word , :get_internal_byte , {at: :Integer})
|
|
compiler.builder(compiler.source).build do
|
|
object! << message[:receiver]
|
|
integer! << message[:arguments]
|
|
integer << integer[1]
|
|
integer.reduce_int
|
|
object <= object[integer]
|
|
add_new_int("get_internal_byte", object , integer)
|
|
message[:return_value] << integer
|
|
end
|
|
compiler.add_mom( Mom::ReturnSequence.new)
|
|
return compiler
|
|
end
|
|
|
|
# self[index] = val basically. Index is the first arg ( >0),
|
|
# value the second
|
|
# return value
|
|
def set_internal_byte( context )
|
|
compiler = compiler_for(:Word, :set_internal_byte , {at: :Integer , :value => :Integer} )
|
|
compiler.builder(compiler.source).build do
|
|
word! << message[:receiver]
|
|
integer! << message[:arguments]
|
|
integer << integer[1]
|
|
integer_reg! << message[:arguments]
|
|
integer_obj! << integer_reg[2]
|
|
integer_reg << integer_reg[2]
|
|
integer.reduce_int
|
|
integer_reg.reduce_int
|
|
word[integer] <= integer_reg
|
|
message[:return_value] << integer_obj
|
|
end
|
|
compiler.add_mom( Mom::ReturnSequence.new)
|
|
return compiler
|
|
end
|
|
|
|
end
|
|
extend ClassMethods
|
|
end
|
|
end
|
|
end
|