| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/execution.h" | 7 #include "src/execution.h" |
| 8 #include "src/handles.h" | 8 #include "src/handles.h" |
| 9 #include "src/interpreter/bytecode-array-builder.h" | 9 #include "src/interpreter/bytecode-array-builder.h" |
| 10 #include "src/interpreter/interpreter.h" | 10 #include "src/interpreter/interpreter.h" |
| (...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 416 HandleAndZoneScope handles; | 416 HandleAndZoneScope handles; |
| 417 i::Factory* factory = handles.main_isolate()->factory(); | 417 i::Factory* factory = handles.main_isolate()->factory(); |
| 418 BytecodeArrayBuilder builder(handles.main_isolate(), | 418 BytecodeArrayBuilder builder(handles.main_isolate(), |
| 419 handles.main_zone(), 1, 0, 1); | 419 handles.main_zone(), 1, 0, 1); |
| 420 Register reg(0); | 420 Register reg(0); |
| 421 int lhs = lhs_inputs[l]; | 421 int lhs = lhs_inputs[l]; |
| 422 int rhs = rhs_inputs[r]; | 422 int rhs = rhs_inputs[r]; |
| 423 builder.LoadLiteral(Smi::FromInt(lhs)) | 423 builder.LoadLiteral(Smi::FromInt(lhs)) |
| 424 .StoreAccumulatorInRegister(reg) | 424 .StoreAccumulatorInRegister(reg) |
| 425 .LoadLiteral(Smi::FromInt(rhs)) | 425 .LoadLiteral(Smi::FromInt(rhs)) |
| 426 .BinaryOperation(kShiftOperators[o], reg, Strength::WEAK) | 426 .BinaryOperation(kShiftOperators[o], reg) |
| 427 .Return(); | 427 .Return(); |
| 428 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 428 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 429 | 429 |
| 430 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 430 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 431 auto callable = tester.GetCallable<>(); | 431 auto callable = tester.GetCallable<>(); |
| 432 Handle<Object> return_value = callable().ToHandleChecked(); | 432 Handle<Object> return_value = callable().ToHandleChecked(); |
| 433 Handle<Object> expected_value = | 433 Handle<Object> expected_value = |
| 434 factory->NewNumber(BinaryOpC(kShiftOperators[o], lhs, rhs)); | 434 factory->NewNumber(BinaryOpC(kShiftOperators[o], lhs, rhs)); |
| 435 CHECK(return_value->SameValue(*expected_value)); | 435 CHECK(return_value->SameValue(*expected_value)); |
| 436 } | 436 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 448 HandleAndZoneScope handles; | 448 HandleAndZoneScope handles; |
| 449 i::Factory* factory = handles.main_isolate()->factory(); | 449 i::Factory* factory = handles.main_isolate()->factory(); |
| 450 BytecodeArrayBuilder builder(handles.main_isolate(), | 450 BytecodeArrayBuilder builder(handles.main_isolate(), |
| 451 handles.main_zone(), 1, 0, 1); | 451 handles.main_zone(), 1, 0, 1); |
| 452 Register reg(0); | 452 Register reg(0); |
| 453 int lhs = lhs_inputs[l]; | 453 int lhs = lhs_inputs[l]; |
| 454 int rhs = rhs_inputs[r]; | 454 int rhs = rhs_inputs[r]; |
| 455 builder.LoadLiteral(Smi::FromInt(lhs)) | 455 builder.LoadLiteral(Smi::FromInt(lhs)) |
| 456 .StoreAccumulatorInRegister(reg) | 456 .StoreAccumulatorInRegister(reg) |
| 457 .LoadLiteral(Smi::FromInt(rhs)) | 457 .LoadLiteral(Smi::FromInt(rhs)) |
| 458 .BinaryOperation(kArithmeticOperators[o], reg, Strength::WEAK) | 458 .BinaryOperation(kArithmeticOperators[o], reg) |
| 459 .Return(); | 459 .Return(); |
| 460 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 460 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 461 | 461 |
| 462 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 462 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 463 auto callable = tester.GetCallable<>(); | 463 auto callable = tester.GetCallable<>(); |
| 464 Handle<Object> return_value = callable().ToHandleChecked(); | 464 Handle<Object> return_value = callable().ToHandleChecked(); |
| 465 Handle<Object> expected_value = | 465 Handle<Object> expected_value = |
| 466 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs)); | 466 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs)); |
| 467 CHECK(return_value->SameValue(*expected_value)); | 467 CHECK(return_value->SameValue(*expected_value)); |
| 468 } | 468 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 481 HandleAndZoneScope handles; | 481 HandleAndZoneScope handles; |
| 482 i::Factory* factory = handles.main_isolate()->factory(); | 482 i::Factory* factory = handles.main_isolate()->factory(); |
| 483 BytecodeArrayBuilder builder(handles.main_isolate(), | 483 BytecodeArrayBuilder builder(handles.main_isolate(), |
| 484 handles.main_zone(), 1, 0, 1); | 484 handles.main_zone(), 1, 0, 1); |
| 485 Register reg(0); | 485 Register reg(0); |
| 486 double lhs = lhs_inputs[l]; | 486 double lhs = lhs_inputs[l]; |
| 487 double rhs = rhs_inputs[r]; | 487 double rhs = rhs_inputs[r]; |
| 488 builder.LoadLiteral(factory->NewNumber(lhs)) | 488 builder.LoadLiteral(factory->NewNumber(lhs)) |
| 489 .StoreAccumulatorInRegister(reg) | 489 .StoreAccumulatorInRegister(reg) |
| 490 .LoadLiteral(factory->NewNumber(rhs)) | 490 .LoadLiteral(factory->NewNumber(rhs)) |
| 491 .BinaryOperation(kArithmeticOperators[o], reg, Strength::WEAK) | 491 .BinaryOperation(kArithmeticOperators[o], reg) |
| 492 .Return(); | 492 .Return(); |
| 493 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 493 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 494 | 494 |
| 495 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 495 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 496 auto callable = tester.GetCallable<>(); | 496 auto callable = tester.GetCallable<>(); |
| 497 Handle<Object> return_value = callable().ToHandleChecked(); | 497 Handle<Object> return_value = callable().ToHandleChecked(); |
| 498 Handle<Object> expected_value = | 498 Handle<Object> expected_value = |
| 499 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs)); | 499 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs)); |
| 500 CHECK(return_value->SameValue(*expected_value)); | 500 CHECK(return_value->SameValue(*expected_value)); |
| 501 } | 501 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 536 factory->NewStringFromStaticChars("2.5")}, | 536 factory->NewStringFromStaticChars("2.5")}, |
| 537 }; | 537 }; |
| 538 | 538 |
| 539 for (size_t i = 0; i < arraysize(test_cases); i++) { | 539 for (size_t i = 0; i < arraysize(test_cases); i++) { |
| 540 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, | 540 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 1, |
| 541 0, 1); | 541 0, 1); |
| 542 Register reg(0); | 542 Register reg(0); |
| 543 builder.LoadLiteral(test_cases[i].lhs) | 543 builder.LoadLiteral(test_cases[i].lhs) |
| 544 .StoreAccumulatorInRegister(reg) | 544 .StoreAccumulatorInRegister(reg) |
| 545 .LoadLiteral(test_cases[i].rhs) | 545 .LoadLiteral(test_cases[i].rhs) |
| 546 .BinaryOperation(Token::Value::ADD, reg, Strength::WEAK) | 546 .BinaryOperation(Token::Value::ADD, reg) |
| 547 .Return(); | 547 .Return(); |
| 548 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 548 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 549 | 549 |
| 550 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 550 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 551 auto callable = tester.GetCallable<>(); | 551 auto callable = tester.GetCallable<>(); |
| 552 Handle<Object> return_value = callable().ToHandleChecked(); | 552 Handle<Object> return_value = callable().ToHandleChecked(); |
| 553 CHECK(return_value->SameValue(*test_cases[i].expected_value)); | 553 CHECK(return_value->SameValue(*test_cases[i].expected_value)); |
| 554 } | 554 } |
| 555 } | 555 } |
| 556 | 556 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 575 .ToHandleChecked(); | 575 .ToHandleChecked(); |
| 576 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(3)); | 576 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(3)); |
| 577 } | 577 } |
| 578 | 578 |
| 579 | 579 |
| 580 TEST(InterpreterParameter8) { | 580 TEST(InterpreterParameter8) { |
| 581 HandleAndZoneScope handles; | 581 HandleAndZoneScope handles; |
| 582 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 8, | 582 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 8, |
| 583 0, 0); | 583 0, 0); |
| 584 builder.LoadAccumulatorWithRegister(builder.Parameter(0)) | 584 builder.LoadAccumulatorWithRegister(builder.Parameter(0)) |
| 585 .BinaryOperation(Token::Value::ADD, builder.Parameter(1), Strength::WEAK) | 585 .BinaryOperation(Token::Value::ADD, builder.Parameter(1)) |
| 586 .BinaryOperation(Token::Value::ADD, builder.Parameter(2), Strength::WEAK) | 586 .BinaryOperation(Token::Value::ADD, builder.Parameter(2)) |
| 587 .BinaryOperation(Token::Value::ADD, builder.Parameter(3), Strength::WEAK) | 587 .BinaryOperation(Token::Value::ADD, builder.Parameter(3)) |
| 588 .BinaryOperation(Token::Value::ADD, builder.Parameter(4), Strength::WEAK) | 588 .BinaryOperation(Token::Value::ADD, builder.Parameter(4)) |
| 589 .BinaryOperation(Token::Value::ADD, builder.Parameter(5), Strength::WEAK) | 589 .BinaryOperation(Token::Value::ADD, builder.Parameter(5)) |
| 590 .BinaryOperation(Token::Value::ADD, builder.Parameter(6), Strength::WEAK) | 590 .BinaryOperation(Token::Value::ADD, builder.Parameter(6)) |
| 591 .BinaryOperation(Token::Value::ADD, builder.Parameter(7), Strength::WEAK) | 591 .BinaryOperation(Token::Value::ADD, builder.Parameter(7)) |
| 592 .Return(); | 592 .Return(); |
| 593 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 593 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 594 | 594 |
| 595 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 595 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 596 typedef Handle<Object> H; | 596 typedef Handle<Object> H; |
| 597 auto callable = tester.GetCallable<H, H, H, H, H, H, H, H>(); | 597 auto callable = tester.GetCallable<H, H, H, H, H, H, H, H>(); |
| 598 | 598 |
| 599 Handle<Smi> arg1 = Handle<Smi>(Smi::FromInt(1), handles.main_isolate()); | 599 Handle<Smi> arg1 = Handle<Smi>(Smi::FromInt(1), handles.main_isolate()); |
| 600 Handle<Smi> arg2 = Handle<Smi>(Smi::FromInt(2), handles.main_isolate()); | 600 Handle<Smi> arg2 = Handle<Smi>(Smi::FromInt(2), handles.main_isolate()); |
| 601 Handle<Smi> arg3 = Handle<Smi>(Smi::FromInt(3), handles.main_isolate()); | 601 Handle<Smi> arg3 = Handle<Smi>(Smi::FromInt(3), handles.main_isolate()); |
| (...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1073 .StoreAccumulatorInRegister(reg) | 1073 .StoreAccumulatorInRegister(reg) |
| 1074 .LoadAccumulatorWithRegister(scratch); | 1074 .LoadAccumulatorWithRegister(scratch); |
| 1075 } | 1075 } |
| 1076 | 1076 |
| 1077 | 1077 |
| 1078 static BytecodeArrayBuilder& IncrementRegister(BytecodeArrayBuilder& builder, | 1078 static BytecodeArrayBuilder& IncrementRegister(BytecodeArrayBuilder& builder, |
| 1079 Register reg, int value, | 1079 Register reg, int value, |
| 1080 Register scratch) { | 1080 Register scratch) { |
| 1081 return builder.StoreAccumulatorInRegister(scratch) | 1081 return builder.StoreAccumulatorInRegister(scratch) |
| 1082 .LoadLiteral(Smi::FromInt(value)) | 1082 .LoadLiteral(Smi::FromInt(value)) |
| 1083 .BinaryOperation(Token::Value::ADD, reg, Strength::WEAK) | 1083 .BinaryOperation(Token::Value::ADD, reg) |
| 1084 .StoreAccumulatorInRegister(reg) | 1084 .StoreAccumulatorInRegister(reg) |
| 1085 .LoadAccumulatorWithRegister(scratch); | 1085 .LoadAccumulatorWithRegister(scratch); |
| 1086 } | 1086 } |
| 1087 | 1087 |
| 1088 | 1088 |
| 1089 TEST(InterpreterJumps) { | 1089 TEST(InterpreterJumps) { |
| 1090 HandleAndZoneScope handles; | 1090 HandleAndZoneScope handles; |
| 1091 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 0, | 1091 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 0, |
| 1092 0, 2); | 1092 0, 2); |
| 1093 Register reg(0), scratch(1); | 1093 Register reg(0), scratch(1); |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1233 Token::Value comparison = kComparisonTypes[c]; | 1233 Token::Value comparison = kComparisonTypes[c]; |
| 1234 for (size_t i = 0; i < arraysize(inputs); i++) { | 1234 for (size_t i = 0; i < arraysize(inputs); i++) { |
| 1235 for (size_t j = 0; j < arraysize(inputs); j++) { | 1235 for (size_t j = 0; j < arraysize(inputs); j++) { |
| 1236 HandleAndZoneScope handles; | 1236 HandleAndZoneScope handles; |
| 1237 BytecodeArrayBuilder builder(handles.main_isolate(), | 1237 BytecodeArrayBuilder builder(handles.main_isolate(), |
| 1238 handles.main_zone(), 0, 0, 1); | 1238 handles.main_zone(), 0, 0, 1); |
| 1239 Register r0(0); | 1239 Register r0(0); |
| 1240 builder.LoadLiteral(Smi::FromInt(inputs[i])) | 1240 builder.LoadLiteral(Smi::FromInt(inputs[i])) |
| 1241 .StoreAccumulatorInRegister(r0) | 1241 .StoreAccumulatorInRegister(r0) |
| 1242 .LoadLiteral(Smi::FromInt(inputs[j])) | 1242 .LoadLiteral(Smi::FromInt(inputs[j])) |
| 1243 .CompareOperation(comparison, r0, Strength::WEAK) | 1243 .CompareOperation(comparison, r0) |
| 1244 .Return(); | 1244 .Return(); |
| 1245 | 1245 |
| 1246 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1246 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 1247 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1247 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 1248 auto callable = tester.GetCallable<>(); | 1248 auto callable = tester.GetCallable<>(); |
| 1249 Handle<Object> return_value = callable().ToHandleChecked(); | 1249 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1250 CHECK(return_value->IsBoolean()); | 1250 CHECK(return_value->IsBoolean()); |
| 1251 CHECK_EQ(return_value->BooleanValue(), | 1251 CHECK_EQ(return_value->BooleanValue(), |
| 1252 CompareC(comparison, inputs[i], inputs[j])); | 1252 CompareC(comparison, inputs[i], inputs[j])); |
| 1253 } | 1253 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1269 for (size_t i = 0; i < arraysize(inputs); i++) { | 1269 for (size_t i = 0; i < arraysize(inputs); i++) { |
| 1270 for (size_t j = 0; j < arraysize(inputs); j++) { | 1270 for (size_t j = 0; j < arraysize(inputs); j++) { |
| 1271 HandleAndZoneScope handles; | 1271 HandleAndZoneScope handles; |
| 1272 i::Factory* factory = handles.main_isolate()->factory(); | 1272 i::Factory* factory = handles.main_isolate()->factory(); |
| 1273 BytecodeArrayBuilder builder(handles.main_isolate(), | 1273 BytecodeArrayBuilder builder(handles.main_isolate(), |
| 1274 handles.main_zone(), 0, 0, 1); | 1274 handles.main_zone(), 0, 0, 1); |
| 1275 Register r0(0); | 1275 Register r0(0); |
| 1276 builder.LoadLiteral(factory->NewHeapNumber(inputs[i])) | 1276 builder.LoadLiteral(factory->NewHeapNumber(inputs[i])) |
| 1277 .StoreAccumulatorInRegister(r0) | 1277 .StoreAccumulatorInRegister(r0) |
| 1278 .LoadLiteral(factory->NewHeapNumber(inputs[j])) | 1278 .LoadLiteral(factory->NewHeapNumber(inputs[j])) |
| 1279 .CompareOperation(comparison, r0, Strength::WEAK) | 1279 .CompareOperation(comparison, r0) |
| 1280 .Return(); | 1280 .Return(); |
| 1281 | 1281 |
| 1282 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1282 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 1283 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1283 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 1284 auto callable = tester.GetCallable<>(); | 1284 auto callable = tester.GetCallable<>(); |
| 1285 Handle<Object> return_value = callable().ToHandleChecked(); | 1285 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1286 CHECK(return_value->IsBoolean()); | 1286 CHECK(return_value->IsBoolean()); |
| 1287 CHECK_EQ(return_value->BooleanValue(), | 1287 CHECK_EQ(return_value->BooleanValue(), |
| 1288 CompareC(comparison, inputs[i], inputs[j])); | 1288 CompareC(comparison, inputs[i], inputs[j])); |
| 1289 } | 1289 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1302 const char* lhs = inputs[i].c_str(); | 1302 const char* lhs = inputs[i].c_str(); |
| 1303 const char* rhs = inputs[j].c_str(); | 1303 const char* rhs = inputs[j].c_str(); |
| 1304 HandleAndZoneScope handles; | 1304 HandleAndZoneScope handles; |
| 1305 i::Factory* factory = handles.main_isolate()->factory(); | 1305 i::Factory* factory = handles.main_isolate()->factory(); |
| 1306 BytecodeArrayBuilder builder(handles.main_isolate(), | 1306 BytecodeArrayBuilder builder(handles.main_isolate(), |
| 1307 handles.main_zone(), 0, 0, 1); | 1307 handles.main_zone(), 0, 0, 1); |
| 1308 Register r0(0); | 1308 Register r0(0); |
| 1309 builder.LoadLiteral(factory->NewStringFromAsciiChecked(lhs)) | 1309 builder.LoadLiteral(factory->NewStringFromAsciiChecked(lhs)) |
| 1310 .StoreAccumulatorInRegister(r0) | 1310 .StoreAccumulatorInRegister(r0) |
| 1311 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs)) | 1311 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs)) |
| 1312 .CompareOperation(comparison, r0, Strength::WEAK) | 1312 .CompareOperation(comparison, r0) |
| 1313 .Return(); | 1313 .Return(); |
| 1314 | 1314 |
| 1315 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1315 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 1316 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1316 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 1317 auto callable = tester.GetCallable<>(); | 1317 auto callable = tester.GetCallable<>(); |
| 1318 Handle<Object> return_value = callable().ToHandleChecked(); | 1318 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1319 CHECK(return_value->IsBoolean()); | 1319 CHECK(return_value->IsBoolean()); |
| 1320 CHECK_EQ(return_value->BooleanValue(), | 1320 CHECK_EQ(return_value->BooleanValue(), |
| 1321 CompareC(comparison, inputs[i], inputs[j])); | 1321 CompareC(comparison, inputs[i], inputs[j])); |
| 1322 } | 1322 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1348 HandleAndZoneScope handles; | 1348 HandleAndZoneScope handles; |
| 1349 i::Factory* factory = handles.main_isolate()->factory(); | 1349 i::Factory* factory = handles.main_isolate()->factory(); |
| 1350 BytecodeArrayBuilder builder(handles.main_isolate(), | 1350 BytecodeArrayBuilder builder(handles.main_isolate(), |
| 1351 handles.main_zone(), 0, 0, 1); | 1351 handles.main_zone(), 0, 0, 1); |
| 1352 Register r0(0); | 1352 Register r0(0); |
| 1353 if (pass == 0) { | 1353 if (pass == 0) { |
| 1354 // Comparison with HeapNumber on the lhs and String on the rhs | 1354 // Comparison with HeapNumber on the lhs and String on the rhs |
| 1355 builder.LoadLiteral(factory->NewNumber(lhs)) | 1355 builder.LoadLiteral(factory->NewNumber(lhs)) |
| 1356 .StoreAccumulatorInRegister(r0) | 1356 .StoreAccumulatorInRegister(r0) |
| 1357 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs_cstr)) | 1357 .LoadLiteral(factory->NewStringFromAsciiChecked(rhs_cstr)) |
| 1358 .CompareOperation(comparison, r0, Strength::WEAK) | 1358 .CompareOperation(comparison, r0) |
| 1359 .Return(); | 1359 .Return(); |
| 1360 } else { | 1360 } else { |
| 1361 // Comparison with HeapNumber on the rhs and String on the lhs | 1361 // Comparison with HeapNumber on the rhs and String on the lhs |
| 1362 builder.LoadLiteral(factory->NewStringFromAsciiChecked(lhs_cstr)) | 1362 builder.LoadLiteral(factory->NewStringFromAsciiChecked(lhs_cstr)) |
| 1363 .StoreAccumulatorInRegister(r0) | 1363 .StoreAccumulatorInRegister(r0) |
| 1364 .LoadLiteral(factory->NewNumber(rhs)) | 1364 .LoadLiteral(factory->NewNumber(rhs)) |
| 1365 .CompareOperation(comparison, r0, Strength::WEAK) | 1365 .CompareOperation(comparison, r0) |
| 1366 .Return(); | 1366 .Return(); |
| 1367 } | 1367 } |
| 1368 | 1368 |
| 1369 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1369 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 1370 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1370 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 1371 auto callable = tester.GetCallable<>(); | 1371 auto callable = tester.GetCallable<>(); |
| 1372 Handle<Object> return_value = callable().ToHandleChecked(); | 1372 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1373 CHECK(return_value->IsBoolean()); | 1373 CHECK(return_value->IsBoolean()); |
| 1374 CHECK_EQ(return_value->BooleanValue(), | 1374 CHECK_EQ(return_value->BooleanValue(), |
| 1375 CompareC(comparison, lhs, rhs, true)); | 1375 CompareC(comparison, lhs, rhs, true)); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1389 Handle<i::Object> other = factory->NewNumber(3.3333); | 1389 Handle<i::Object> other = factory->NewNumber(3.3333); |
| 1390 Handle<i::Object> cases[] = {Handle<i::Object>::cast(instance), other}; | 1390 Handle<i::Object> cases[] = {Handle<i::Object>::cast(instance), other}; |
| 1391 for (size_t i = 0; i < arraysize(cases); i++) { | 1391 for (size_t i = 0; i < arraysize(cases); i++) { |
| 1392 bool expected_value = (i == 0); | 1392 bool expected_value = (i == 0); |
| 1393 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 0, | 1393 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 0, |
| 1394 0, 1); | 1394 0, 1); |
| 1395 Register r0(0); | 1395 Register r0(0); |
| 1396 builder.LoadLiteral(cases[i]); | 1396 builder.LoadLiteral(cases[i]); |
| 1397 builder.StoreAccumulatorInRegister(r0) | 1397 builder.StoreAccumulatorInRegister(r0) |
| 1398 .LoadLiteral(func) | 1398 .LoadLiteral(func) |
| 1399 .CompareOperation(Token::Value::INSTANCEOF, r0, Strength::WEAK) | 1399 .CompareOperation(Token::Value::INSTANCEOF, r0) |
| 1400 .Return(); | 1400 .Return(); |
| 1401 | 1401 |
| 1402 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1402 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 1403 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1403 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 1404 auto callable = tester.GetCallable<>(); | 1404 auto callable = tester.GetCallable<>(); |
| 1405 Handle<Object> return_value = callable().ToHandleChecked(); | 1405 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1406 CHECK(return_value->IsBoolean()); | 1406 CHECK(return_value->IsBoolean()); |
| 1407 CHECK_EQ(return_value->BooleanValue(), expected_value); | 1407 CHECK_EQ(return_value->BooleanValue(), expected_value); |
| 1408 } | 1408 } |
| 1409 } | 1409 } |
| 1410 | 1410 |
| 1411 | 1411 |
| 1412 TEST(InterpreterTestIn) { | 1412 TEST(InterpreterTestIn) { |
| 1413 HandleAndZoneScope handles; | 1413 HandleAndZoneScope handles; |
| 1414 i::Factory* factory = handles.main_isolate()->factory(); | 1414 i::Factory* factory = handles.main_isolate()->factory(); |
| 1415 // Allocate an array | 1415 // Allocate an array |
| 1416 Handle<i::JSArray> array = | 1416 Handle<i::JSArray> array = |
| 1417 factory->NewJSArray(0, i::ElementsKind::FAST_SMI_ELEMENTS); | 1417 factory->NewJSArray(0, i::ElementsKind::FAST_SMI_ELEMENTS); |
| 1418 // Check for these properties on the array object | 1418 // Check for these properties on the array object |
| 1419 const char* properties[] = {"length", "fuzzle", "x", "0"}; | 1419 const char* properties[] = {"length", "fuzzle", "x", "0"}; |
| 1420 for (size_t i = 0; i < arraysize(properties); i++) { | 1420 for (size_t i = 0; i < arraysize(properties); i++) { |
| 1421 bool expected_value = (i == 0); | 1421 bool expected_value = (i == 0); |
| 1422 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 0, | 1422 BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone(), 0, |
| 1423 0, 1); | 1423 0, 1); |
| 1424 Register r0(0); | 1424 Register r0(0); |
| 1425 builder.LoadLiteral(factory->NewStringFromAsciiChecked(properties[i])) | 1425 builder.LoadLiteral(factory->NewStringFromAsciiChecked(properties[i])) |
| 1426 .StoreAccumulatorInRegister(r0) | 1426 .StoreAccumulatorInRegister(r0) |
| 1427 .LoadLiteral(Handle<Object>::cast(array)) | 1427 .LoadLiteral(Handle<Object>::cast(array)) |
| 1428 .CompareOperation(Token::Value::IN, r0, Strength::WEAK) | 1428 .CompareOperation(Token::Value::IN, r0) |
| 1429 .Return(); | 1429 .Return(); |
| 1430 | 1430 |
| 1431 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1431 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 1432 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1432 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 1433 auto callable = tester.GetCallable<>(); | 1433 auto callable = tester.GetCallable<>(); |
| 1434 Handle<Object> return_value = callable().ToHandleChecked(); | 1434 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1435 CHECK(return_value->IsBoolean()); | 1435 CHECK(return_value->IsBoolean()); |
| 1436 CHECK_EQ(return_value->BooleanValue(), expected_value); | 1436 CHECK_EQ(return_value->BooleanValue(), expected_value); |
| 1437 } | 1437 } |
| 1438 } | 1438 } |
| (...skipping 2719 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4158 Handle<i::Object> return_value = callable().ToHandleChecked(); | 4158 Handle<i::Object> return_value = callable().ToHandleChecked(); |
| 4159 CHECK(return_value->SameValue(*const_decl[i].second)); | 4159 CHECK(return_value->SameValue(*const_decl[i].second)); |
| 4160 } | 4160 } |
| 4161 | 4161 |
| 4162 FLAG_legacy_const = old_flag_legacy_const; | 4162 FLAG_legacy_const = old_flag_legacy_const; |
| 4163 } | 4163 } |
| 4164 | 4164 |
| 4165 } // namespace interpreter | 4165 } // namespace interpreter |
| 4166 } // namespace internal | 4166 } // namespace internal |
| 4167 } // namespace v8 | 4167 } // namespace v8 |
| OLD | NEW |