Skip to content

Commit 45358c5

Browse files
liamappelbecommit-bot@chromium.org
authored andcommitted
[vm] Implementation of NullCheck for bytecode
Bug: #38840 Change-Id: I56af108096355a0486d45f88e795908ce712db4b Fixes: #38840 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/121904 Reviewed-by: Alexander Markov <alexmarkov@google.com> Commit-Queue: Liam Appelbe <liama@google.com>
1 parent 62283b9 commit 45358c5

File tree

8 files changed

+30
-20
lines changed

8 files changed

+30
-20
lines changed

pkg/vm/lib/bytecode/assembler.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -571,8 +571,8 @@ class BytecodeAssembler {
571571
_emitInstructionD(Opcode.kAllocateClosure, rd);
572572
}
573573

574-
void emitCheckReceiverForNull(int rd) {
574+
void emitNullCheck(int rd) {
575575
emitSourcePosition();
576-
_emitInstructionD(Opcode.kCheckReceiverForNull, rd);
576+
_emitInstructionD(Opcode.kNullCheck, rd);
577577
}
578578
}

pkg/vm/lib/bytecode/dbc.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -258,8 +258,8 @@ enum Opcode {
258258

259259
// Null operations.
260260
kEqualsNull,
261-
kCheckReceiverForNull,
262-
kCheckReceiverForNull_Wide,
261+
kNullCheck,
262+
kNullCheck_Wide,
263263

264264
// Int operations.
265265
kNegateInt,
@@ -468,7 +468,7 @@ const Map<Opcode, Format> BytecodeFormats = const {
468468
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
469469
Opcode.kEqualsNull: const Format(
470470
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
471-
Opcode.kCheckReceiverForNull: const Format(
471+
Opcode.kNullCheck: const Format(
472472
Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
473473
Opcode.kNegateInt: const Format(
474474
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),

pkg/vm/lib/bytecode/gen_bytecode.dart

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3251,8 +3251,7 @@ class BytecodeGenerator extends RecursiveVisitor<Null> {
32513251
// correct noSuchMethod for method call.
32523252
if (checkForNull) {
32533253
asm.emitPush(receiverTemp);
3254-
asm.emitCheckReceiverForNull(
3255-
cp.addSelectorName(node.name, InvocationKind.method));
3254+
asm.emitNullCheck(cp.addSelectorName(node.name, InvocationKind.method));
32563255
}
32573256

32583257
_genInstanceCall(null, InvocationKind.getter, node.interfaceTarget,
@@ -3309,8 +3308,7 @@ class BytecodeGenerator extends RecursiveVisitor<Null> {
33093308
final int receiverTemp = locals.tempIndexInFrame(node);
33103309
_genArguments(node.receiver, args, storeReceiverToLocal: receiverTemp);
33113310
asm.emitPush(receiverTemp);
3312-
asm.emitCheckReceiverForNull(
3313-
cp.addSelectorName(node.name, InvocationKind.method));
3311+
asm.emitNullCheck(cp.addSelectorName(node.name, InvocationKind.method));
33143312
} else {
33153313
_genArguments(node.receiver, args);
33163314
}
@@ -3344,8 +3342,7 @@ class BytecodeGenerator extends RecursiveVisitor<Null> {
33443342
final int receiverTemp = locals.tempIndexInFrame(node);
33453343
asm.emitStoreLocal(receiverTemp);
33463344
asm.emitPush(receiverTemp);
3347-
asm.emitCheckReceiverForNull(
3348-
cp.addSelectorName(node.name, InvocationKind.getter));
3345+
asm.emitNullCheck(cp.addSelectorName(node.name, InvocationKind.getter));
33493346
}
33503347
_genDirectCall(directCall.target, argDesc, 1, isGet: true, node: node);
33513348
} else {
@@ -3367,8 +3364,7 @@ class BytecodeGenerator extends RecursiveVisitor<Null> {
33673364
asm.emitStoreLocal(temp);
33683365
_generateNode(node.value);
33693366
asm.emitPush(temp);
3370-
asm.emitCheckReceiverForNull(
3371-
cp.addSelectorName(node.name, InvocationKind.setter));
3367+
asm.emitNullCheck(cp.addSelectorName(node.name, InvocationKind.setter));
33723368
} else {
33733369
_generateNode(node.value);
33743370
}
@@ -3477,6 +3473,15 @@ class BytecodeGenerator extends RecursiveVisitor<Null> {
34773473
}
34783474
}
34793475

3476+
@override
3477+
visitNullCheck(NullCheck node) {
3478+
_generateNode(node.operand);
3479+
final operandTemp = locals.tempIndexInFrame(node);
3480+
asm.emitStoreLocal(operandTemp);
3481+
asm.emitPush(operandTemp);
3482+
asm.emitNullCheck(cp.addObjectRef(null));
3483+
}
3484+
34803485
@override
34813486
visitNullLiteral(NullLiteral node) {
34823487
asm.emitPushNull();

pkg/vm/lib/bytecode/local_vars.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,6 +1289,11 @@ class _Allocator extends RecursiveVisitor<Null> {
12891289
visitInstantiation(Instantiation node) {
12901290
_visit(node, temps: 3);
12911291
}
1292+
1293+
@override
1294+
visitNullCheck(NullCheck node) {
1295+
_visit(node, temps: 1);
1296+
}
12921297
}
12931298

12941299
class LocalVariableIndexOverflowException

pkg/vm/testcases/bytecode/closures.dart.expect

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1611,7 +1611,7 @@ Bytecode {
16111611
InterfaceCall CP#2, 1
16121612
PopLocal r2
16131613
Push r0
1614-
CheckReceiverForNull CP#4
1614+
NullCheck CP#4
16151615
InterfaceCall CP#5, 1
16161616
Push r1
16171617
Push r2
@@ -1648,7 +1648,7 @@ Bytecode {
16481648
InterfaceCall CP#3, 1
16491649
PopLocal r2
16501650
Push r0
1651-
CheckReceiverForNull CP#5
1651+
NullCheck CP#5
16521652
InterfaceCall CP#6, 1
16531653
Push r1
16541654
Push r2
@@ -1687,7 +1687,7 @@ Bytecode {
16871687
InterfaceCall CP#5, 1
16881688
PopLocal r2
16891689
Push r0
1690-
CheckReceiverForNull CP#7
1690+
NullCheck CP#7
16911691
InterfaceCall CP#8, 1
16921692
Push r1
16931693
Push r2

runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1427,7 +1427,7 @@ void BytecodeFlowGraphBuilder::BuildAssertSubtype() {
14271427
code_ <<= instr;
14281428
}
14291429

1430-
void BytecodeFlowGraphBuilder::BuildCheckReceiverForNull() {
1430+
void BytecodeFlowGraphBuilder::BuildNullCheck() {
14311431
if (is_generating_interpreter()) {
14321432
UNIMPLEMENTED(); // TODO(alexmarkov): interpreter
14331433
}

runtime/vm/constants_kbc.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -689,8 +689,8 @@ namespace dart {
689689
V(MoveSpecial_Wide, A_Y, WIDE, num, xeg, ___) \
690690
V(BooleanNegateTOS, 0, ORDN, ___, ___, ___) \
691691
V(EqualsNull, 0, ORDN, ___, ___, ___) \
692-
V(CheckReceiverForNull, D, ORDN, lit, ___, ___) \
693-
V(CheckReceiverForNull_Wide, D, WIDE, lit, ___, ___) \
692+
V(NullCheck, D, ORDN, lit, ___, ___) \
693+
V(NullCheck_Wide, D, WIDE, lit, ___, ___) \
694694
V(NegateInt, 0, ORDN, ___, ___, ___) \
695695
V(AddInt, 0, ORDN, ___, ___, ___) \
696696
V(SubInt, 0, ORDN, ___, ___, ___) \

runtime/vm/interpreter.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2698,7 +2698,7 @@ RawObject* Interpreter::Call(RawFunction* function,
26982698
}
26992699

27002700
{
2701-
BYTECODE(CheckReceiverForNull, D);
2701+
BYTECODE(NullCheck, D);
27022702
SP -= 1;
27032703

27042704
if (UNLIKELY(SP[0] == null_value)) {

0 commit comments

Comments
 (0)