|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
# ==============================================================================
#
# RubyFORTH -- Copyright (C) 2007-8, Marc Simpson (GPL).
#
# Inspection and introspection methods.
#
# ==============================================================================
require 'kernel.rb'
# --[ Inspection ]--------------------------------------------------------------
$do_headers = /^do[CV].*/ # do{CREATE, COLON, CONSTANT, VARIABLE}
def ds_print
i = 0
0.upto($here-1) do |i|
c = $data_space[i]
if c
if c.class == String
if c.match($do_headers)
print "\n"
printf("%3i) ", i)
end
end
print "#{c}, "
end
i += 1
end
print "\n\n"
end
def lookup_name(xt)
if $context == "compiler"
header = compiler_header(xt)
end
header = forth_header(xt) if header == nil
header = 0 if header == nil
header
end
def lookup_local_name(xt)
header = nil
header = compiler_words.index(xt) if $context == "compiler"
header = forth_words.index(xt) if ! header
header = 0 if ! header
header
end
def inspect_ip
contents = fetch($ip)
header = lookup_name(contents)
if contents == "lit"
$ip += 1
contents = fetch($ip)
if contents.class == String
print "'#{contents}'"
else
print "#{fetch($ip)}"
end
elsif header == "branch" or header == "?branch"
print "#{header} #{fetch($ip + 1)}"
$ip += 1
elsif contents == "dodoes"
print "does>"
$ip += 2
elsif contents.class == String
print contents
else
print(header) if header
end
end
def see_docol
# From $ip
while fetch($ip) != "exit"
inspect_ip
print " "
$ip += 1
end
puts "exit"
end
def see_docreate
print "Primitive ==> 'doCREATE'"
if ($ip + 2) != 0
print "/does> "
$ip = fetch($ip + 2)
see_docol
end
end
def _see(xt)
header = fetch(xt)
if header == "doCOL"
$ip = xt
return see_docol
end
if header == "doCREATE"
$ip = xt
return see_docreate
end
puts "Primitive ==> '#{header}'"
return nil
end
def see
xt = xt(parse_word)
if xt == 0
puts "Error: word not found."
return nil
end
_see(xt)
end