private import utils
redef class ToolContext
- readable writable attr _global: Bool = false
- readable writable attr _attr_sim: Bool = false
- readable writable attr _compdir: String
- readable writable attr _clibdir: String
- readable writable attr _bindir: String
- readable writable attr _output_file: String
- readable writable attr _boost: Bool = false
- readable writable attr _no_cc: Bool = false
- readable writable attr _ext_prefix: String
+ readable writable var _global: Bool = false
+ readable writable var _compdir: nullable String = null
+ readable writable var _clibdir: nullable String = null
+ readable writable var _bindir: nullable String = null
+ readable writable var _output_file: nullable String = null
+ readable writable var _boost: Bool = false
+ readable writable var _no_cc: Bool = false
+ readable writable var _ext_prefix: String = ""
end
# Class used to generate files.
# Note also that this class is unefficient and poorly designed thus requires love.
class CompilerVisitor
# Add a line in the current declaration block
- meth add_decl(s: String)
+ fun add_decl(s: String)
do
if _indent_level >= 8 then
_ctx.decls.add("\t\t" + s)
end
# Add a line in the current instr block
- meth add_instr(s: String)
+ fun add_instr(s: String)
do
if _indent_level >= 8 then
_ctx.instrs.add("\t\t" + s)
end
# Return a unique new number for the instance
- meth new_number: Int
+ fun new_number: Int
do
var res = _number_cpt
_number_cpt = res + 1
return res
end
# next number for new_number
- attr _number_cpt: Int = 0
+ var _number_cpt: Int = 0
# Add an indent level.
# New decl and instr will be indented.
- meth indent do _indent_level += 1
+ fun indent do _indent_level += 1
# Remove an indent level.
- meth unindent
+ fun unindent
do
_indent_level -= 1
if _indent_level < 0 then _indent_level = 0
end
# Return a big string containing all decl and instr
- redef meth to_s
+ redef fun to_s
do
var out = new Array[String]
out.append(_ctx.decls)
return out.join("\n")
end
- # The current module processed
- readable writable attr _module: MMSrcModule
+ # The processed module
+ readable var _module: MMSrcModule
# Where instr and decl are stored
- readable writable attr _ctx: CContext = new CContext
+ readable writable var _ctx: CContext = new CContext
# The current indent lever
- readable writable attr _indent_level: Int = 0
+ readable writable var _indent_level: Int = 0
- # The current ToolContext
- readable writable attr _tc: ToolContext
+ # The ToolContext info
+ readable var _tc: ToolContext
# Create a new CompilerVisitor based on a module
- init(module: MMSrcModule) do _module = module
+ init(module: MMSrcModule, tc: ToolContext)
+ do
+ _module = module
+ _tc = tc
+ end
end
# Where instr and decl are stored for a module
# Note that this class is as badly designed as CompilerVisitor
class CContext
- readable attr _decls: Array[String] = new Array[String]
- readable attr _instrs: Array[String] = new Array[String]
+ readable var _decls: Array[String] = new Array[String]
+ readable var _instrs: Array[String] = new Array[String]
- meth append(c: CContext)
+ fun append(c: CContext)
do
_instrs.append(c.decls)
_instrs.append(c.instrs)
end
+
+ fun merge(c: CContext)
+ do
+ _decls.append(c.decls)
+ _instrs.append(c.instrs)
+ end
init do end
end
redef class MMGlobalProperty
# C symbol refering a method inocation
- meth meth_call: String
+ fun meth_call: String
do
return "CALL_{intro.cname}"
end
# C symbol refering an attribure access
- meth attr_access: String
+ fun attr_access: String
do
return "ATTR_{intro.cname}"
end
-
- # C symbol refering the color of the global property
- meth color_id: String
- do
- return "COLOR_{intro.cname}"
- end
-
end
redef class MMGlobalClass
# C symbol refering the identifier of the class
- meth id_id: String
+ fun id_id: String
do
return "ID_{intro.name}"
end
# C symbol refering the color of the class (for subtype tests)
- meth color_id: String
+ fun color_id: String
do
return "COLOR_{intro.name}"
end
# C symbol refering the init table position of the class (for constructor linearization)
- meth init_table_pos_id: String
+ fun init_table_pos_id: String
do
return "INIT_TABLE_POS_{intro.name}"
end
redef class MMLocalClass
# Cached primitive_info result
- attr _primitive_info_cache: PrimitiveInfo
+ var _primitive_info_cache: nullable PrimitiveInfo = null
# If primitive_info result cached?
- attr _primitive_info_b: Bool = false
+ var _primitive_info_b: Bool = false
# Return the primitive information of the class.
# Return null if the class is not primitive
# FIXME: Only here since there is no universal type yet
- meth primitive_info: PrimitiveInfo
+ fun primitive_info: nullable PrimitiveInfo
do
if _primitive_info_b == true then return _primitive_info_cache
end
# Static information of primitive types
- private meth primitive_ctypes: HashMap[Symbol, PrimitiveInfo]
+ private fun primitive_ctypes: HashMap[Symbol, PrimitiveInfo]
do
var res = new HashMap[Symbol, PrimitiveInfo]
var pnames = ["Int", "Char", "Bool", "Float", "NativeString", "NativeArray", "Pointer"]
var cnames = ["bigint", "char", "int", "float", "char *", "val_t *", "void *"]
for i in [0..pnames.length[ do
var n = pnames[i].to_symbol
- var pi = new PrimitiveInfo
- pi.name = n
- pi.tagged = tagged[i]
- pi.cname = cnames[i]
+ var pi = new PrimitiveInfo(n, tagged[i], cnames[i])
res[n] = pi
end
return res
# Information about a primitive class
class PrimitiveInfo
# The name of the class
- readable writable attr _name: Symbol
+ readable var _name: Symbol
# Is the class tagged (aka not boxed)
- readable writable attr _tagged: Bool
+ readable var _tagged: Bool
# The corresponding c type for the primitive value
- readable writable attr _cname: String
+ readable var _cname: String
- private init do end
+ private init(n: Symbol, t: Bool, c: String)
+ do
+ _name = n
+ _tagged = t
+ _cname = c
+ end
end
redef class MMType
# The corresponding c type
- meth cname: String
+ fun cname: String
do
var pi = local_class.primitive_info
if pi == null then
# The default c value for uninitialized types.
# Return "null" for non primitive types and something more specific for primitive types
- meth default_cvalue: String
+ fun default_cvalue: String
do
var pi = local_class.primitive_info
if pi != null and pi.tagged then
# Box (or tag) a primitive value
# Is identity if not primitive
- meth boxtype(s: String): String
+ fun boxtype(s: String): String
do
var pi = local_class.primitive_info
if pi == null then
# Unbox (or untag) a primitive value
# Is identity if not primitive
- meth unboxtype(s: String): String
+ fun unboxtype(s: String): String
do
var pi = local_class.primitive_info
if pi == null then
redef class MMLocalProperty
# Cacher result of cname
- attr _cname_cache: String
+ var _cname_cache: nullable String
# The mangled name of the method
- meth cname: String
+ fun cname: String
do
- if _cname_cache == null then
- _cname_cache = cmangle(module.name, local_class.name, name)
+ var cname = _cname_cache
+ if cname == null then
+ cname = cmangle(module.name, local_class.name, name)
+ _cname_cache = cname
end
- return _cname_cache
+ return cname
end
- # C symbol refering the color of the super call of a super property
- meth color_id_for_super: String
+ # C macro used to get the function for the call of a super property
+ fun super_meth_call: String
do
- return "COLOR_SUPER_{cname}"
+ return "CALL_SUPER_{cname}"
end
end