diff --git a/dat/og/bt_rules60.txt b/dat/og/bt_rules60.txt index f7a3fde8c..64d8db7c5 100644 --- a/dat/og/bt_rules60.txt +++ b/dat/og/bt_rules60.txt @@ -11,6 +11,7 @@ local_address, saving_stack, local_address, conversion_op, local_address, copyin create_struct =4, assigning, local_address, saving_stack =0, local, copying_to_acc => 6; intcondop, assigning, local, branchop => 7; realcondop, assigning, local, branchop => 7; +nilcondop, assigning, local, branchop => 7; int_real_op, local_address, copying => 10; real_int_op, local_address, copying => 10; direct_call_op, inplacemark, copying => 12; diff --git a/doc/todo.txt b/doc/todo.txt index d6167af8f..494e144bb 100644 --- a/doc/todo.txt +++ b/doc/todo.txt @@ -19,7 +19,6 @@ In development: - pi under 6 sec - #601 : optimize: if (a == b) {} else {} -------------------------------------- - - #601 : optimize: if (nil == name) {} else {} === Iteration 23 === -------------------------------------- diff --git a/elenasrc3/engine/bcwriter.cpp b/elenasrc3/engine/bcwriter.cpp index e3f369667..2032d0a26 100644 --- a/elenasrc3/engine/bcwriter.cpp +++ b/elenasrc3/engine/bcwriter.cpp @@ -585,7 +585,6 @@ void intLongOp(CommandTape& tape, BuildNode& node, TapeScope&) default: throw InternalError(errFatalError); } - } void realIntOp(CommandTape& tape, BuildNode& node, TapeScope&) @@ -2449,6 +2448,9 @@ inline bool nativeBranchingOp(BuildNode lastNode) case BuildKey::RealCondOp: branchNode.setKey(BuildKey::RealBranchOp); break; + case BuildKey::NilCondOp: + branchNode.setKey(BuildKey::NilRefBranchOp); + break; default: break; } @@ -2881,6 +2883,11 @@ void ByteCodeWriter :: saveNativeBranching(CommandTape& tape, BuildNode node, Ta tape.write(ByteCode::CmpN, valueNode.arg.value); break; } + case BuildKey::NilRefBranchOp: + // NOTE : sp[0] - loperand + tape.write(ByteCode::PeekSI, 0); + tape.write(ByteCode::CmpR); + break; default: assert(false); break; @@ -3414,6 +3421,7 @@ void ByteCodeWriter :: saveTape(CommandTape& tape, BuildNode node, TapeScope& ta case BuildKey::IntBranchOp: case BuildKey::IntConstBranchOp: case BuildKey::RealBranchOp: + case BuildKey::NilRefBranchOp: saveNativeBranching(tape, current, tapeScope, paths, tapeOptMode, loopMode); weakLoop = false; break; diff --git a/elenasrc3/engine/buildtree.h b/elenasrc3/engine/buildtree.h index 6f6a1435d..dd879f408 100644 --- a/elenasrc3/engine/buildtree.h +++ b/elenasrc3/engine/buildtree.h @@ -160,8 +160,9 @@ namespace elena_lang IntLongOp = 0x0082, DistributedTypeList = 0x0083, UnboxAndCallMessage = 0x0084, + NilRefBranchOp = 0x0085, - MaxOperationalKey = 0x0084, + MaxOperationalKey = 0x0085, Import = 0x0090, DictionaryOp = 0x0091, @@ -335,6 +336,7 @@ namespace elena_lang map.add("local", BuildKey::Local); map.add("intcondop", BuildKey::IntCondOp); map.add("realcondop", BuildKey::RealCondOp); + map.add("nilcondop", BuildKey::NilCondOp); map.add("branchop", BuildKey::BranchOp); map.add("intbranchop", BuildKey::IntBranchOp); map.add("conversion_op", BuildKey::ConversionOp); diff --git a/tests60/sandbox/sandbox.l b/tests60/sandbox/sandbox.l index d0e3d3a95..d562358c8 100644 --- a/tests60/sandbox/sandbox.l +++ b/tests60/sandbox/sandbox.l @@ -1,28 +1,11 @@ import extensions; -class Object -{ - dispatch() => nil; -} - -public interface Func -{ - abstract function(); -} - -singleton E -{ - callFromLambda() - { - var f := { callMe(); }; - - f(); - } - - private callMe(){} -} - public program() { - E.callFromLambda() + var name := nil; + + if (nil == name) { + console.writeLine("name is nil") + } + else console.printLine("name=",name) } \ No newline at end of file