remodel assignment a bit
This commit is contained in:
parent
395fd2d701
commit
1e7093c63f
@ -1,3 +1,10 @@
|
|||||||
|
class String
|
||||||
|
def camelize
|
||||||
|
self.split("_").collect( &:capitalize ).join
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
require "register/padding"
|
require "register/padding"
|
||||||
require "register/positioned"
|
require "register/positioned"
|
||||||
require "typed/compiler"
|
require "typed/compiler"
|
||||||
@ -11,6 +18,7 @@ class Fixnum
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
require "register/instruction"
|
require "register/instruction"
|
||||||
require "register/register_value"
|
require "register/register_value"
|
||||||
require "register/assembler"
|
require "register/assembler"
|
||||||
|
@ -1,13 +1,14 @@
|
|||||||
module Typed
|
module Typed
|
||||||
class Assignment < Statement
|
module Tree
|
||||||
attr_accessor :name , :value
|
class Assignment < Statement
|
||||||
def initialize(n = nil , v = nil )
|
attr_accessor :name , :value
|
||||||
@name , @value = n , v
|
def initialize(n = nil , v = nil )
|
||||||
|
@name , @value = n , v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class FieldDef < Statement
|
||||||
|
attr_accessor :name , :type , :value
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class FieldDef < Statement
|
|
||||||
attr_accessor :name , :type , :value
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
["call_site", "name_expression"].each do |mod|
|
|
||||||
require_relative "compiler/" + mod
|
|
||||||
end
|
|
||||||
|
|
||||||
module Typed
|
module Typed
|
||||||
|
|
||||||
|
CompilerModules = ["assignment" , "call_site", "name_expression"]
|
||||||
|
CompilerModules.each do |mod|
|
||||||
|
require_relative "compiler/" + mod
|
||||||
|
end
|
||||||
|
|
||||||
# Compiling is the conversion of the AST into 2 things:
|
# Compiling is the conversion of the AST into 2 things:
|
||||||
# - code (ie sequences of Instructions inside Methods)
|
# - code (ie sequences of Instructions inside Methods)
|
||||||
# - an object graph containing all the Methods, their classes and Constants
|
# - an object graph containing all the Methods, their classes and Constants
|
||||||
@ -41,8 +43,9 @@ module Typed
|
|||||||
end
|
end
|
||||||
|
|
||||||
class Compiler
|
class Compiler
|
||||||
include NameExpression
|
CompilerModules.each do |mod|
|
||||||
include CallSite
|
include Typed.const_get( mod.camelize )
|
||||||
|
end
|
||||||
|
|
||||||
def initialize( method = nil )
|
def initialize( method = nil )
|
||||||
@regs = []
|
@regs = []
|
||||||
@ -184,7 +187,6 @@ end
|
|||||||
|
|
||||||
require_relative "ast_helper"
|
require_relative "ast_helper"
|
||||||
require_relative "ast/code"
|
require_relative "ast/code"
|
||||||
require_relative "compiler/assignment"
|
|
||||||
require_relative "compiler/basic_values"
|
require_relative "compiler/basic_values"
|
||||||
require_relative "compiler/class_field"
|
require_relative "compiler/class_field"
|
||||||
require_relative "compiler/class_statement"
|
require_relative "compiler/class_statement"
|
||||||
|
@ -1,33 +1,31 @@
|
|||||||
module Typed
|
module Typed
|
||||||
Compiler.class_eval do
|
module Assignment
|
||||||
|
|
||||||
def on_Assignment statement
|
def on_Assignment( statement )
|
||||||
|
# name , value = *statement
|
||||||
reset_regs # statements reset registers, ie have all at their disposal
|
reset_regs # statements reset registers, ie have all at their disposal
|
||||||
#puts statement.inspect
|
|
||||||
# name , value = *statement
|
|
||||||
name_s = no_space statement.name
|
name_s = no_space statement.name
|
||||||
v = process(statement.value)
|
v = process(statement.value)
|
||||||
raise "Not register #{v}" unless v.is_a?(Register::RegisterValue)
|
raise "Not register #{v}" unless v.is_a?(Register::RegisterValue)
|
||||||
code = nil
|
code = get_code( statement , name_s )
|
||||||
if( index = @method.has_arg(name_s.name))
|
raise "must define variable #{name} before using it in #{@method.inspect}" unless code
|
||||||
# TODO, check type @method.arguments[index].type
|
add_code code
|
||||||
code = Register.set_slot(statement , v , :message , Parfait::Message.get_indexed(index) )
|
|
||||||
else # or a local so it is in the frame
|
|
||||||
index = @method.has_local( name_s.name )
|
|
||||||
if(index)
|
|
||||||
# TODO, check type @method.locals[index].type
|
|
||||||
frame = use_reg(:Frame)
|
|
||||||
add_code Register.get_slot(statement , :message , :frame , frame )
|
|
||||||
code = Register.set_slot(statement , v , frame , Parfait::Frame.get_indexed(index) )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if( code )
|
|
||||||
#puts "addin code #{code}"
|
|
||||||
add_code code
|
|
||||||
else
|
|
||||||
raise "must define variable #{name} before using it in #{@method.inspect}"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def get_code( statement , name_s )
|
||||||
|
if( index = @method.has_arg(name_s.name))
|
||||||
|
# TODO, check type @method.arguments[index].type
|
||||||
|
return Register.set_slot(statement , v , :message , Parfait::Message.get_indexed(index) )
|
||||||
|
end
|
||||||
|
# or a local so it is in the frame
|
||||||
|
index = @method.has_local( name_s.name )
|
||||||
|
return nil unless index
|
||||||
|
# TODO, check type @method.locals[index].type
|
||||||
|
frame = use_reg(:Frame)
|
||||||
|
add_code Register.get_slot(statement , :message , :frame , frame )
|
||||||
|
return Register.set_slot(statement , v , frame , Parfait::Frame.get_indexed(index) )
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user