return reg
end
+ if args.first.stype.is_nullable then add_null_reciever_check(args.first)
var rtype = prop.signature.return_type
if rtype != null then
return expr(icall, rtype)
redef fun generate_icode(v)
do
var e = v.generate_expr(n_expr)
+ if n_expr.stype.is_nullable then v.add_null_reciever_check(e)
return v.add_attr_read(prop, e)
end
end
redef fun generate_icode(v)
do
var e = v.generate_expr(n_expr)
+ if n_expr.stype.is_nullable then v.add_null_reciever_check(e)
var e2 = v.generate_expr(n_value)
v.stmt(new IAttrWrite(prop, e, e2))
return null
redef fun generate_icode(v)
do
var e1 = v.generate_expr(n_expr)
+ if n_expr.stype.is_nullable then v.add_null_reciever_check(e1)
var e2 = v.expr(new IAttrRead(prop, e1), attr_type)
var e3 = v.generate_expr(n_value)
var e4 = v.expr(new ICall(assign_method, [e2, e3]), attr_type)
redef fun generate_icode(v)
do
var e = v.generate_expr(n_expr)
+ if n_expr.stype.is_nullable then v.add_null_reciever_check(e)
return v.expr(new IAttrIsset(prop, e), stype)
end
end
redef fun generate_icode(v)
do
var recv = v.generate_expr(n_expr)
+ if n_expr.stype.is_nullable then v.add_null_reciever_check(recv)
var args = new Array[IRegister]
args.add(recv)
generate_icode_for_arguments_in(v, args)
--- /dev/null
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2009 Jean Privat <jean@pryen.org>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import kernel
+
+class A
+ readable writable var _foo: Int = 1
+end
+
+var a: nullable A = null
+(a == null).output
+(a != null).output
+#alt1#a.foo.output
+#alt2#a.foo = 1
+#alt3#a.foo += 1
+#alt4#a._foo.output
+#alt5#a._foo = 10
+#alt6#a._foo += 10
+++ /dev/null
-I
-true
-true
-true
-true
-0
-B
-true
-true
-true
-true
-C
-true
-true
-true
-true
--- /dev/null
+I
+true
+true
+true
+true
+Reciever is null in base_primitive_null_alt1::A::init (alt/base_primitive_null_alt1.nit:34)
+,---- Stack trace -- - - -
+| base_primitive_null_alt1::A::init (alt/base_primitive_null_alt1.nit:24)
+| new A base_primitive_null_alt1::A::init (alt/base_primitive_null_alt1.nit:24)
+| base_primitive_null_alt1::Sys::(kernel::Sys::main) (alt/base_primitive_null_alt1.nit:56)
+`------------------- - - -
+++ /dev/null
-I
-true
-true
-true
-true
-B
-true
-true
-true
-true
-false
-C
-true
-true
-true
-true
--- /dev/null
+I
+true
+true
+true
+true
+B
+true
+true
+true
+true
+Reciever is null in base_primitive_null_alt2::A::init (alt/base_primitive_null_alt2.nit:43)
+,---- Stack trace -- - - -
+| base_primitive_null_alt2::A::init (alt/base_primitive_null_alt2.nit:24)
+| new A base_primitive_null_alt2::A::init (alt/base_primitive_null_alt2.nit:24)
+| base_primitive_null_alt2::Sys::(kernel::Sys::main) (alt/base_primitive_null_alt2.nit:56)
+`------------------- - - -
+++ /dev/null
-I
-true
-true
-true
-true
-B
-true
-true
-true
-true
-C
-true
-true
-true
-true
-0
--- /dev/null
+I
+true
+true
+true
+true
+B
+true
+true
+true
+true
+C
+true
+true
+true
+true
+Reciever is null in base_primitive_null_alt3::A::init (alt/base_primitive_null_alt3.nit:52)
+,---- Stack trace -- - - -
+| base_primitive_null_alt3::A::init (alt/base_primitive_null_alt3.nit:24)
+| new A base_primitive_null_alt3::A::init (alt/base_primitive_null_alt3.nit:24)
+| base_primitive_null_alt3::Sys::(kernel::Sys::main) (alt/base_primitive_null_alt3.nit:56)
+`------------------- - - -
--- /dev/null
+true
+false
--- /dev/null
+true
+false
+Reciever is null in rterror_null_receiver_alt1::Sys::(kernel::Sys::main) (alt/rterror_null_receiver_alt1.nit:26)
+,---- Stack trace -- - - -
+| rterror_null_receiver_alt1::Sys::(kernel::Sys::main) (alt/rterror_null_receiver_alt1.nit:23)
+`------------------- - - -
--- /dev/null
+true
+false
+Reciever is null in rterror_null_receiver_alt2::Sys::(kernel::Sys::main) (alt/rterror_null_receiver_alt2.nit:27)
+,---- Stack trace -- - - -
+| rterror_null_receiver_alt2::Sys::(kernel::Sys::main) (alt/rterror_null_receiver_alt2.nit:23)
+`------------------- - - -
--- /dev/null
+true
+false
+Reciever is null in rterror_null_receiver_alt3::Sys::(kernel::Sys::main) (alt/rterror_null_receiver_alt3.nit:28)
+,---- Stack trace -- - - -
+| rterror_null_receiver_alt3::Sys::(kernel::Sys::main) (alt/rterror_null_receiver_alt3.nit:23)
+`------------------- - - -
--- /dev/null
+true
+false
+Reciever is null in rterror_null_receiver_alt4::Sys::(kernel::Sys::main) (alt/rterror_null_receiver_alt4.nit:29)
+,---- Stack trace -- - - -
+| rterror_null_receiver_alt4::Sys::(kernel::Sys::main) (alt/rterror_null_receiver_alt4.nit:23)
+`------------------- - - -
--- /dev/null
+true
+false
+Reciever is null in rterror_null_receiver_alt5::Sys::(kernel::Sys::main) (alt/rterror_null_receiver_alt5.nit:30)
+,---- Stack trace -- - - -
+| rterror_null_receiver_alt5::Sys::(kernel::Sys::main) (alt/rterror_null_receiver_alt5.nit:23)
+`------------------- - - -
--- /dev/null
+true
+false
+Reciever is null in rterror_null_receiver_alt6::Sys::(kernel::Sys::main) (alt/rterror_null_receiver_alt6.nit:31)
+,---- Stack trace -- - - -
+| rterror_null_receiver_alt6::Sys::(kernel::Sys::main) (alt/rterror_null_receiver_alt6.nit:23)
+`------------------- - - -