fun add_null_reciever_check(e: IRegister)
do
var nul = lit_null_reg
- var c = expr(new IIs(e, nul), module.type_bool)
+ var c = expr(new IIs(e, nul), mmmodule.type_bool)
var iif = new IIf(c)
stmt(iif)
var old_seq = seq
# Add a type cast (ITypeCheck + IAbort) in the current icode sequence
fun add_type_cast(e: IRegister, stype: MMType)
do
- var c = expr(new ITypeCheck(e, stype), module.type_bool)
+ var c = expr(new ITypeCheck(e, stype), mmmodule.type_bool)
var iif = new IIf(c)
stmt(iif)
var old_seq = seq
fun add_attr_check(prop: MMAttribute, e: IRegister)
do
if not prop.signature.return_type.is_nullable then
- var cond = expr(new IAttrIsset(prop, e), module.type_bool)
+ var cond = expr(new IAttrIsset(prop, e), mmmodule.type_bool)
var iif = new IIf(cond)
stmt(iif)
var seq_old = seq
# Add a localized IAbort
fun add_abort(s: String...)
do
- stmt(new IAbort(s, module))
+ stmt(new IAbort(s, mmmodule))
end
# Add an assigment to the iroutine return value
if prop.name == ne then
var eqp = prop.signature.recv.local_class.select_method(ee)
var eqcall = add_call(eqp, args, closcns).as(not null)
- return expr(new INot(eqcall), module.type_bool)
+ return expr(new INot(eqcall), mmmodule.type_bool)
end
# TODO: Inline x==y as "x is y or (x != null and (== is not the Object one) and x.==(y))"
icall.closure_defs = closcns
if prop.name == ee then
# Prepare the result
- var reg = new_register(module.type_bool)
+ var reg = new_register(mmmodule.type_bool)
# "x is y"
- var cond = expr(new IIs(args[0], args[1]), module.type_bool)
+ var cond = expr(new IIs(args[0], args[1]), mmmodule.type_bool)
var iif = new IIf(cond)
stmt(iif)
var seq_old = seq
# Do the "x != null" part iff x is nullable
if args[0].stype.is_nullable then
var nul = lit_null_reg
- cond = expr(new IIs(args[0], nul), module.type_bool)
+ cond = expr(new IIs(args[0], nul), mmmodule.type_bool)
iif = new IIf(cond)
stmt(iif)
seq = iif.then_seq
seq = iif.else_seq
end
# "x.==(y)"
- add_assignment(reg, expr(icall, module.type_bool))
+ add_assignment(reg, expr(icall, mmmodule.type_bool))
seq = seq_old
return reg
end
end
end
+ # Add an escape to a given sequence
+ # Create a new IEscapeMark if required
+ fun add_escape(seq: ISeq)
+ do
+ var mark = seq.iescape_mark
+ if mark == null then
+ mark = new IEscapeMark
+ iroutine.escape_marks.add(mark)
+ seq.iescape_mark = mark
+ end
+ stmt(new IEscape(mark))
+ end
+
# Return a literal "null" value
fun lit_null_reg: IRegister
do
- return new_register(module.type_none)
+ return new_register(mmmodule.type_none)
end
# Return a literal "true" value
fun lit_true_reg: IRegister
do
- var e = new INative("TAG_Bool(true)", null)
- e.is_pure = true
- return expr(e, module.type_bool)
+ var e = new IBoolValue(true)
+ return expr(e, mmmodule.type_bool)
end
# Return a literal "false" value
fun lit_false_reg: IRegister
do
- var e = new INative("TAG_Bool(false)", null)
- e.is_pure = true
- return expr(e, module.type_bool)
+ var e = new IBoolValue(false)
+ return expr(e, mmmodule.type_bool)
end
# Get a new register
fun new_register(s: MMType): IRegister
do
- return new IRegister(s)
+ var r = new IRegister(s)
+ iroutine.registers.add(r)
+ return r
end
# The module where classes and types are extracted
- readable var _module: MMModule
+ readable var _mmmodule: MMModule
# The current iroutine build
readable var _iroutine: IRoutine
# The current sequence of icodes
readable writable var _seq: ISeq
- init(module: MMModule, r: IRoutine)
+ init(mod: MMModule, r: IRoutine)
do
- _module = module
+ _mmmodule = mod
_current_location = r.location
_iroutine = r
_seq = r.body
end
# Create an empty IClosureDef that match the signature
- fun generate_empty_iclosuredef: IClosureDef
+ fun generate_empty_iclosuredef(icb: ICodeBuilder): IClosureDef
do
var args = new Array[IRegister]
for i in [0..arity[ do
- args.add(new IRegister(self[i]))
+ args.add(icb.new_register(self[i]))
end
var res: nullable IRegister = null
var rtype = return_type
if rtype != null then
- res = new IRegister(rtype)
+ res = icb.new_register(rtype)
end
var iroutine = new IClosureDef(args, res)
var clos: nullable Array[IClosureDecl] = null