[vm/kernel/bytecode] Fix number of checked arguments in bytecode calls
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 <regis@google.com>
Reviewed-by: Zach Anderson <zra@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
diff --git a/pkg/vm/lib/bytecode/assembler.dart b/pkg/vm/lib/bytecode/assembler.dart
index aec44bf..bc3f8ac 100644
--- a/pkg/vm/lib/bytecode/assembler.dart
+++ b/pkg/vm/lib/bytecode/assembler.dart
@@ -232,12 +232,8 @@
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 809c47c..5ca0253 100644
--- a/pkg/vm/lib/bytecode/dbc.dart
+++ b/pkg/vm/lib/bytecode/dbc.dart
@@ -34,6 +34,9 @@
// 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 @@
kPopLocal,
kIndirectStaticCall,
kStaticCall,
- kInstanceCall1,
- kInstanceCall2,
+ kInstanceCall,
kInstanceCall1Opt,
kInstanceCall2Opt,
kPushPolymorphicInstanceCall,
@@ -316,9 +318,7 @@
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 f30fca6..0892e67 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -577,7 +577,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
_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 @@
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 3b0bcbc..3f5cf69 100644
--- a/pkg/vm/testcases/bytecode/asserts.dart.expect
+++ b/pkg/vm/testcases/bytecode/asserts.dart.expect
@@ -38,7 +38,7 @@
CheckStack
JumpIfNoAsserts L1
Push FP[-6]
- InstanceCall1 1, CP#1
+ InstanceCall 1, CP#1
AssertBoolean 0
PushConstant CP#2
IfEqStrictTOS
@@ -46,7 +46,7 @@
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 25ce727..26fbf21 100644
--- a/pkg/vm/testcases/bytecode/async.dart.expect
+++ b/pkg/vm/testcases/bytecode/async.dart.expect
@@ -137,7 +137,7 @@
LoadContextVar 6
Push r8
Push r9
- InstanceCall1 3, CP#19
+ InstanceCall 3, CP#19
Drop1
Jump L3
L3:
@@ -245,7 +245,7 @@
Drop1
Push r0
LoadContextVar 6
- InstanceCall1 1, CP#33
+ InstanceCall 1, CP#33
ReturnTOS
Push r0
LoadContextParent
@@ -346,7 +346,7 @@
Drop1
Push r0
LoadContextVar 3
- InstanceCall1 1, CP#27
+ InstanceCall 1, CP#27
ReturnTOS
Push r0
LoadContextParent
@@ -432,7 +432,7 @@
LoadContextVar 3
Push r8
Push r9
- InstanceCall1 3, CP#13
+ InstanceCall 3, CP#13
Drop1
Jump L3
L3:
@@ -556,7 +556,7 @@
Drop1
Push r0
LoadContextVar 8
- InstanceCall1 1, CP#32
+ InstanceCall 1, CP#32
ReturnTOS
Push r0
LoadContextParent
@@ -680,7 +680,7 @@
Push r4
LoadContextVar 6
Push r1
- InstanceCall1 2, CP#14
+ InstanceCall 2, CP#14
StoreContextVar 7
Jump L4
L4:
@@ -712,7 +712,7 @@
LoadContextVar 8
Push r8
Push r9
- InstanceCall1 3, CP#18
+ InstanceCall 3, CP#18
Drop1
Jump L5
L5:
@@ -848,7 +848,7 @@
Drop1
Push r0
LoadContextVar 9
- InstanceCall1 1, CP#44
+ InstanceCall 1, CP#44
ReturnTOS
Push r0
LoadContextParent
@@ -946,7 +946,7 @@
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 @@
LoadContextParent
LoadContextParent
LoadContextVar 0
- InstanceCall1 1, CP#12
+ InstanceCall 1, CP#12
PopLocal r8
Push r4
Push r8
@@ -973,7 +973,7 @@
Push r4
LoadContextVar 0
StoreLocal r8
- InstanceCall1 1, CP#13
+ InstanceCall 1, CP#13
PushConstant CP#11
IfNeStrictTOS
Jump L3
@@ -985,7 +985,7 @@
PopLocal r4
Push r4
Push r8
- InstanceCall1 1, CP#14
+ InstanceCall 1, CP#14
StoreContextVar 0
Push r4
LoadContextParent
@@ -1009,7 +1009,7 @@
LoadContextVar 0
Push r4
LoadContextVar 0
- InstanceCall1 2, CP#15
+ InstanceCall 2, CP#15
StoreContextVar 3
Push r4
LoadContextParent
@@ -1074,8 +1074,8 @@
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 @@
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 @@
CheckStack
Push r8
PushConstant CP#8
- InstanceCall1 2, CP#24
+ InstanceCall 2, CP#24
AssertBoolean 0
PushConstant CP#11
IfNeStrictTOS
@@ -1117,11 +1117,11 @@
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 @@
LoadContextVar 9
Push r8
Push r9
- InstanceCall1 3, CP#30
+ InstanceCall 3, CP#30
Drop1
Jump L10
L10:
@@ -1324,7 +1324,7 @@
Drop1
Push r0
LoadContextVar 12
- InstanceCall1 1, CP#50
+ InstanceCall 1, CP#50
ReturnTOS
Push r0
LoadContextParent
@@ -1467,7 +1467,7 @@
LoadContextParent
LoadContextVar 2
Push r1
- InstanceCall1 2, CP#12
+ InstanceCall 2, CP#12
StoreContextVar 0
Jump L3
Try #2 end:
@@ -1502,7 +1502,7 @@
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 @@
LoadContextParent
LoadContextVar 2
Push r1
- InstanceCall1 2, CP#20
+ InstanceCall 2, CP#20
StoreContextVar 0
Push r4
LoadContextParent
@@ -1650,7 +1650,7 @@
LoadContextParent
LoadContextVar 2
Push r1
- InstanceCall1 2, CP#25
+ InstanceCall 2, CP#25
StoreContextVar 0
Push r4
LoadContextParent
@@ -1722,7 +1722,7 @@
LoadContextParent
LoadContextVar 2
Push r1
- InstanceCall1 2, CP#29
+ InstanceCall 2, CP#29
StoreContextVar 0
Push r4
LoadContextParent
@@ -1791,7 +1791,7 @@
LoadContextParent
LoadContextVar 2
Push r1
- InstanceCall1 2, CP#33
+ InstanceCall 2, CP#33
StoreContextVar 0
Push r4
LoadContextParent
@@ -1834,7 +1834,7 @@
LoadContextVar 12
Push r8
Push r9
- InstanceCall1 3, CP#36
+ InstanceCall 3, CP#36
Drop1
Jump L12
L12:
@@ -2086,7 +2086,7 @@
LoadContextVar 0
Push r4
LoadContextVar 0
- InstanceCall1 2, CP#16
+ InstanceCall 2, CP#16
StoreContextVar 7
Jump L3
Jump L4
@@ -2165,7 +2165,7 @@
LoadContextVar 8
Push r8
Push r9
- InstanceCall1 3, CP#24
+ InstanceCall 3, CP#24
Drop1
Jump L6
L6:
@@ -2260,7 +2260,7 @@
Drop1
Push r0
LoadContextVar 8
- InstanceCall1 1, CP#38
+ InstanceCall 1, CP#38
ReturnTOS
Push r0
LoadContextParent
@@ -2392,7 +2392,7 @@
Drop1
Push r0
LoadContextVar 7
- InstanceCall1 1, CP#34
+ InstanceCall 1, CP#34
ReturnTOS
Push r0
LoadContextParent
@@ -2488,7 +2488,7 @@
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 @@
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 49ae297..16c0efe 100644
--- a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
+++ b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
@@ -122,7 +122,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 cf90561..c3eba73 100644
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ b/pkg/vm/testcases/bytecode/closures.dart.expect
@@ -220,11 +220,11 @@
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 @@
StoreFieldTOS CP#1
PopLocal r3
Push r3
- InstanceCall1 1, CP#43
+ InstanceCall 1, CP#43
Drop1
PushConstant CP#18
ReturnTOS
@@ -445,11 +445,11 @@
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 @@
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 @@
StoreFieldTOS CP#4
PopLocal r2
Push r2
- InstanceCall1 1, CP#43
+ InstanceCall 1, CP#43
Drop1
Push r0
LoadContextParent
@@ -658,7 +658,7 @@
LoadContextParent
LoadContextVar 0
PushConstant CP#1
- InstanceCall1 2, CP#17
+ InstanceCall 2, CP#17
StoreContextVar 0
Push r0
Push r0
@@ -667,11 +667,11 @@
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 @@
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 @@
StoreFieldTOS CP#4
PopLocal r3
Push r3
- InstanceCall1 1, CP#29
+ InstanceCall 1, CP#29
Drop1
Push r0
LoadContextVar 0
@@ -776,7 +776,7 @@
LoadContextVar 0
Push r0
LoadContextVar 0
- InstanceCall1 2, CP#41
+ InstanceCall 2, CP#41
Drop1
PushConstant CP#6
ReturnTOS
@@ -881,7 +881,7 @@
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 @@
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 @@
Push r3
Push r0
StoreFieldTOS CP#9
- InstanceCall1 2, CP#28
+ InstanceCall 2, CP#28
Drop1
Push r0
CloneContext
@@ -927,7 +927,7 @@
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 @@
Push r0
LoadContextParent
LoadContextVar 0
- InstanceCall1 2, CP#11
+ InstanceCall 2, CP#11
ReturnTOS
PushConstant CP#12
ReturnTOS
@@ -1012,7 +1012,7 @@
Push r0
LoadContextParent
LoadContextVar 0
- InstanceCall1 2, CP#26
+ InstanceCall 2, CP#26
StoreContextVar 0
PushConstant CP#12
ReturnTOS
@@ -1041,12 +1041,12 @@
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 @@
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 @@
StoreFieldTOS CP#10
PopLocal r3
Push r3
- InstanceCall1 1, CP#23
+ InstanceCall 1, CP#23
Drop1
Push r0
LoadContextVar 0
@@ -1128,7 +1128,7 @@
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 @@
PopLocal r2
Push r2
PushConstant CP#18
- InstanceCall1 2, CP#19
+ InstanceCall 2, CP#19
Drop1
Push r0
LoadContextVar 0
@@ -1315,7 +1315,7 @@
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 @@
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 @@
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 @@
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 cb6efea..1522863 100644
--- a/pkg/vm/testcases/bytecode/field_initializers.dart.expect
+++ b/pkg/vm/testcases/bytecode/field_initializers.dart.expect
@@ -57,7 +57,7 @@
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 @@
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 d533ada..b997fdf 100644
--- a/pkg/vm/testcases/bytecode/literals.dart.expect
+++ b/pkg/vm/testcases/bytecode/literals.dart.expect
@@ -170,12 +170,12 @@
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 @@
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 @@
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 17a68e1..4112fe8 100644
--- a/pkg/vm/testcases/bytecode/loops.dart.expect
+++ b/pkg/vm/testcases/bytecode/loops.dart.expect
@@ -14,8 +14,8 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 90ddf06..d0e8cf4 100644
--- a/pkg/vm/testcases/bytecode/super_calls.dart.expect
+++ b/pkg/vm/testcases/bytecode/super_calls.dart.expect
@@ -190,7 +190,7 @@
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 @@
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 a7d303b..ed998c2 100644
--- a/pkg/vm/testcases/bytecode/switch.dart.expect
+++ b/pkg/vm/testcases/bytecode/switch.dart.expect
@@ -12,19 +12,19 @@
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 @@
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 @@
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 c0fd1bb..8690f11 100644
--- a/pkg/vm/testcases/bytecode/try_blocks.dart.expect
+++ b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
@@ -82,7 +82,7 @@
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 @@
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 @@
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 @@
StoreFieldTOS CP#3
PopLocal r4
Push r4
- InstanceCall1 1, CP#20
+ InstanceCall 1, CP#20
Drop1
Push r0
LoadContextVar 0
@@ -476,7 +476,7 @@
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 @@
CheckStack
Push r0
PushConstant CP#1
- InstanceCall1 2, CP#3
+ InstanceCall 2, CP#3
AssertBoolean 0
PushConstant CP#4
IfNeStrictTOS
@@ -676,7 +676,7 @@
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 @@
Drop1
Push r0
PushConstant CP#12
- InstanceCall1 2, CP#13
+ InstanceCall 2, CP#13
StoreLocal r0
Drop1
Jump L5
@@ -763,13 +763,13 @@
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 @@
StoreFieldTOS CP#13
PopLocal r7
Push r7
- InstanceCall1 1, CP#26
+ InstanceCall 1, CP#26
Drop1
Jump L4
Jump L5
@@ -1042,7 +1042,7 @@
IndirectStaticCall 1, CP#5
Drop1
Push r2
- InstanceCall1 1, CP#34
+ InstanceCall 1, CP#34
Drop1
Push r3
Push r4
@@ -1056,7 +1056,7 @@
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 bf04a31..c0628ce 100644
--- a/pkg/vm/testcases/bytecode/type_ops.dart.expect
+++ b/pkg/vm/testcases/bytecode/type_ops.dart.expect
@@ -110,7 +110,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 b5629ec..952d27c 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -2717,18 +2717,8 @@
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 9b05506..69d4736 100644
--- a/runtime/vm/compiler/assembler/disassembler_kbc.cc
+++ b/runtime/vm/compiler/assembler/disassembler_kbc.cc
@@ -212,8 +212,7 @@
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 52f3f18..3c6a665 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -4119,18 +4119,8 @@
(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 3dd64c7..5c978e9 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -200,10 +200,17 @@
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 @@
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 ecc20f6..70def2a 100644
--- a/runtime/vm/compiler/method_recognizer.cc
+++ b/runtime/vm/compiler/method_recognizer.cc
@@ -22,6 +22,18 @@
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 e877f49..592c7c2 100644
--- a/runtime/vm/compiler/method_recognizer.h
+++ b/runtime/vm/compiler/method_recognizer.h
@@ -560,6 +560,7 @@
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 e6bdae6..45f1aff 100644
--- a/runtime/vm/constants_kbc.h
+++ b/runtime/vm/constants_kbc.h
@@ -164,7 +164,13 @@
// SP[-(1+ArgC)], ..., SP[-1] and argument descriptor PP[D], which
// indicates whether the first argument is a type argument vector.
//
-// - InstanceCall<N> ArgC, D; InstanceCall<N>Opt 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.
+//
+// - InstanceCall<N>Opt 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 @@
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 @@
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 eca3dd9..a1ba31b 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -2340,7 +2340,7 @@
}
{
- BYTECODE(InstanceCall1, A_D);
+ BYTECODE(InstanceCall, A_D);
// Check if single stepping.
if (thread->isolate()->single_step()) {
@@ -2359,36 +2359,18 @@
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 ccf54fe..f05ca7f 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2118,6 +2118,7 @@
FINAL_HEAP_OBJECT_IMPLEMENTATION(ICData, Object);
friend class Class;
+ friend class Interpreter;
friend class SnapshotWriter;
friend class Serializer;
friend class Deserializer;