nitg: add more info (for -v)
[nit.git] / src / icode / icode_base.nit
index 6afa03d..496d399 100644 (file)
@@ -18,7 +18,6 @@
 package icode_base
 
 import metamodel
-import mmloader
 
 ## UTILITY CLASSES ##
 
@@ -56,13 +55,13 @@ class IRoutine
        readable writable var _closure_decls: nullable Sequence[IClosureDecl] = null
 
        # The local variables (excluding params and result)
-       readable var _registers: Set[IRegister] = new ArraySet[IRegister]
+       readable var _registers: Set[IRegister] = new HashSet[IRegister]
 
        # The result of the routine
        readable var _result: nullable IRegister
 
        # The local escapes marks of the routine
-       readable var _escape_marks: Set[IEscapeMark] = new ArraySet[IEscapeMark]
+       readable var _escape_marks: Set[IEscapeMark] = new HashSet[IEscapeMark]
 
        # The sequence of icode
        readable var _body: ISeq = new ISeq
@@ -79,7 +78,7 @@ end
 
 # A closure definition in a iroutine body
 class IClosureDef
-special IRoutine
+       super IRoutine
        init(p: Array[IRegister], r: nullable IRegister)
        do
                super(p, r)
@@ -105,13 +104,13 @@ end
 
 # An icode that uses no registers (no args)
 abstract class ICode0
-special ICode
+       super ICode
        redef fun arity do return 0
 end
 
 # An icode that uses a single register (1 arg)
 abstract class ICode1
-special ICode
+       super ICode
        redef fun arity do return 1
 
        # The single argument
@@ -122,7 +121,7 @@ end
 
 # An icode that uses two single registers (2 args)
 abstract class ICode2
-special ICode
+       super ICode
        redef fun arity do return 2
 
        # The first argument
@@ -140,7 +139,7 @@ end
 
 # An icode that uses a variable number of registers (n args) and a variable number of closure definitions
 abstract class ICodeN
-special ICode
+       super ICode
        redef fun arity do return _exprs.length
 
        # All arguments
@@ -163,7 +162,7 @@ end
 
 # A linear sequence of ICode
 class ISeq
-special ICode0
+       super ICode0
        # The sequence of icode
        readable var _icodes: List[ICode] = new List[ICode]
 
@@ -176,14 +175,14 @@ end
 # An infinite loop of ICode
 # Use IEscape to exit
 class ILoop
-special ISeq
+       super ISeq
        init do end
 end
 
 # A Condidianal if-then-else statement
 # expr is the condition
 class IIf
-special ICode1
+       super ICode1
        # The 'then' sequence of icode
        readable var _then_seq: ISeq = new ISeq
        # The 'else' sequence of icode
@@ -193,7 +192,7 @@ end
 
 # Escape to to end of a parent sequence
 class IEscape
-special ICode0
+       super ICode0
        # The seqeuence to escape
        # The control flow continues at the next icode after the associated sequence
        readable var _iescape_mark: IEscapeMark
@@ -202,7 +201,7 @@ end
 
 # An abort statement
 class IAbort
-special ICode0
+       super ICode0
        # The reason the abort occured
        # tests.first is the format
        readable var _texts: Array[String]
@@ -219,10 +218,13 @@ end
 
 # The root of all method invocations
 abstract class IAbsCall
-special ICodeN
+       super ICodeN
        # The called method
        readable var _property: MMMethod
 
+       # if this call is to be made from native code
+       var is_explicit_from_extern : Bool writable = false
+
        init(p: MMMethod, e: Sequence[IRegister])
        do
                super(e)
@@ -233,14 +235,14 @@ end
 # A simple procedure or function call
 # exprs.first is the reciever, other are arguments
 class ICall
-special IAbsCall
+       super IAbsCall
        init(p, e) do super
 end
 
 # A super method call
 # exprs.first is the reciever, other are arguments
 class ISuper
-special IAbsCall
+       super IAbsCall
        init(p, e) do super
 end
 
@@ -252,7 +254,7 @@ end
 # - IStaticCall -> target Initializer
 # - ICheckInstance
 class INew
-special IAbsCall
+       super IAbsCall
        # The type to instantiate
        readable var _stype: MMType
        init(t: MMType, p: MMMethod, a: Sequence[IRegister])
@@ -266,7 +268,7 @@ end
 # No receivers, returns a new object of type 't'
 # Will allocate memory and ensure dynamic type and object identity
 class IAllocateInstance
-special ICode0
+       super ICode0
        # The type to allocate
        readable var _stype: MMType
        init(t: MMType)
@@ -277,13 +279,13 @@ end
 
 # A static call to a specific method
 class IStaticCall
-special IAbsCall
+       super IAbsCall
        init(p: MMMethod, a: Sequence[IRegister]) do super
 end
 
 # A validation of a newly constructed instance
 class ICheckInstance
-special ICode1
+       super ICode1
        # The type to allocate
        readable var _stype: MMType
        init(t: MMType, e: IRegister)
@@ -295,7 +297,7 @@ end
 
 # Initialisation of default attributes of a new instance
 class IInitAttributes
-special ICode1
+       super ICode1
        # The type to initialize
        readable var _stype: MMType
        init(t: MMType, e: IRegister)
@@ -308,7 +310,7 @@ end
 # A closure call
 # exprs are the arguments
 class IClosCall
-special ICodeN
+       super ICodeN
        # The called closure
        readable var _closure_decl: IClosureDecl
 
@@ -326,13 +328,16 @@ end
 # Native are associated to local properties to distinguish them
 # expr are the arguments
 class INative
-special ICodeN
+       super ICodeN
        # The associated local property
        readable var _method: MMMethod
 
        init(m: MMMethod, e: nullable Sequence[IRegister])
        do
-               super(e)
+                # Checks that arguments contains at least one IRegister element
+                assert e.length == m.signature.arity + 1
+               
+                super(e)
                _method = m
        end
 
@@ -341,7 +346,7 @@ end
 
 # A literal Int value
 class IIntValue
-special ICode0
+       super ICode0
        # The value
        readable var _value: String
 
@@ -352,7 +357,7 @@ end
 
 # A literal Bool value
 class IBoolValue
-special ICode0
+       super ICode0
        # The value
        readable var _value: Bool
 
@@ -363,7 +368,7 @@ end
 
 # A literal NativeString value
 class IStringValue
-special ICode0
+       super ICode0
        # The value
        readable var _value: String
 
@@ -374,7 +379,7 @@ end
 
 # A literal Float value
 class IFloatValue
-special ICode0
+       super ICode0
        # The value
        readable var _value: String
 
@@ -385,7 +390,7 @@ end
 
 # A literal Char value
 class ICharValue
-special ICode0
+       super ICode0
        # The value
        readable var _value: String
 
@@ -398,7 +403,7 @@ end
 # expr is the assigned value
 # result is the register assigned
 class IMove
-special ICode1
+       super ICode1
        init(r: IRegister, e: IRegister)
        do
                super(e)
@@ -411,7 +416,7 @@ end
 # An attribute read access
 # expr is the reciever
 class IAttrRead
-special ICode1
+       super ICode1
        # The accessed attribute
        readable var _property: MMAttribute
 
@@ -427,7 +432,7 @@ end
 # An attribute assignment
 # expr1 is the receiver, expr2 is the assigned value
 class IAttrWrite
-special ICode2
+       super ICode2
        # The accessed attribute
        readable var _property: MMAttribute
 
@@ -442,7 +447,7 @@ end
 # An attribute is_set check
 # expr is the reciever
 class IAttrIsset
-special ICode1
+       super ICode1
        # The accessed attribute
        readable var _property: MMAttribute
 
@@ -456,15 +461,16 @@ special ICode1
 end
 
 # A type check
-# expr is the expression checked
+# expr1 is the type reciever (self)
+# expr2 is the expression checked
 class ITypeCheck
-special ICode1
+       super ICode2
        # The static type checkes to
        readable var _stype: MMType
 
-       init(e: IRegister, t: MMType)
+       init(e1, e2: IRegister, t: MMType)
        do
-               super(e)
+               super(e1, e2)
                _stype = t
        end
 
@@ -474,7 +480,7 @@ end
 # The 'is' operator
 # expr1 and expr2 are both operands
 class IIs
-special ICode2
+       super ICode2
        init(e1, e2: IRegister)
        do
                super
@@ -486,7 +492,7 @@ end
 # The unary 'not' operation
 # expr is the operand
 class INot
-special ICode1
+       super ICode1
        init(e: IRegister)
        do
                super
@@ -498,14 +504,14 @@ end
 # Evaluate body once them return the same value again and again
 # if result is not null, then it must also be assigned in the body
 class IOnce
-special ICode0
+       super ICode0
        readable var _body: ISeq = new ISeq
        init do end
 end
 
 # Is a closure given as a parameter?
 class IHasClos
-special ICode0
+       super ICode0
        # The called closure
        readable var _closure_decl: IClosureDecl