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
# Add an escape to a given sequence
+ # Create a new IEscapeMark if required
fun add_escape(seq: ISeq)
do
- stmt(new IEscape(seq))
+ 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
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