From 741f662a60b4c3ca16d8424c97c15a1427a793a9 Mon Sep 17 00:00:00 2001 From: Alexander Markov Date: Mon, 13 Aug 2018 17:50:21 +0000 Subject: [PATCH] [vm/kernel/bytecode] Fix number of checked arguments in bytecode calls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Number of checked arguments is corrected in ICData objects created when reading bytecode, both for instance and static calls. InstanceCall1 and InstanceCall2 bytecode instructions are replaced with InstanceCall which works for any number of checked arguments. This makes decision on number of checked arguments internal to VM and it is no longer exposed to bytecode. Change-Id: I0bba01eca6347336f3832de863b2ce4715fda04a Reviewed-on: https://dart-review.googlesource.com/69421 Reviewed-by: Régis Crelier Reviewed-by: Zach Anderson Commit-Queue: Alexander Markov --- pkg/vm/lib/bytecode/assembler.dart | 8 +-- pkg/vm/lib/bytecode/dbc.dart | 10 +-- pkg/vm/lib/bytecode/gen_bytecode.dart | 21 +++--- pkg/vm/testcases/bytecode/asserts.dart.expect | 4 +- pkg/vm/testcases/bytecode/async.dart.expect | 68 +++++++++--------- .../bytecode/bootstrapping.dart.expect | 18 ++--- .../testcases/bytecode/closures.dart.expect | 62 ++++++++-------- .../bytecode/field_initializers.dart.expect | 4 +- .../testcases/bytecode/literals.dart.expect | 8 +-- pkg/vm/testcases/bytecode/loops.dart.expect | 72 +++++++++---------- .../bytecode/super_calls.dart.expect | 4 +- pkg/vm/testcases/bytecode/switch.dart.expect | 30 ++++---- .../testcases/bytecode/try_blocks.dart.expect | 26 +++---- .../testcases/bytecode/type_ops.dart.expect | 20 +++--- runtime/vm/compiler/aot/precompiler.cc | 14 +--- .../vm/compiler/assembler/disassembler_kbc.cc | 3 +- runtime/vm/compiler/backend/il.cc | 14 +--- .../vm/compiler/frontend/bytecode_reader.cc | 15 +++- runtime/vm/compiler/method_recognizer.cc | 12 ++++ runtime/vm/compiler/method_recognizer.h | 1 + runtime/vm/constants_kbc.h | 14 ++-- runtime/vm/interpreter.cc | 44 ++++-------- runtime/vm/object.h | 1 + 23 files changed, 227 insertions(+), 246 deletions(-) diff --git a/pkg/vm/lib/bytecode/assembler.dart b/pkg/vm/lib/bytecode/assembler.dart index aec44bf5517..bc3f8ac01dd 100644 --- a/pkg/vm/lib/bytecode/assembler.dart +++ b/pkg/vm/lib/bytecode/assembler.dart @@ -232,12 +232,8 @@ class BytecodeAssembler { emitWord(_encodeAD(Opcode.kStaticCall, ra, rd)); } - void emitInstanceCall1(int ra, int rd) { - emitWord(_encodeAD(Opcode.kInstanceCall1, ra, rd)); - } - - void emitInstanceCall2(int ra, int rd) { - emitWord(_encodeAD(Opcode.kInstanceCall2, ra, rd)); + void emitInstanceCall(int ra, int rd) { + emitWord(_encodeAD(Opcode.kInstanceCall, ra, rd)); } void emitInstanceCall1Opt(int ra, int rd) { diff --git a/pkg/vm/lib/bytecode/dbc.dart b/pkg/vm/lib/bytecode/dbc.dart index 809c47c7a9b..5ca0253f98e 100644 --- a/pkg/vm/lib/bytecode/dbc.dart +++ b/pkg/vm/lib/bytecode/dbc.dart @@ -34,6 +34,9 @@ library vm.bytecode.dbc; // D = index of TypeArgumentsField constant pool entry corresponding // to an instance's class. // +// 10. InstanceCall1 and InstanceCall2 instructions are superseded by +// InstanceCall which works for any number of checked arguments. +// enum Opcode { kTrap, @@ -59,8 +62,7 @@ enum Opcode { kPopLocal, kIndirectStaticCall, kStaticCall, - kInstanceCall1, - kInstanceCall2, + kInstanceCall, kInstanceCall1Opt, kInstanceCall2Opt, kPushPolymorphicInstanceCall, @@ -316,9 +318,7 @@ const Map BytecodeFormats = const { Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]), Opcode.kStaticCall: const Format( Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]), - Opcode.kInstanceCall1: const Format( - Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]), - Opcode.kInstanceCall2: const Format( + Opcode.kInstanceCall: const Format( Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]), Opcode.kInstanceCall1Opt: const Format( Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]), diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart index f30fca6978e..0892e676c7b 100644 --- a/pkg/vm/lib/bytecode/gen_bytecode.dart +++ b/pkg/vm/lib/bytecode/gen_bytecode.dart @@ -577,7 +577,7 @@ class BytecodeGenerator extends RecursiveVisitor { final argDescIndex = cp.add(new ConstantArgDesc(4)); final icdataIndex = cp.add(new ConstantICData( InvocationKind.method, objectInstanceOf.name, argDescIndex)); - asm.emitInstanceCall1(4, icdataIndex); + asm.emitInstanceCall(4, icdataIndex); } void start(Member node) { @@ -1161,7 +1161,7 @@ class BytecodeGenerator extends RecursiveVisitor { final argDescIndex = cp.add(new ConstantArgDesc(4)); final icdataIndex = cp.add(new ConstantICData( InvocationKind.method, objectAs.name, argDescIndex)); - asm.emitInstanceCall1(4, icdataIndex); + asm.emitInstanceCall(4, icdataIndex); } } @@ -1458,8 +1458,7 @@ class BytecodeGenerator extends RecursiveVisitor { args.named.length + 1 /* receiver */ + (args.types.isNotEmpty ? 1 : 0) /* type arguments */; - // TODO(alexmarkov): figure out when generate InstanceCall2 (2 checked arguments). - asm.emitInstanceCall1(totalArgCount, icdataIndex); + asm.emitInstanceCall(totalArgCount, icdataIndex); } @override @@ -1468,7 +1467,7 @@ class BytecodeGenerator extends RecursiveVisitor { final argDescIndex = cp.add(new ConstantArgDesc(1)); final icdataIndex = cp.add( new ConstantICData(InvocationKind.getter, node.name, argDescIndex)); - asm.emitInstanceCall1(1, icdataIndex); + asm.emitInstanceCall(1, icdataIndex); } @override @@ -1486,7 +1485,7 @@ class BytecodeGenerator extends RecursiveVisitor { final argDescIndex = cp.add(new ConstantArgDesc(2)); final icdataIndex = cp.add( new ConstantICData(InvocationKind.setter, node.name, argDescIndex)); - asm.emitInstanceCall1(2, icdataIndex); + asm.emitInstanceCall(2, icdataIndex); asm.emitDrop1(); if (hasResult) { @@ -1882,7 +1881,7 @@ class BytecodeGenerator extends RecursiveVisitor { const kMoveNext = 'moveNext'; // Iterator.moveNext const kCurrent = 'current'; // Iterator.current - asm.emitInstanceCall1( + asm.emitInstanceCall( 1, cp.add(new ConstantICData(InvocationKind.getter, new Name(kIterator), cp.add(new ConstantArgDesc(1))))); @@ -1910,7 +1909,7 @@ class BytecodeGenerator extends RecursiveVisitor { asm.emitPush(iteratorTemp); } - asm.emitInstanceCall1( + asm.emitInstanceCall( 1, cp.add(new ConstantICData(InvocationKind.method, new Name(kMoveNext), cp.add(new ConstantArgDesc(1))))); @@ -1921,7 +1920,7 @@ class BytecodeGenerator extends RecursiveVisitor { _genPushContextIfCaptured(node.variable); asm.emitPush(iteratorTemp); - asm.emitInstanceCall1( + asm.emitInstanceCall( 1, cp.add(new ConstantICData(InvocationKind.getter, new Name(kCurrent), cp.add(new ConstantArgDesc(1))))); @@ -2051,9 +2050,7 @@ class BytecodeGenerator extends RecursiveVisitor { for (var expr in switchCase.expressions) { asm.emitPush(temp); _genPushConstExpr(expr); - // TODO(alexmarkov): generate InstanceCall2 once we have a way to - // mark ICData as having 2 checked arguments. - asm.emitInstanceCall1( + asm.emitInstanceCall( 2, cp.add(new ConstantICData( InvocationKind.method, new Name('=='), equalsArgDesc))); diff --git a/pkg/vm/testcases/bytecode/asserts.dart.expect b/pkg/vm/testcases/bytecode/asserts.dart.expect index 3b0bcbc5718..3f5cf691ef9 100644 --- a/pkg/vm/testcases/bytecode/asserts.dart.expect +++ b/pkg/vm/testcases/bytecode/asserts.dart.expect @@ -38,7 +38,7 @@ Bytecode { CheckStack JumpIfNoAsserts L1 Push FP[-6] - InstanceCall1 1, CP#1 + InstanceCall 1, CP#1 AssertBoolean 0 PushConstant CP#2 IfEqStrictTOS @@ -46,7 +46,7 @@ Bytecode { PushConstant CP#3 PushConstant CP#3 Push FP[-5] - InstanceCall1 1, CP#4 + InstanceCall 1, CP#4 PushConstant CP#6 IndirectStaticCall 3, CP#5 Drop1 diff --git a/pkg/vm/testcases/bytecode/async.dart.expect b/pkg/vm/testcases/bytecode/async.dart.expect index 25ce727859d..26fbf21201d 100644 --- a/pkg/vm/testcases/bytecode/async.dart.expect +++ b/pkg/vm/testcases/bytecode/async.dart.expect @@ -137,7 +137,7 @@ Try #0 handler: LoadContextVar 6 Push r8 Push r9 - InstanceCall1 3, CP#19 + InstanceCall 3, CP#19 Drop1 Jump L3 L3: @@ -245,7 +245,7 @@ Closure CP#0 { Drop1 Push r0 LoadContextVar 6 - InstanceCall1 1, CP#33 + InstanceCall 1, CP#33 ReturnTOS Push r0 LoadContextParent @@ -346,7 +346,7 @@ Bytecode { Drop1 Push r0 LoadContextVar 3 - InstanceCall1 1, CP#27 + InstanceCall 1, CP#27 ReturnTOS Push r0 LoadContextParent @@ -432,7 +432,7 @@ Try #0 handler: LoadContextVar 3 Push r8 Push r9 - InstanceCall1 3, CP#13 + InstanceCall 3, CP#13 Drop1 Jump L3 L3: @@ -556,7 +556,7 @@ Bytecode { Drop1 Push r0 LoadContextVar 8 - InstanceCall1 1, CP#32 + InstanceCall 1, CP#32 ReturnTOS Push r0 LoadContextParent @@ -680,7 +680,7 @@ L3: Push r4 LoadContextVar 6 Push r1 - InstanceCall1 2, CP#14 + InstanceCall 2, CP#14 StoreContextVar 7 Jump L4 L4: @@ -712,7 +712,7 @@ Try #0 handler: LoadContextVar 8 Push r8 Push r9 - InstanceCall1 3, CP#18 + InstanceCall 3, CP#18 Drop1 Jump L5 L5: @@ -848,7 +848,7 @@ Bytecode { Drop1 Push r0 LoadContextVar 9 - InstanceCall1 1, CP#44 + InstanceCall 1, CP#44 ReturnTOS Push r0 LoadContextParent @@ -946,7 +946,7 @@ L6: Push r4 LoadContextVar 0 PushConstant CP#8 - InstanceCall1 2, CP#10 + InstanceCall 2, CP#10 AssertBoolean 0 PushConstant CP#11 IfNeStrictTOS @@ -963,7 +963,7 @@ L6: LoadContextParent LoadContextParent LoadContextVar 0 - InstanceCall1 1, CP#12 + InstanceCall 1, CP#12 PopLocal r8 Push r4 Push r8 @@ -973,7 +973,7 @@ L5: Push r4 LoadContextVar 0 StoreLocal r8 - InstanceCall1 1, CP#13 + InstanceCall 1, CP#13 PushConstant CP#11 IfNeStrictTOS Jump L3 @@ -985,7 +985,7 @@ L5: PopLocal r4 Push r4 Push r8 - InstanceCall1 1, CP#14 + InstanceCall 1, CP#14 StoreContextVar 0 Push r4 LoadContextParent @@ -1009,7 +1009,7 @@ L5: LoadContextVar 0 Push r4 LoadContextVar 0 - InstanceCall1 2, CP#15 + InstanceCall 2, CP#15 StoreContextVar 3 Push r4 LoadContextParent @@ -1074,8 +1074,8 @@ L4: LoadContextParent LoadContextVar 3 Push r1 - InstanceCall1 2, CP#21 - InstanceCall1 2, CP#22 + InstanceCall 2, CP#21 + InstanceCall 2, CP#22 StoreContextVar 0 Push r4 LoadContextParent @@ -1092,7 +1092,7 @@ L3: Push r4 LoadContextVar 0 PushConstant CP#16 - InstanceCall1 2, CP#23 + InstanceCall 2, CP#23 StoreLocal r8 StoreContextVar 0 Push r8 @@ -1108,7 +1108,7 @@ L8: CheckStack Push r8 PushConstant CP#8 - InstanceCall1 2, CP#24 + InstanceCall 2, CP#24 AssertBoolean 0 PushConstant CP#11 IfNeStrictTOS @@ -1117,11 +1117,11 @@ L8: Push r4 LoadContextVar 0 Push r8 - InstanceCall1 2, CP#25 + InstanceCall 2, CP#25 StoreContextVar 0 Push r8 PushConstant CP#16 - InstanceCall1 2, CP#26 + InstanceCall 2, CP#26 StoreLocal r8 Drop1 Jump L8 @@ -1167,7 +1167,7 @@ Try #0 handler: LoadContextVar 9 Push r8 Push r9 - InstanceCall1 3, CP#30 + InstanceCall 3, CP#30 Drop1 Jump L10 L10: @@ -1324,7 +1324,7 @@ Bytecode { Drop1 Push r0 LoadContextVar 12 - InstanceCall1 1, CP#50 + InstanceCall 1, CP#50 ReturnTOS Push r0 LoadContextParent @@ -1467,7 +1467,7 @@ L2: LoadContextParent LoadContextVar 2 Push r1 - InstanceCall1 2, CP#12 + InstanceCall 2, CP#12 StoreContextVar 0 Jump L3 Try #2 end: @@ -1502,7 +1502,7 @@ Try #2 handler: PushConstant CP#3 PushConstant CP#3 PushConstant CP#14 - InstanceCall1 4, CP#15 + InstanceCall 4, CP#15 AssertBoolean 0 PushConstant CP#16 IfNeStrictTOS @@ -1567,7 +1567,7 @@ L6: LoadContextParent LoadContextVar 2 Push r1 - InstanceCall1 2, CP#20 + InstanceCall 2, CP#20 StoreContextVar 0 Push r4 LoadContextParent @@ -1650,7 +1650,7 @@ L8: LoadContextParent LoadContextVar 2 Push r1 - InstanceCall1 2, CP#25 + InstanceCall 2, CP#25 StoreContextVar 0 Push r4 LoadContextParent @@ -1722,7 +1722,7 @@ L10: LoadContextParent LoadContextVar 2 Push r1 - InstanceCall1 2, CP#29 + InstanceCall 2, CP#29 StoreContextVar 0 Push r4 LoadContextParent @@ -1791,7 +1791,7 @@ L11: LoadContextParent LoadContextVar 2 Push r1 - InstanceCall1 2, CP#33 + InstanceCall 2, CP#33 StoreContextVar 0 Push r4 LoadContextParent @@ -1834,7 +1834,7 @@ Try #0 handler: LoadContextVar 12 Push r8 Push r9 - InstanceCall1 3, CP#36 + InstanceCall 3, CP#36 Drop1 Jump L12 L12: @@ -2086,7 +2086,7 @@ L2: LoadContextVar 0 Push r4 LoadContextVar 0 - InstanceCall1 2, CP#16 + InstanceCall 2, CP#16 StoreContextVar 7 Jump L3 Jump L4 @@ -2165,7 +2165,7 @@ Try #0 handler: LoadContextVar 8 Push r8 Push r9 - InstanceCall1 3, CP#24 + InstanceCall 3, CP#24 Drop1 Jump L6 L6: @@ -2260,7 +2260,7 @@ Closure CP#1 { Drop1 Push r0 LoadContextVar 8 - InstanceCall1 1, CP#38 + InstanceCall 1, CP#38 ReturnTOS Push r0 LoadContextParent @@ -2392,7 +2392,7 @@ Bytecode { Drop1 Push r0 LoadContextVar 7 - InstanceCall1 1, CP#34 + InstanceCall 1, CP#34 ReturnTOS Push r0 LoadContextParent @@ -2488,7 +2488,7 @@ L3: JumpIfNoAsserts L2 Push r1 PushConstant CP#11 - InstanceCall1 2, CP#13 + InstanceCall 2, CP#13 AssertBoolean 0 PushConstant CP#14 IfEqStrictTOS @@ -2533,7 +2533,7 @@ Try #0 handler: LoadContextVar 7 Push r8 Push r9 - InstanceCall1 3, CP#20 + InstanceCall 3, CP#20 Drop1 Jump L5 L5: diff --git a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect index 49ae297aad2..16c0efe8546 100644 --- a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect +++ b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect @@ -122,7 +122,7 @@ Bytecode { PushConstant CP#0 PushStatic CP#0 PushConstant CP#1 - InstanceCall1 2, CP#3 + InstanceCall 2, CP#3 AssertBoolean 0 PushConstant CP#4 IfNeStrictTOS @@ -318,7 +318,7 @@ Bytecode { PushConstant CP#0 PushStatic CP#0 PushConstant CP#1 - InstanceCall1 2, CP#3 + InstanceCall 2, CP#3 AssertBoolean 0 PushConstant CP#4 IfNeStrictTOS @@ -326,7 +326,7 @@ Bytecode { PushConstant CP#5 PushStatic CP#5 PushConstant CP#1 - InstanceCall1 2, CP#6 + InstanceCall 2, CP#6 AssertBoolean 0 BooleanNegateTOS PopLocal r0 @@ -342,7 +342,7 @@ L2: Jump L3 PushConstant CP#5 PushStatic CP#5 - InstanceCall1 1, CP#9 + InstanceCall 1, CP#9 StoreStaticTOS CP#0 L3: PushConstant CP#0 @@ -392,7 +392,7 @@ Bytecode { Entry 0 CheckStack Push FP[-5] - InstanceCall1 1, CP#1 + InstanceCall 1, CP#1 PushConstant CP#2 IndirectStaticCall 1, CP#0 Drop1 @@ -470,7 +470,7 @@ Bytecode { PushConstant CP#0 PushStatic CP#0 PushConstant CP#1 - InstanceCall1 2, CP#3 + InstanceCall 2, CP#3 AssertBoolean 0 PushConstant CP#4 IfEqStrictTOS @@ -478,7 +478,7 @@ Bytecode { PushConstant CP#0 PushStatic CP#0 PushConstant CP#5 - InstanceCall1 2, CP#6 + InstanceCall 2, CP#6 AssertBoolean 0 PopLocal r1 Jump L2 @@ -494,7 +494,7 @@ L2: PushConstant CP#0 PushStatic CP#0 PushConstant CP#7 - InstanceCall1 2, CP#8 + InstanceCall 2, CP#8 AssertBoolean 0 PopLocal r0 Jump L4 @@ -521,7 +521,7 @@ L5: PushStatic CP#0 PushConstant CP#14 IndirectStaticCall 2, CP#2 - InstanceCall1 2, CP#15 + InstanceCall 2, CP#15 ReturnTOS L6: PushConstant CP#13 diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect index cf905614ea4..c3eba73836c 100644 --- a/pkg/vm/testcases/bytecode/closures.dart.expect +++ b/pkg/vm/testcases/bytecode/closures.dart.expect @@ -220,11 +220,11 @@ Bytecode { PopLocal r3 PushConstant CP#51 Push r3 - InstanceCall1 2, CP#52 + InstanceCall 2, CP#52 Drop1 PushConstant CP#53 Push r3 - InstanceCall1 2, CP#54 + InstanceCall 2, CP#54 Drop1 PushConstant CP#18 ReturnTOS @@ -404,7 +404,7 @@ Closure CP#9 { StoreFieldTOS CP#1 PopLocal r3 Push r3 - InstanceCall1 1, CP#43 + InstanceCall 1, CP#43 Drop1 PushConstant CP#18 ReturnTOS @@ -445,11 +445,11 @@ Closure CP#0 { PopLocal r3 PushConstant CP#45 Push r3 - InstanceCall1 2, CP#47 + InstanceCall 2, CP#47 Drop1 PushConstant CP#48 Push r3 - InstanceCall1 2, CP#49 + InstanceCall 2, CP#49 Drop1 PushConstant CP#18 ReturnTOS @@ -538,11 +538,11 @@ Bytecode { PopLocal r3 Push r3 PushConstant CP#32 - InstanceCall1 2, CP#33 + InstanceCall 2, CP#33 Drop1 Push r3 PushConstant CP#34 - InstanceCall1 2, CP#35 + InstanceCall 2, CP#35 Drop1 Push r2 PushConstant CP#36 @@ -589,7 +589,7 @@ Bytecode { StoreFieldTOS CP#4 PopLocal r2 Push r2 - InstanceCall1 1, CP#43 + InstanceCall 1, CP#43 Drop1 Push r0 LoadContextParent @@ -658,7 +658,7 @@ Closure CP#16 { LoadContextParent LoadContextVar 0 PushConstant CP#1 - InstanceCall1 2, CP#17 + InstanceCall 2, CP#17 StoreContextVar 0 Push r0 Push r0 @@ -667,11 +667,11 @@ Closure CP#16 { LoadContextParent LoadContextParent LoadContextVar 0 - InstanceCall1 1, CP#19 + InstanceCall 1, CP#19 Push r0 LoadContextParent LoadContextVar 0 - InstanceCall1 2, CP#20 + InstanceCall 2, CP#20 StoreContextVar 0 PushConstant CP#6 ReturnTOS @@ -712,14 +712,14 @@ Closure CP#3 { Push r0 LoadContextVar 0 PushConstant CP#0 - InstanceCall1 2, CP#11 + InstanceCall 2, CP#11 StoreContextVar 0 Push r0 LoadContextParent LoadContextParent LoadContextVar 0 PushConstant CP#12 - InstanceCall1 2, CP#13 + InstanceCall 2, CP#13 AssertBoolean 0 PushConstant CP#14 IfNeStrictTOS @@ -749,7 +749,7 @@ Closure CP#3 { StoreFieldTOS CP#4 PopLocal r3 Push r3 - InstanceCall1 1, CP#29 + InstanceCall 1, CP#29 Drop1 Push r0 LoadContextVar 0 @@ -776,7 +776,7 @@ Closure CP#40 { LoadContextVar 0 Push r0 LoadContextVar 0 - InstanceCall1 2, CP#41 + InstanceCall 2, CP#41 Drop1 PushConstant CP#6 ReturnTOS @@ -881,7 +881,7 @@ L2: Push r0 LoadContextVar 0 PushConstant CP#5 - InstanceCall1 2, CP#6 + InstanceCall 2, CP#6 AssertBoolean 0 PushConstant CP#7 IfNeStrictTOS @@ -901,7 +901,7 @@ L2: Push r3 Push r0 StoreFieldTOS CP#9 - InstanceCall1 2, CP#21 + InstanceCall 2, CP#21 Drop1 Push r4 Allocate CP#14 @@ -918,7 +918,7 @@ L2: Push r3 Push r0 StoreFieldTOS CP#9 - InstanceCall1 2, CP#28 + InstanceCall 2, CP#28 Drop1 Push r0 CloneContext @@ -927,7 +927,7 @@ L2: Push r0 LoadContextVar 0 PushConstant CP#29 - InstanceCall1 2, CP#30 + InstanceCall 2, CP#30 StoreLocal r3 StoreContextVar 0 Push r3 @@ -987,7 +987,7 @@ Closure CP#8 { Push r0 LoadContextParent LoadContextVar 0 - InstanceCall1 2, CP#11 + InstanceCall 2, CP#11 ReturnTOS PushConstant CP#12 ReturnTOS @@ -1012,7 +1012,7 @@ Closure CP#22 { Push r0 LoadContextParent LoadContextVar 0 - InstanceCall1 2, CP#26 + InstanceCall 2, CP#26 StoreContextVar 0 PushConstant CP#12 ReturnTOS @@ -1041,12 +1041,12 @@ Bytecode { AssertAssignable 0, CP#3 Drop1 Push FP[-5] - InstanceCall1 1, CP#5 + InstanceCall 1, CP#5 PopLocal r2 L2: CheckStack Push r2 - InstanceCall1 1, CP#6 + InstanceCall 1, CP#6 PushConstant CP#7 IfNeStrictTOS Jump L1 @@ -1058,7 +1058,7 @@ L2: PopLocal r0 Push r0 Push r2 - InstanceCall1 1, CP#8 + InstanceCall 1, CP#8 StoreContextVar 0 Allocate CP#16 StoreLocal r4 @@ -1076,7 +1076,7 @@ L2: StoreFieldTOS CP#10 PopLocal r3 Push r3 - InstanceCall1 1, CP#23 + InstanceCall 1, CP#23 Drop1 Push r0 LoadContextVar 0 @@ -1128,7 +1128,7 @@ Closure CP#9 { Push r0 LoadContextVar 0 PushConstant CP#12 - InstanceCall1 2, CP#14 + InstanceCall 2, CP#14 StoreContextVar 0 PushConstant CP#0 ReturnTOS @@ -1265,7 +1265,7 @@ Bytecode { PopLocal r2 Push r2 PushConstant CP#18 - InstanceCall1 2, CP#19 + InstanceCall 2, CP#19 Drop1 Push r0 LoadContextVar 0 @@ -1315,7 +1315,7 @@ Closure CP#1 { Push r0 LoadContextVar 0 Push FP[-5] - InstanceCall1 2, CP#9 + InstanceCall 2, CP#9 StoreContextVar 0 PushConstant CP#4 ReturnTOS @@ -1437,7 +1437,7 @@ Bytecode { PushConstant CP#4 IndirectStaticCall 1, CP#3 Drop1 - InstanceCall1 2, CP#6 + InstanceCall 2, CP#6 Drop1 PushConstant CP#7 PushConstant CP#2 @@ -1448,7 +1448,7 @@ Bytecode { PushConstant CP#8 IndirectStaticCall 1, CP#3 Drop1 - InstanceCall1 2, CP#9 + InstanceCall 2, CP#9 Drop1 PushConstant CP#7 PushConstant CP#10 @@ -1459,7 +1459,7 @@ Bytecode { PushConstant CP#11 IndirectStaticCall 1, CP#3 Drop1 - InstanceCall1 2, CP#12 + InstanceCall 2, CP#12 Drop1 PushConstant CP#13 ReturnTOS diff --git a/pkg/vm/testcases/bytecode/field_initializers.dart.expect b/pkg/vm/testcases/bytecode/field_initializers.dart.expect index cb6efea08f1..1522863339f 100644 --- a/pkg/vm/testcases/bytecode/field_initializers.dart.expect +++ b/pkg/vm/testcases/bytecode/field_initializers.dart.expect @@ -57,7 +57,7 @@ Bytecode { Push FP[-7] Push FP[-5] PushConstant CP#5 - InstanceCall1 2, CP#7 + InstanceCall 2, CP#7 StoreFieldTOS CP#8 Push FP[-7] PushConstant CP#11 @@ -113,7 +113,7 @@ Bytecode { Push FP[-7] Push FP[-6] Push FP[-5] - InstanceCall1 2, CP#1 + InstanceCall 2, CP#1 PushConstant CP#3 IndirectStaticCall 3, CP#2 Drop1 diff --git a/pkg/vm/testcases/bytecode/literals.dart.expect b/pkg/vm/testcases/bytecode/literals.dart.expect index d533ada75af..b997fdfab38 100644 --- a/pkg/vm/testcases/bytecode/literals.dart.expect +++ b/pkg/vm/testcases/bytecode/literals.dart.expect @@ -170,12 +170,12 @@ Bytecode { Push FP[-8] Push FP[-7] Push FP[-6] - InstanceCall1 2, CP#1 + InstanceCall 2, CP#1 StoreFieldTOS CP#2 Push FP[-8] Push FP[-5] PushConstant CP#4 - InstanceCall1 2, CP#5 + InstanceCall 2, CP#5 PushConstant CP#6 IndirectStaticCall 2, CP#0 Drop1 @@ -496,7 +496,7 @@ Bytecode { Push r0 PushConstant CP#3 Push FP[-5] - InstanceCall1 1, CP#11 + InstanceCall 1, CP#11 StoreIndexedTOS Push r0 PushConstant CP#4 @@ -579,7 +579,7 @@ Bytecode { Push r1 PushConstant CP#5 Push FP[-6] - InstanceCall1 1, CP#13 + InstanceCall 1, CP#13 StoreIndexedTOS Push r1 PushConstant CP#6 diff --git a/pkg/vm/testcases/bytecode/loops.dart.expect b/pkg/vm/testcases/bytecode/loops.dart.expect index 17a68e11a67..4112fe80915 100644 --- a/pkg/vm/testcases/bytecode/loops.dart.expect +++ b/pkg/vm/testcases/bytecode/loops.dart.expect @@ -14,8 +14,8 @@ L2: CheckStack Push r1 Push FP[-5] - InstanceCall1 1, CP#2 - InstanceCall1 2, CP#4 + InstanceCall 1, CP#2 + InstanceCall 2, CP#4 AssertBoolean 0 PushConstant CP#5 IfNeStrictTOS @@ -23,12 +23,12 @@ L2: Push r0 Push FP[-5] Push r1 - InstanceCall1 2, CP#6 - InstanceCall1 2, CP#7 + InstanceCall 2, CP#6 + InstanceCall 2, CP#7 PopLocal r0 Push r1 PushConstant CP#8 - InstanceCall1 2, CP#9 + InstanceCall 2, CP#9 StoreLocal r1 Drop1 Jump L2 @@ -70,15 +70,15 @@ L3: CheckStack Push r1 PushConstant CP#0 - InstanceCall1 2, CP#2 + InstanceCall 2, CP#2 AssertBoolean 0 PushConstant CP#3 IfNeStrictTOS Jump L1 Push r1 Push FP[-5] - InstanceCall1 1, CP#5 - InstanceCall1 2, CP#6 + InstanceCall 1, CP#5 + InstanceCall 2, CP#6 AssertBoolean 0 PushConstant CP#3 IfNeStrictTOS @@ -88,12 +88,12 @@ L2: Push r0 Push FP[-5] Push r1 - InstanceCall1 2, CP#7 - InstanceCall1 2, CP#8 + InstanceCall 2, CP#7 + InstanceCall 2, CP#8 PopLocal r0 Push r1 PushConstant CP#9 - InstanceCall1 2, CP#10 + InstanceCall 2, CP#10 StoreLocal r1 Drop1 Jump L3 @@ -135,21 +135,21 @@ Bytecode { PushConstant CP#0 PopLocal r0 PushConstant CP#1 - InstanceCall1 1, CP#3 + InstanceCall 1, CP#3 PopLocal r1 L4: CheckStack Push r1 Push FP[-5] - InstanceCall1 1, CP#4 - InstanceCall1 2, CP#6 + InstanceCall 1, CP#4 + InstanceCall 2, CP#6 AssertBoolean 0 PushConstant CP#7 IfNeStrictTOS Jump L1 Push r1 PushConstant CP#0 - InstanceCall1 2, CP#8 + InstanceCall 2, CP#8 AssertBoolean 0 PushConstant CP#7 IfNeStrictTOS @@ -159,13 +159,13 @@ L2: Push r0 Push FP[-5] Push r1 - InstanceCall1 2, CP#9 - InstanceCall1 2, CP#10 + InstanceCall 2, CP#9 + InstanceCall 2, CP#10 PopLocal r0 L3: Push r1 PushConstant CP#11 - InstanceCall1 2, CP#12 + InstanceCall 2, CP#12 StoreLocal r1 Drop1 Jump L4 @@ -215,8 +215,8 @@ L2: CheckStack Push r1 Push FP[-5] - InstanceCall1 1, CP#2 - InstanceCall1 2, CP#4 + InstanceCall 1, CP#2 + InstanceCall 2, CP#4 AssertBoolean 0 PushConstant CP#5 IfNeStrictTOS @@ -227,12 +227,12 @@ L2: PopLocal r2 Push r2 PushConstant CP#6 - InstanceCall1 2, CP#7 + InstanceCall 2, CP#7 StoreLocal r1 PopLocal r3 Push r2 - InstanceCall1 2, CP#8 - InstanceCall1 2, CP#9 + InstanceCall 2, CP#8 + InstanceCall 2, CP#9 PopLocal r0 Jump L2 L1: @@ -275,17 +275,17 @@ L1: Push r0 Push FP[-5] Push r1 - InstanceCall1 2, CP#2 - InstanceCall1 2, CP#3 + InstanceCall 2, CP#2 + InstanceCall 2, CP#3 PopLocal r0 Push r1 PushConstant CP#4 - InstanceCall1 2, CP#5 + InstanceCall 2, CP#5 PopLocal r1 Push r1 Push FP[-5] - InstanceCall1 1, CP#7 - InstanceCall1 2, CP#8 + InstanceCall 1, CP#7 + InstanceCall 2, CP#8 AssertBoolean 0 PushConstant CP#9 IfEqStrictTOS @@ -325,21 +325,21 @@ Bytecode { PushConstant CP#0 PopLocal r0 Push FP[-5] - InstanceCall1 1, CP#2 + InstanceCall 1, CP#2 PopLocal r1 L2: CheckStack Push r1 - InstanceCall1 1, CP#3 + InstanceCall 1, CP#3 PushConstant CP#4 IfNeStrictTOS Jump L1 Push r1 - InstanceCall1 1, CP#5 + InstanceCall 1, CP#5 PopLocal r2 Push r0 Push r2 - InstanceCall1 2, CP#7 + InstanceCall 2, CP#7 PopLocal r0 Jump L2 L1: @@ -375,23 +375,23 @@ Bytecode { PushConstant CP#1 PopLocal r1 Push FP[-5] - InstanceCall1 1, CP#3 + InstanceCall 1, CP#3 PopLocal r2 L2: CheckStack Push r2 - InstanceCall1 1, CP#4 + InstanceCall 1, CP#4 PushConstant CP#5 IfNeStrictTOS Jump L1 Push r2 - InstanceCall1 1, CP#6 + InstanceCall 1, CP#6 PopLocal r3 Push r3 PopLocal r1 Push r0 Push r1 - InstanceCall1 2, CP#8 + InstanceCall 2, CP#8 PopLocal r0 Jump L2 L1: diff --git a/pkg/vm/testcases/bytecode/super_calls.dart.expect b/pkg/vm/testcases/bytecode/super_calls.dart.expect index 90ddf06b02c..d0e8cf4146b 100644 --- a/pkg/vm/testcases/bytecode/super_calls.dart.expect +++ b/pkg/vm/testcases/bytecode/super_calls.dart.expect @@ -190,7 +190,7 @@ Bytecode { PushConstant CP#2 IndirectStaticCall 1, CP#1 PushConstant CP#3 - InstanceCall1 3, CP#5 + InstanceCall 3, CP#5 ReturnTOS PushConstant CP#6 ReturnTOS @@ -444,7 +444,7 @@ Bytecode { PushConstant CP#10 IndirectStaticCall 2, CP#9 PushConstant CP#11 - InstanceCall1 3, CP#13 + InstanceCall 3, CP#13 ReturnTOS PushConstant CP#14 ReturnTOS diff --git a/pkg/vm/testcases/bytecode/switch.dart.expect b/pkg/vm/testcases/bytecode/switch.dart.expect index a7d303b2a59..ed998c20bbf 100644 --- a/pkg/vm/testcases/bytecode/switch.dart.expect +++ b/pkg/vm/testcases/bytecode/switch.dart.expect @@ -12,19 +12,19 @@ Bytecode { PopLocal r1 Push r1 PushConstant CP#2 - InstanceCall1 2, CP#3 + InstanceCall 2, CP#3 PushConstant CP#4 IfEqStrictTOS Jump L1 Push r1 PushConstant CP#5 - InstanceCall1 2, CP#6 + InstanceCall 2, CP#6 PushConstant CP#4 IfEqStrictTOS Jump L2 Push r1 PushConstant CP#7 - InstanceCall1 2, CP#8 + InstanceCall 2, CP#8 PushConstant CP#4 IfEqStrictTOS Jump L3 @@ -96,37 +96,37 @@ Bytecode { PopLocal r1 Push r1 PushConstant CP#2 - InstanceCall1 2, CP#3 + InstanceCall 2, CP#3 PushConstant CP#4 IfEqStrictTOS Jump L1 Push r1 PushConstant CP#5 - InstanceCall1 2, CP#6 + InstanceCall 2, CP#6 PushConstant CP#4 IfEqStrictTOS Jump L1 Push r1 PushConstant CP#7 - InstanceCall1 2, CP#8 + InstanceCall 2, CP#8 PushConstant CP#4 IfEqStrictTOS Jump L1 Push r1 PushConstant CP#9 - InstanceCall1 2, CP#10 + InstanceCall 2, CP#10 PushConstant CP#4 IfEqStrictTOS Jump L2 Push r1 PushConstant CP#11 - InstanceCall1 2, CP#12 + InstanceCall 2, CP#12 PushConstant CP#4 IfEqStrictTOS Jump L2 Push r1 PushConstant CP#13 - InstanceCall1 2, CP#14 + InstanceCall 2, CP#14 PushConstant CP#4 IfEqStrictTOS Jump L2 @@ -206,37 +206,37 @@ Bytecode { PopLocal r1 Push r1 PushConstant CP#2 - InstanceCall1 2, CP#3 + InstanceCall 2, CP#3 PushConstant CP#4 IfEqStrictTOS Jump L1 Push r1 PushConstant CP#5 - InstanceCall1 2, CP#6 + InstanceCall 2, CP#6 PushConstant CP#4 IfEqStrictTOS Jump L1 Push r1 PushConstant CP#7 - InstanceCall1 2, CP#8 + InstanceCall 2, CP#8 PushConstant CP#4 IfEqStrictTOS Jump L1 Push r1 PushConstant CP#9 - InstanceCall1 2, CP#10 + InstanceCall 2, CP#10 PushConstant CP#4 IfEqStrictTOS Jump L2 Push r1 PushConstant CP#11 - InstanceCall1 2, CP#12 + InstanceCall 2, CP#12 PushConstant CP#4 IfEqStrictTOS Jump L2 Push r1 PushConstant CP#13 - InstanceCall1 2, CP#14 + InstanceCall 2, CP#14 PushConstant CP#4 IfEqStrictTOS Jump L2 diff --git a/pkg/vm/testcases/bytecode/try_blocks.dart.expect b/pkg/vm/testcases/bytecode/try_blocks.dart.expect index c0fd1bbb5b8..8690f11a1bd 100644 --- a/pkg/vm/testcases/bytecode/try_blocks.dart.expect +++ b/pkg/vm/testcases/bytecode/try_blocks.dart.expect @@ -82,7 +82,7 @@ Try #0 handler: PushConstant CP#4 PushConstant CP#4 PushConstant CP#3 - InstanceCall1 4, CP#6 + InstanceCall 4, CP#6 PushConstant CP#7 IfNeStrictTOS Jump L2 @@ -96,7 +96,7 @@ L2: PushConstant CP#4 PushConstant CP#4 PushConstant CP#10 - InstanceCall1 4, CP#11 + InstanceCall 4, CP#11 PushConstant CP#7 IfNeStrictTOS Jump L3 @@ -125,7 +125,7 @@ L3: PushConstant CP#4 PushConstant CP#4 PushConstant CP#18 - InstanceCall1 4, CP#19 + InstanceCall 4, CP#19 PushConstant CP#7 IfNeStrictTOS Jump L4 @@ -287,7 +287,7 @@ Try #0 start: StoreFieldTOS CP#3 PopLocal r4 Push r4 - InstanceCall1 1, CP#20 + InstanceCall 1, CP#20 Drop1 Push r0 LoadContextVar 0 @@ -476,7 +476,7 @@ Try #0 handler: PushConstant CP#11 PushConstant CP#11 PushConstant CP#31 - InstanceCall1 4, CP#33 + InstanceCall 4, CP#33 PushConstant CP#34 IfNeStrictTOS Jump L2 @@ -668,7 +668,7 @@ L5: CheckStack Push r0 PushConstant CP#1 - InstanceCall1 2, CP#3 + InstanceCall 2, CP#3 AssertBoolean 0 PushConstant CP#4 IfNeStrictTOS @@ -676,7 +676,7 @@ L5: Try #0 start: Push r0 PushConstant CP#5 - InstanceCall1 2, CP#6 + InstanceCall 2, CP#6 AssertBoolean 0 PushConstant CP#4 IfNeStrictTOS @@ -708,7 +708,7 @@ L4: Drop1 Push r0 PushConstant CP#12 - InstanceCall1 2, CP#13 + InstanceCall 2, CP#13 StoreLocal r0 Drop1 Jump L5 @@ -763,13 +763,13 @@ Bytecode { PopLocal r2 Push r2 PushConstant CP#1 - InstanceCall1 2, CP#2 + InstanceCall 2, CP#2 PushConstant CP#3 IfEqStrictTOS Jump L1 Push r2 PushConstant CP#4 - InstanceCall1 2, CP#5 + InstanceCall 2, CP#5 PushConstant CP#3 IfEqStrictTOS Jump L2 @@ -814,7 +814,7 @@ Try #1 start: StoreFieldTOS CP#13 PopLocal r7 Push r7 - InstanceCall1 1, CP#26 + InstanceCall 1, CP#26 Drop1 Jump L4 Jump L5 @@ -1042,7 +1042,7 @@ Try #0 handler: IndirectStaticCall 1, CP#5 Drop1 Push r2 - InstanceCall1 1, CP#34 + InstanceCall 1, CP#34 Drop1 Push r3 Push r4 @@ -1056,7 +1056,7 @@ L1: IndirectStaticCall 1, CP#5 Drop1 Push r2 - InstanceCall1 1, CP#36 + InstanceCall 1, CP#36 Drop1 Push r0 LoadContextParent diff --git a/pkg/vm/testcases/bytecode/type_ops.dart.expect b/pkg/vm/testcases/bytecode/type_ops.dart.expect index bf04a31b41e..c0628ceb704 100644 --- a/pkg/vm/testcases/bytecode/type_ops.dart.expect +++ b/pkg/vm/testcases/bytecode/type_ops.dart.expect @@ -110,7 +110,7 @@ Bytecode { LoadTypeArgumentsField CP#0 PushConstant CP#1 PushConstant CP#2 - InstanceCall1 4, CP#4 + InstanceCall 4, CP#4 AssertBoolean 0 PushConstant CP#5 IfNeStrictTOS @@ -125,7 +125,7 @@ L1: LoadTypeArgumentsField CP#0 PushConstant CP#1 PushConstant CP#9 - InstanceCall1 4, CP#10 + InstanceCall 4, CP#10 AssertBoolean 0 PushConstant CP#5 IfNeStrictTOS @@ -143,7 +143,7 @@ L2: PushConstant CP#13 PushConstant CP#14 AssertAssignable 0, CP#15 - InstanceCall1 2, CP#17 + InstanceCall 2, CP#17 Drop1 PushConstant CP#1 ReturnTOS @@ -186,7 +186,7 @@ Bytecode { PushConstant CP#0 Push r0 PushConstant CP#1 - InstanceCall1 4, CP#3 + InstanceCall 4, CP#3 AssertBoolean 0 PushConstant CP#4 IfNeStrictTOS @@ -201,7 +201,7 @@ L1: LoadTypeArgumentsField CP#8 Push r0 PushConstant CP#9 - InstanceCall1 4, CP#10 + InstanceCall 4, CP#10 AssertBoolean 0 PushConstant CP#4 IfNeStrictTOS @@ -216,8 +216,8 @@ L2: LoadTypeArgumentsField CP#8 Push r0 PushConstant CP#13 - InstanceCall1 4, CP#14 - InstanceCall1 1, CP#15 + InstanceCall 4, CP#14 + InstanceCall 1, CP#15 ReturnTOS PushConstant CP#0 ReturnTOS @@ -371,7 +371,7 @@ Bytecode { PushConstant CP#0 PushConstant CP#0 PushConstant CP#1 - InstanceCall1 4, CP#3 + InstanceCall 4, CP#3 AssertBoolean 0 PushConstant CP#4 IfNeStrictTOS @@ -385,7 +385,7 @@ L1: PushConstant CP#0 PushConstant CP#0 PushConstant CP#8 - InstanceCall1 4, CP#9 + InstanceCall 4, CP#9 AssertBoolean 0 PushConstant CP#4 IfNeStrictTOS @@ -399,7 +399,7 @@ L2: PushConstant CP#0 PushConstant CP#0 PushConstant CP#12 - InstanceCall1 4, CP#13 + InstanceCall 4, CP#13 ReturnTOS PushConstant CP#0 ReturnTOS diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc index b5629ecac70..952d27cfece 100644 --- a/runtime/vm/compiler/aot/precompiler.cc +++ b/runtime/vm/compiler/aot/precompiler.cc @@ -2717,18 +2717,8 @@ void Precompiler::PopulateWithICData(const Function& function, const Array& arguments_descriptor = Array::Handle(zone, call->GetArgumentsDescriptor()); const Function& target = call->function(); - MethodRecognizer::Kind recognized_kind = - MethodRecognizer::RecognizeKind(target); - int num_args_checked = 0; - switch (recognized_kind) { - case MethodRecognizer::kDoubleFromInteger: - case MethodRecognizer::kMathMin: - case MethodRecognizer::kMathMax: - num_args_checked = 2; - break; - default: - break; - } + int num_args_checked = + MethodRecognizer::NumArgsCheckedForStaticCall(target); const ICData& ic_data = ICData::ZoneHandle( zone, ICData::New(function, String::Handle(zone, target.name()), arguments_descriptor, call->deopt_id(), diff --git a/runtime/vm/compiler/assembler/disassembler_kbc.cc b/runtime/vm/compiler/assembler/disassembler_kbc.cc index 9b05506f146..69d47366f7e 100644 --- a/runtime/vm/compiler/assembler/disassembler_kbc.cc +++ b/runtime/vm/compiler/assembler/disassembler_kbc.cc @@ -212,8 +212,7 @@ static bool HasLoadFromPool(KBCInstr instr) { case KernelBytecode::kPushConstant: case KernelBytecode::kStaticCall: case KernelBytecode::kIndirectStaticCall: - case KernelBytecode::kInstanceCall1: - case KernelBytecode::kInstanceCall2: + case KernelBytecode::kInstanceCall: case KernelBytecode::kInstanceCall1Opt: case KernelBytecode::kInstanceCall2Opt: case KernelBytecode::kStoreStaticTOS: diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc index 52f3f181bce..3c6a66585a9 100644 --- a/runtime/vm/compiler/backend/il.cc +++ b/runtime/vm/compiler/backend/il.cc @@ -4119,18 +4119,8 @@ void StaticCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { (ic_data() == NULL)) { const Array& arguments_descriptor = Array::Handle(zone, GetArgumentsDescriptor()); - MethodRecognizer::Kind recognized_kind = - MethodRecognizer::RecognizeKind(function()); - int num_args_checked = 0; - switch (recognized_kind) { - case MethodRecognizer::kDoubleFromInteger: - case MethodRecognizer::kMathMin: - case MethodRecognizer::kMathMax: - num_args_checked = 2; - break; - default: - break; - } + const int num_args_checked = + MethodRecognizer::NumArgsCheckedForStaticCall(function()); call_ic_data = compiler->GetOrAddStaticCallICData( deopt_id(), function(), arguments_descriptor, num_args_checked, rebind_rule_); diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc index 3dd64c77216..5c978e9095f 100644 --- a/runtime/vm/compiler/frontend/bytecode_reader.cc +++ b/runtime/vm/compiler/frontend/bytecode_reader.cc @@ -200,10 +200,17 @@ intptr_t BytecodeMetadataHelper::ReadPoolEntries(const Function& function, intptr_t arg_desc_index = helper_->ReadUInt(); ASSERT(arg_desc_index < i); array ^= pool.ObjectAt(arg_desc_index); - // TODO(regis): Should num_args_tested be explicitly provided? + intptr_t checked_argument_count = 1; + if ((kind == InvocationKind::method) && + (MethodTokenRecognizer::RecognizeTokenKind(name) != + Token::kILLEGAL)) { + intptr_t argument_count = ArgumentsDescriptor(array).Count(); + ASSERT(argument_count <= 2); + checked_argument_count = argument_count; + } obj = ICData::New(function, name, array, // Arguments descriptor. - Thread::kNoDeoptId, 1 /* num_args_tested */, + Thread::kNoDeoptId, checked_argument_count, ICData::RebindRule::kInstance); #if defined(TAG_IC_DATA) ICData::Cast(obj).set_tag(ICData::Tag::kInstanceCall); @@ -239,13 +246,15 @@ intptr_t BytecodeMetadataHelper::ReadPoolEntries(const Function& function, elem = Function::Cast(elem).GetMethodExtractor(name); } } + const int num_args_checked = + MethodRecognizer::NumArgsCheckedForStaticCall(Function::Cast(elem)); ASSERT(elem.IsFunction()); intptr_t arg_desc_index = helper_->ReadUInt(); ASSERT(arg_desc_index < i); array ^= pool.ObjectAt(arg_desc_index); obj = ICData::New(function, name, array, // Arguments descriptor. - Thread::kNoDeoptId, 0 /* num_args_tested */, + Thread::kNoDeoptId, num_args_checked, ICData::RebindRule::kStatic); ICData::Cast(obj).AddTarget(Function::Cast(elem)); #if defined(TAG_IC_DATA) diff --git a/runtime/vm/compiler/method_recognizer.cc b/runtime/vm/compiler/method_recognizer.cc index ecc20f64fed..70def2a9026 100644 --- a/runtime/vm/compiler/method_recognizer.cc +++ b/runtime/vm/compiler/method_recognizer.cc @@ -22,6 +22,18 @@ bool MethodRecognizer::PolymorphicTarget(const Function& function) { return function.is_polymorphic_target(); } +intptr_t MethodRecognizer::NumArgsCheckedForStaticCall( + const Function& function) { + switch (RecognizeKind(function)) { + case MethodRecognizer::kDoubleFromInteger: + case MethodRecognizer::kMathMin: + case MethodRecognizer::kMathMax: + return 2; + default: + return 0; + } +} + intptr_t MethodRecognizer::ResultCid(const Function& function) { switch (function.recognized_kind()) { #define DEFINE_CASE(cname, fname, ename, result_type, fingerprint) \ diff --git a/runtime/vm/compiler/method_recognizer.h b/runtime/vm/compiler/method_recognizer.h index e877f49b7e1..592c7c22605 100644 --- a/runtime/vm/compiler/method_recognizer.h +++ b/runtime/vm/compiler/method_recognizer.h @@ -560,6 +560,7 @@ class MethodRecognizer : public AllStatic { static Kind RecognizeKind(const Function& function); static bool AlwaysInline(const Function& function); static bool PolymorphicTarget(const Function& function); + static intptr_t NumArgsCheckedForStaticCall(const Function& function); static intptr_t ResultCid(const Function& function); static intptr_t MethodKindToReceiverCid(Kind kind); static const char* KindToCString(Kind kind); diff --git a/runtime/vm/constants_kbc.h b/runtime/vm/constants_kbc.h index e6bdae66051..45f1aff1a0b 100644 --- a/runtime/vm/constants_kbc.h +++ b/runtime/vm/constants_kbc.h @@ -164,7 +164,13 @@ namespace dart { // SP[-(1+ArgC)], ..., SP[-1] and argument descriptor PP[D], which // indicates whether the first argument is a type argument vector. // -// - InstanceCall ArgC, D; InstanceCallOpt ArgC, D +// - InstanceCall ArgC, D +// +// Lookup and invoke method using ICData in PP[D] +// with arguments SP[-(1+ArgC)], ..., SP[-1]. +// The ICData indicates whether the first argument is a type argument vector. +// +// - InstanceCallOpt ArgC, D // // Lookup and invoke method with N checked arguments using ICData in PP[D] // with arguments SP[-(1+ArgC)], ..., SP[-1]. @@ -815,8 +821,7 @@ namespace dart { V(PopLocal, X, xeg, ___, ___) \ V(IndirectStaticCall, A_D, num, num, ___) \ V(StaticCall, A_D, num, num, ___) \ - V(InstanceCall1, A_D, num, num, ___) \ - V(InstanceCall2, A_D, num, num, ___) \ + V(InstanceCall, A_D, num, num, ___) \ V(InstanceCall1Opt, A_D, num, num, ___) \ V(InstanceCall2Opt, A_D, num, num, ___) \ V(PushPolymorphicInstanceCall, A_D, num, num, ___) \ @@ -1079,8 +1084,7 @@ class KernelBytecode { switch (DecodeOpcode(instr)) { case KernelBytecode::kStaticCall: case KernelBytecode::kIndirectStaticCall: - case KernelBytecode::kInstanceCall1: - case KernelBytecode::kInstanceCall2: + case KernelBytecode::kInstanceCall: case KernelBytecode::kInstanceCall1Opt: case KernelBytecode::kInstanceCall2Opt: case KernelBytecode::kDebugBreak: diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc index eca3dd99133..a1ba31b2505 100644 --- a/runtime/vm/interpreter.cc +++ b/runtime/vm/interpreter.cc @@ -2340,7 +2340,7 @@ RawObject* Interpreter::Call(RawFunction* function, } { - BYTECODE(InstanceCall1, A_D); + BYTECODE(InstanceCall, A_D); // Check if single stepping. if (thread->isolate()->single_step()) { @@ -2359,36 +2359,18 @@ RawObject* Interpreter::Call(RawFunction* function, RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx)); InterpreterHelpers::IncrementUsageCounter( RAW_CAST(Function, icdata->ptr()->owner_)); - if (!InstanceCall1(thread, icdata, call_base, call_top, &pc, &FP, &SP, - false /* optimized */)) { - HANDLE_EXCEPTION; - } - } - - DISPATCH(); - } - - { - BYTECODE(InstanceCall2, A_D); - if (thread->isolate()->single_step()) { - Exit(thread, FP, SP + 1, pc); - NativeArguments args(thread, 0, NULL, NULL); - INVOKE_RUNTIME(DRT_SingleStepHandler, args); - } - - { - const uint16_t argc = rA; - const uint16_t kidx = rD; - - RawObject** call_base = SP - argc + 1; - RawObject** call_top = SP + 1; - - RawICData* icdata = RAW_CAST(ICData, LOAD_CONSTANT(kidx)); - InterpreterHelpers::IncrementUsageCounter( - RAW_CAST(Function, icdata->ptr()->owner_)); - if (!InstanceCall2(thread, icdata, call_base, call_top, &pc, &FP, &SP, - false /* optimized */)) { - HANDLE_EXCEPTION; + if (ICData::NumArgsTestedBits::decode(icdata->ptr()->state_bits_) == 1) { + if (!InstanceCall1(thread, icdata, call_base, call_top, &pc, &FP, &SP, + false /* optimized */)) { + HANDLE_EXCEPTION; + } + } else { + ASSERT(ICData::NumArgsTestedBits::decode(icdata->ptr()->state_bits_) == + 2); + if (!InstanceCall2(thread, icdata, call_base, call_top, &pc, &FP, &SP, + false /* optimized */)) { + HANDLE_EXCEPTION; + } } } diff --git a/runtime/vm/object.h b/runtime/vm/object.h index ccf54fee2ab..f05ca7f7fcd 100644 --- a/runtime/vm/object.h +++ b/runtime/vm/object.h @@ -2118,6 +2118,7 @@ class ICData : public Object { FINAL_HEAP_OBJECT_IMPLEMENTATION(ICData, Object); friend class Class; + friend class Interpreter; friend class SnapshotWriter; friend class Serializer; friend class Deserializer;