| 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/compiler.h" | 7 #include "src/compiler.h" |
| 8 #include "src/interpreter/bytecode-array-iterator.h" | 8 #include "src/interpreter/bytecode-array-iterator.h" |
| 9 #include "src/interpreter/bytecode-generator.h" | 9 #include "src/interpreter/bytecode-generator.h" |
| 10 #include "src/interpreter/interpreter.h" | 10 #include "src/interpreter/interpreter.h" |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 SNPrintF(program, "%s\n%s();", function, kFunctionName); | 68 SNPrintF(program, "%s\n%s();", function, kFunctionName); |
| 69 return MakeBytecode(program.start(), kFunctionName); | 69 return MakeBytecode(program.start(), kFunctionName); |
| 70 } | 70 } |
| 71 }; | 71 }; |
| 72 | 72 |
| 73 | 73 |
| 74 // Helper macros for handcrafting bytecode sequences. | 74 // Helper macros for handcrafting bytecode sequences. |
| 75 #define B(x) static_cast<uint8_t>(Bytecode::k##x) | 75 #define B(x) static_cast<uint8_t>(Bytecode::k##x) |
| 76 #define U8(x) static_cast<uint8_t>((x) & 0xff) | 76 #define U8(x) static_cast<uint8_t>((x) & 0xff) |
| 77 #define R(x) static_cast<uint8_t>(-(x) & 0xff) | 77 #define R(x) static_cast<uint8_t>(-(x) & 0xff) |
| 78 #define A(x, n) R(helper.kLastParamIndex - (n) + 1 + (x)) |
| 79 #define THIS(n) A(0, n) |
| 78 #define _ static_cast<uint8_t>(0x5a) | 80 #define _ static_cast<uint8_t>(0x5a) |
| 79 #if defined(V8_TARGET_LITTLE_ENDIAN) | 81 #if defined(V8_TARGET_LITTLE_ENDIAN) |
| 80 #define U16(x) static_cast<uint8_t>((x) & 0xff), \ | 82 #define U16(x) static_cast<uint8_t>((x) & 0xff), \ |
| 81 static_cast<uint8_t>(((x) >> kBitsPerByte) & 0xff) | 83 static_cast<uint8_t>(((x) >> kBitsPerByte) & 0xff) |
| 82 #elif defined(V8_TARGET_BIG_ENDIAN) | 84 #elif defined(V8_TARGET_BIG_ENDIAN) |
| 83 #define U16(x) static_cast<uint8_t>(((x) >> kBitsPerByte) & 0xff), \ | 85 #define U16(x) static_cast<uint8_t>(((x) >> kBitsPerByte) & 0xff), \ |
| 84 static_cast<uint8_t>((x) & 0xff) | 86 static_cast<uint8_t>((x) & 0xff) |
| 85 #else | 87 #else |
| 86 #error Unknown byte ordering | 88 #error Unknown byte ordering |
| 87 #endif | 89 #endif |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 CHECK(actual == *expected || expected->StrictEquals(actual)); | 123 CHECK(actual == *expected || expected->StrictEquals(actual)); |
| 122 } | 124 } |
| 123 | 125 |
| 124 | 126 |
| 125 static void CheckConstant(InstanceType expected, Object* actual) { | 127 static void CheckConstant(InstanceType expected, Object* actual) { |
| 126 CHECK_EQ(expected, HeapObject::cast(actual)->map()->instance_type()); | 128 CHECK_EQ(expected, HeapObject::cast(actual)->map()->instance_type()); |
| 127 } | 129 } |
| 128 | 130 |
| 129 | 131 |
| 130 template <typename T> | 132 template <typename T> |
| 131 static void CheckBytecodeArrayEqual(struct ExpectedSnippet<T> expected, | 133 static void CheckBytecodeArrayEqual(const ExpectedSnippet<T>& expected, |
| 132 Handle<BytecodeArray> actual, | 134 Handle<BytecodeArray> actual, |
| 133 bool has_unknown = false) { | 135 bool has_unknown = false) { |
| 134 CHECK_EQ(actual->frame_size(), expected.frame_size); | 136 CHECK_EQ(actual->frame_size(), expected.frame_size); |
| 135 CHECK_EQ(actual->parameter_count(), expected.parameter_count); | 137 CHECK_EQ(actual->parameter_count(), expected.parameter_count); |
| 136 CHECK_EQ(actual->length(), expected.bytecode_length); | 138 CHECK_EQ(actual->length(), expected.bytecode_length); |
| 137 if (expected.constant_count == 0) { | 139 if (expected.constant_count == 0) { |
| 138 CHECK_EQ(actual->constant_pool(), CcTest::heap()->empty_fixed_array()); | 140 CHECK_EQ(actual->constant_pool(), CcTest::heap()->empty_fixed_array()); |
| 139 } else { | 141 } else { |
| 140 CHECK_EQ(actual->constant_pool()->length(), expected.constant_count); | 142 CHECK_EQ(actual->constant_pool()->length(), expected.constant_count); |
| 141 for (int i = 0; i < expected.constant_count; i++) { | 143 for (int i = 0; i < expected.constant_count; i++) { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 224 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| 223 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 225 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 224 } | 226 } |
| 225 } | 227 } |
| 226 | 228 |
| 227 | 229 |
| 228 TEST(PrimitiveExpressions) { | 230 TEST(PrimitiveExpressions) { |
| 229 InitializedHandleScope handle_scope; | 231 InitializedHandleScope handle_scope; |
| 230 BytecodeGeneratorHelper helper; | 232 BytecodeGeneratorHelper helper; |
| 231 | 233 |
| 232 ExpectedSnippet<int> snippets[] = { | 234 ExpectedSnippet<int> snippets[] = {{"var x = 0; return x;", |
| 233 {"var x = 0; return x;", | 235 kPointerSize, |
| 234 kPointerSize, | 236 1, |
| 235 1, | 237 6, |
| 236 6, | 238 {B(LdaZero), // |
| 237 {B(LdaZero), // | 239 B(Star), R(0), // |
| 238 B(Star), R(0), // | 240 B(Ldar), R(0), // |
| 239 B(Ldar), R(0), // | 241 B(Return)}, |
| 240 B(Return)}, | 242 0}, |
| 241 0}, | 243 {"var x = 0; return x + 3;", |
| 242 {"var x = 0; return x + 3;", | 244 kPointerSize, |
| 243 2 * kPointerSize, | 245 1, |
| 244 1, | 246 8, |
| 245 12, | 247 {B(LdaZero), // |
| 246 {B(LdaZero), // | 248 B(Star), R(0), // |
| 247 B(Star), R(0), // | 249 B(LdaSmi8), U8(3), // |
| 248 B(Ldar), R(0), // Easy to spot r1 not really needed here. | 250 B(Add), R(0), // |
| 249 B(Star), R(1), // Dead store. | 251 B(Return)}, |
| 250 B(LdaSmi8), U8(3), // | 252 0}, |
| 251 B(Add), R(1), // | 253 {"var x = 0; return x - 3;", |
| 252 B(Return)}, | 254 kPointerSize, |
| 253 0}, | 255 1, |
| 254 {"var x = 0; return x - 3;", | 256 8, |
| 255 2 * kPointerSize, | 257 {B(LdaZero), // |
| 256 1, | 258 B(Star), R(0), // |
| 257 12, | 259 B(LdaSmi8), U8(3), // |
| 258 {B(LdaZero), // | 260 B(Sub), R(0), // |
| 259 B(Star), R(0), // | 261 B(Return)}, |
| 260 B(Ldar), R(0), // Easy to spot r1 not really needed here. | 262 0}, |
| 261 B(Star), R(1), // Dead store. | 263 {"var x = 4; return x * 3;", |
| 262 B(LdaSmi8), U8(3), // | 264 kPointerSize, |
| 263 B(Sub), R(1), // | 265 1, |
| 264 B(Return)}, | 266 9, |
| 265 0}, | 267 {B(LdaSmi8), U8(4), // |
| 266 {"var x = 4; return x * 3;", | 268 B(Star), R(0), // |
| 267 2 * kPointerSize, | 269 B(LdaSmi8), U8(3), // |
| 268 1, | 270 B(Mul), R(0), // |
| 269 13, | 271 B(Return)}, |
| 270 {B(LdaSmi8), U8(4), // | 272 0}, |
| 271 B(Star), R(0), // | 273 {"var x = 4; return x / 3;", |
| 272 B(Ldar), R(0), // Easy to spot r1 not really needed here. | 274 kPointerSize, |
| 273 B(Star), R(1), // Dead store. | 275 1, |
| 274 B(LdaSmi8), U8(3), // | 276 9, |
| 275 B(Mul), R(1), // | 277 {B(LdaSmi8), U8(4), // |
| 276 B(Return)}, | 278 B(Star), R(0), // |
| 277 0}, | 279 B(LdaSmi8), U8(3), // |
| 278 {"var x = 4; return x / 3;", | 280 B(Div), R(0), // |
| 279 2 * kPointerSize, | 281 B(Return)}, |
| 280 1, | 282 0}, |
| 281 13, | 283 {"var x = 4; return x % 3;", |
| 282 {B(LdaSmi8), U8(4), // | 284 kPointerSize, |
| 283 B(Star), R(0), // | 285 1, |
| 284 B(Ldar), R(0), // Easy to spot r1 not really needed here. | 286 9, |
| 285 B(Star), R(1), // Dead store. | 287 {B(LdaSmi8), U8(4), // |
| 286 B(LdaSmi8), U8(3), // | 288 B(Star), R(0), // |
| 287 B(Div), R(1), // | 289 B(LdaSmi8), U8(3), // |
| 288 B(Return)}, | 290 B(Mod), R(0), // |
| 289 0}, | 291 B(Return)}, |
| 290 {"var x = 4; return x % 3;", | 292 0}, |
| 291 2 * kPointerSize, | 293 {"var x = 1; return x | 2;", |
| 292 1, | 294 kPointerSize, |
| 293 13, | 295 1, |
| 294 {B(LdaSmi8), U8(4), // | 296 9, |
| 295 B(Star), R(0), // | 297 {B(LdaSmi8), U8(1), // |
| 296 B(Ldar), R(0), // Easy to spot r1 not really needed here. | 298 B(Star), R(0), // |
| 297 B(Star), R(1), // Dead store. | 299 B(LdaSmi8), U8(2), // |
| 298 B(LdaSmi8), U8(3), // | 300 B(BitwiseOr), R(0), // |
| 299 B(Mod), R(1), // | 301 B(Return)}, |
| 300 B(Return)}, | 302 0}, |
| 301 0}, | 303 {"var x = 1; return x ^ 2;", |
| 302 {"var x = 1; return x | 2;", | 304 kPointerSize, |
| 303 2 * kPointerSize, | 305 1, |
| 304 1, | 306 9, |
| 305 13, | 307 {B(LdaSmi8), U8(1), // |
| 306 {B(LdaSmi8), U8(1), // | 308 B(Star), R(0), // |
| 307 B(Star), R(0), // | 309 B(LdaSmi8), U8(2), // |
| 308 B(Ldar), R(0), // Easy to spot r1 not really needed here. | 310 B(BitwiseXor), R(0), // |
| 309 B(Star), R(1), // Dead store. | 311 B(Return)}, |
| 310 B(LdaSmi8), U8(2), // | 312 0}, |
| 311 B(BitwiseOr), R(1), // | 313 {"var x = 1; return x & 2;", |
| 312 B(Return)}, | 314 kPointerSize, |
| 313 0}, | 315 1, |
| 314 {"var x = 1; return x ^ 2;", | 316 9, |
| 315 2 * kPointerSize, | 317 {B(LdaSmi8), U8(1), // |
| 316 1, | 318 B(Star), R(0), // |
| 317 13, | 319 B(LdaSmi8), U8(2), // |
| 318 {B(LdaSmi8), U8(1), // | 320 B(BitwiseAnd), R(0), // |
| 319 B(Star), R(0), // | 321 B(Return)}, |
| 320 B(Ldar), R(0), // Easy to spot r1 not really needed here. | 322 0}, |
| 321 B(Star), R(1), // Dead store. | 323 {"var x = 10; return x << 3;", |
| 322 B(LdaSmi8), U8(2), // | 324 kPointerSize, |
| 323 B(BitwiseXor), R(1), // | 325 1, |
| 324 B(Return)}, | 326 9, |
| 325 0}, | 327 {B(LdaSmi8), U8(10), // |
| 326 {"var x = 1; return x & 2;", | 328 B(Star), R(0), // |
| 327 2 * kPointerSize, | 329 B(LdaSmi8), U8(3), // |
| 328 1, | 330 B(ShiftLeft), R(0), // |
| 329 13, | 331 B(Return)}, |
| 330 {B(LdaSmi8), U8(1), // | 332 0}, |
| 331 B(Star), R(0), // | 333 {"var x = 10; return x >> 3;", |
| 332 B(Ldar), R(0), // Easy to spot r1 not really needed here. | 334 kPointerSize, |
| 333 B(Star), R(1), // Dead store. | 335 1, |
| 334 B(LdaSmi8), U8(2), // | 336 9, |
| 335 B(BitwiseAnd), R(1), // | 337 {B(LdaSmi8), U8(10), // |
| 336 B(Return)}, | 338 B(Star), R(0), // |
| 337 0}, | 339 B(LdaSmi8), U8(3), // |
| 338 {"var x = 10; return x << 3;", | 340 B(ShiftRight), R(0), // |
| 339 2 * kPointerSize, | 341 B(Return)}, |
| 340 1, | 342 0}, |
| 341 13, | 343 {"var x = 10; return x >>> 3;", |
| 342 {B(LdaSmi8), U8(10), // | 344 kPointerSize, |
| 343 B(Star), R(0), // | 345 1, |
| 344 B(Ldar), R(0), // Easy to spot r1 not really needed here. | 346 9, |
| 345 B(Star), R(1), // Dead store. | 347 {B(LdaSmi8), U8(10), // |
| 346 B(LdaSmi8), U8(3), // | 348 B(Star), R(0), // |
| 347 B(ShiftLeft), R(1), // | 349 B(LdaSmi8), U8(3), // |
| 348 B(Return)}, | 350 B(ShiftRightLogical), R(0), // |
| 349 0}, | 351 B(Return)}, |
| 350 {"var x = 10; return x >> 3;", | 352 0}, |
| 351 2 * kPointerSize, | 353 {"var x = 0; return (x, 3);", |
| 352 1, | 354 kPointerSize, |
| 353 13, | 355 1, |
| 354 {B(LdaSmi8), U8(10), // | 356 6, |
| 355 B(Star), R(0), // | 357 {B(LdaZero), // |
| 356 B(Ldar), R(0), // Easy to spot r1 not really needed here. | 358 B(Star), R(0), // |
| 357 B(Star), R(1), // Dead store. | 359 B(LdaSmi8), U8(3), // |
| 358 B(LdaSmi8), U8(3), // | 360 B(Return)}, |
| 359 B(ShiftRight), R(1), // | 361 0}}; |
| 360 B(Return)}, | |
| 361 0}, | |
| 362 {"var x = 10; return x >>> 3;", | |
| 363 2 * kPointerSize, | |
| 364 1, | |
| 365 13, | |
| 366 {B(LdaSmi8), U8(10), // | |
| 367 B(Star), R(0), // | |
| 368 B(Ldar), R(0), // Easy to spot r1 not really needed here. | |
| 369 B(Star), R(1), // Dead store. | |
| 370 B(LdaSmi8), U8(3), // | |
| 371 B(ShiftRightLogical), R(1), // | |
| 372 B(Return)}, | |
| 373 0}, | |
| 374 {"var x = 0; return (x, 3);", | |
| 375 1 * kPointerSize, | |
| 376 1, | |
| 377 8, | |
| 378 {B(LdaZero), // | |
| 379 B(Star), R(0), // | |
| 380 B(Ldar), R(0), // | |
| 381 B(LdaSmi8), U8(3), // | |
| 382 B(Return)}, | |
| 383 0}}; | |
| 384 | 362 |
| 385 for (size_t i = 0; i < arraysize(snippets); i++) { | 363 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 386 Handle<BytecodeArray> bytecode_array = | 364 Handle<BytecodeArray> bytecode_array = |
| 387 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 365 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| 388 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 366 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 389 } | 367 } |
| 390 } | 368 } |
| 391 | 369 |
| 392 | 370 |
| 393 TEST(LogicalExpressions) { | 371 TEST(LogicalExpressions) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 411 1 * kPointerSize, | 389 1 * kPointerSize, |
| 412 1, | 390 1, |
| 413 10, | 391 10, |
| 414 {B(LdaZero), // | 392 {B(LdaZero), // |
| 415 B(Star), R(0), // | 393 B(Star), R(0), // |
| 416 B(Ldar), R(0), // | 394 B(Ldar), R(0), // |
| 417 B(JumpIfToBooleanFalse), U8(4), // | 395 B(JumpIfToBooleanFalse), U8(4), // |
| 418 B(LdaSmi8), U8(3), // | 396 B(LdaSmi8), U8(3), // |
| 419 B(Return)}, | 397 B(Return)}, |
| 420 0}, | 398 0}, |
| 399 {"var x = 0; return x || (1, 2, 3);", |
| 400 1 * kPointerSize, |
| 401 1, |
| 402 10, |
| 403 {B(LdaZero), // |
| 404 B(Star), R(0), // |
| 405 B(Ldar), R(0), // |
| 406 B(JumpIfToBooleanTrue), U8(4), // |
| 407 B(LdaSmi8), U8(3), // |
| 408 B(Return)}, |
| 409 0}, |
| 410 {"var a = 2, b = 3, c = 4; return a || (a, b, a, b, c = 5, 3);", |
| 411 3 * kPointerSize, |
| 412 1, |
| 413 23, |
| 414 {B(LdaSmi8), U8(2), // |
| 415 B(Star), R(0), // |
| 416 B(LdaSmi8), U8(3), // |
| 417 B(Star), R(1), // |
| 418 B(LdaSmi8), U8(4), // |
| 419 B(Star), R(2), // |
| 420 B(Ldar), R(0), // |
| 421 B(JumpIfToBooleanTrue), U8(8), // |
| 422 B(LdaSmi8), U8(5), // |
| 423 B(Star), R(2), // |
| 424 B(LdaSmi8), U8(3), // |
| 425 B(Return)}, |
| 426 0}, |
| 421 {"var x = 1; var a = 2, b = 3; return x || (" | 427 {"var x = 1; var a = 2, b = 3; return x || (" |
| 422 #define X "a, b, a, b, " | 428 #define X "a = 1, b = 2, " |
| 423 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X | 429 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X |
| 424 #undef X | 430 #undef X |
| 425 "3);", | 431 "3);", |
| 426 3 * kPointerSize, | 432 3 * kPointerSize, |
| 427 1, | 433 1, |
| 428 283, | 434 283, |
| 429 {B(LdaSmi8), U8(1), // | 435 {B(LdaSmi8), U8(1), // |
| 430 B(Star), R(0), // | 436 B(Star), R(0), // |
| 431 B(LdaSmi8), U8(2), // | 437 B(LdaSmi8), U8(2), // |
| 432 B(Star), R(1), // | 438 B(Star), R(1), // |
| 433 B(LdaSmi8), U8(3), // | 439 B(LdaSmi8), U8(3), // |
| 434 B(Star), R(2), // | 440 B(Star), R(2), // |
| 435 B(Ldar), R(0), // | 441 B(Ldar), R(0), // |
| 436 B(JumpIfToBooleanTrueConstant), U8(0), // | 442 B(JumpIfToBooleanTrueConstant), U8(0), // |
| 437 #define X B(Ldar), R(1), B(Ldar), R(2), B(Ldar), R(1), B(Ldar), R(2), | 443 #define X B(LdaSmi8), U8(1), B(Star), R(1), B(LdaSmi8), U8(2), B(Star), R(2), |
| 438 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X | 444 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X |
| 439 #undef X | 445 #undef X |
| 440 B(LdaSmi8), U8(3), // | 446 B(LdaSmi8), U8(3), // |
| 441 B(Return)}, | 447 B(Return)}, |
| 442 1, | 448 1, |
| 443 {268, 0, 0, 0}}, | 449 {268, 0, 0, 0}}, |
| 444 {"var x = 0; var a = 2, b = 3; return x && (" | 450 {"var x = 0; var a = 2, b = 3; return x && (" |
| 445 #define X "a, b, a, b, " | 451 #define X "a = 1, b = 2, " |
| 446 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X | 452 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X |
| 447 #undef X | 453 #undef X |
| 448 "3);", | 454 "3);", |
| 449 3 * kPointerSize, | 455 3 * kPointerSize, |
| 450 1, | 456 1, |
| 451 282, | 457 282, |
| 452 {B(LdaZero), // | 458 {B(LdaZero), // |
| 453 B(Star), R(0), // | 459 B(Star), R(0), // |
| 454 B(LdaSmi8), U8(2), // | 460 B(LdaSmi8), U8(2), // |
| 455 B(Star), R(1), // | 461 B(Star), R(1), // |
| 456 B(LdaSmi8), U8(3), // | 462 B(LdaSmi8), U8(3), // |
| 457 B(Star), R(2), // | 463 B(Star), R(2), // |
| 458 B(Ldar), R(0), // | 464 B(Ldar), R(0), // |
| 459 B(JumpIfToBooleanFalseConstant), U8(0), // | 465 B(JumpIfToBooleanFalseConstant), U8(0), // |
| 460 #define X B(Ldar), R(1), B(Ldar), R(2), B(Ldar), R(1), B(Ldar), R(2), | 466 #define X B(LdaSmi8), U8(1), B(Star), R(1), B(LdaSmi8), U8(2), B(Star), R(2), |
| 461 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X | 467 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X |
| 462 #undef X | 468 #undef X |
| 463 B(LdaSmi8), U8(3), // | 469 B(LdaSmi8), U8(3), // |
| 464 B(Return)}, | 470 B(Return)}, |
| 465 1, | 471 1, |
| 466 {268, 0, 0, 0}}, | 472 {268, 0, 0, 0}}, |
| 467 {"return 0 && 3;", | 473 {"return 0 && 3;", |
| 468 0 * kPointerSize, | 474 0 * kPointerSize, |
| 469 1, | 475 1, |
| 470 2, | 476 2, |
| 471 {B(LdaZero), // | 477 {B(LdaZero), // |
| 472 B(Return)}, | 478 B(Return)}, |
| 473 0}, | 479 0}, |
| 474 {"return 1 || 3;", | 480 {"return 1 || 3;", |
| 475 0 * kPointerSize, | 481 0 * kPointerSize, |
| 476 1, | 482 1, |
| 477 3, | 483 3, |
| 478 {B(LdaSmi8), U8(1), // | 484 {B(LdaSmi8), U8(1), // |
| 479 B(Return)}, | 485 B(Return)}, |
| 480 0}, | 486 0}, |
| 481 {"var x = 1; return x && 3 || 0, 1;", | 487 {"var x = 1; return x && 3 || 0, 1;", |
| 482 1 * kPointerSize, | 488 1 * kPointerSize, |
| 483 1, | 489 1, |
| 484 16, | 490 16, |
| 485 {B(LdaSmi8), U8(1), // | 491 {B(LdaSmi8), U8(1), // |
| 486 B(Star), R(0), // | 492 B(Star), R(0), // |
| 487 B(Ldar), R(0), // | 493 B(Ldar), R(0), // |
| 488 B(JumpIfToBooleanFalse), U8(4), // | 494 B(JumpIfToBooleanFalse), U8(4), // |
| (...skipping 11 matching lines...) Expand all Loading... |
| 500 } | 506 } |
| 501 } | 507 } |
| 502 | 508 |
| 503 | 509 |
| 504 TEST(Parameters) { | 510 TEST(Parameters) { |
| 505 InitializedHandleScope handle_scope; | 511 InitializedHandleScope handle_scope; |
| 506 BytecodeGeneratorHelper helper; | 512 BytecodeGeneratorHelper helper; |
| 507 | 513 |
| 508 ExpectedSnippet<int> snippets[] = { | 514 ExpectedSnippet<int> snippets[] = { |
| 509 {"function f() { return this; }", | 515 {"function f() { return this; }", |
| 510 0, 1, 3, {B(Ldar), R(helper.kLastParamIndex), B(Return)}, 0}, | 516 0, |
| 517 1, |
| 518 3, |
| 519 {B(Ldar), THIS(1), B(Return)}, |
| 520 0}, |
| 511 {"function f(arg1) { return arg1; }", | 521 {"function f(arg1) { return arg1; }", |
| 512 0, 2, 3, {B(Ldar), R(helper.kLastParamIndex), B(Return)}, 0}, | 522 0, |
| 523 2, |
| 524 3, |
| 525 {B(Ldar), A(1, 2), B(Return)}, |
| 526 0}, |
| 513 {"function f(arg1) { return this; }", | 527 {"function f(arg1) { return this; }", |
| 514 0, 2, 3, {B(Ldar), R(helper.kLastParamIndex - 1), B(Return)}, 0}, | 528 0, |
| 529 2, |
| 530 3, |
| 531 {B(Ldar), THIS(2), B(Return)}, |
| 532 0}, |
| 515 {"function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return arg4; }", | 533 {"function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return arg4; }", |
| 516 0, 8, 3, {B(Ldar), R(helper.kLastParamIndex - 3), B(Return)}, 0}, | 534 0, |
| 535 8, |
| 536 3, |
| 537 {B(Ldar), A(4, 8), B(Return)}, |
| 538 0}, |
| 517 {"function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return this; }", | 539 {"function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return this; }", |
| 518 0, 8, 3, {B(Ldar), R(helper.kLastParamIndex - 7), B(Return)}, 0}, | 540 0, |
| 541 8, |
| 542 3, |
| 543 {B(Ldar), THIS(8), B(Return)}, |
| 544 0}, |
| 519 {"function f(arg1) { arg1 = 1; }", | 545 {"function f(arg1) { arg1 = 1; }", |
| 520 0, 2, 6, | 546 0, |
| 521 {B(LdaSmi8), U8(1), // | 547 2, |
| 522 B(Star), R(helper.kLastParamIndex), // | 548 6, |
| 523 B(LdaUndefined), // | 549 {B(LdaSmi8), U8(1), // |
| 550 B(Star), A(1, 2), // |
| 551 B(LdaUndefined), // |
| 524 B(Return)}, | 552 B(Return)}, |
| 525 0}, | 553 0}, |
| 526 {"function f(arg1, arg2, arg3, arg4) { arg2 = 1; }", | 554 {"function f(arg1, arg2, arg3, arg4) { arg2 = 1; }", |
| 527 0, 5, 6, | 555 0, |
| 528 {B(LdaSmi8), U8(1), // | 556 5, |
| 529 B(Star), R(helper.kLastParamIndex - 2), // | 557 6, |
| 530 B(LdaUndefined), // | 558 {B(LdaSmi8), U8(1), // |
| 559 B(Star), A(2, 5), // |
| 560 B(LdaUndefined), // |
| 531 B(Return)}, | 561 B(Return)}, |
| 532 0}, | 562 0}, |
| 533 }; | 563 }; |
| 534 | 564 |
| 535 for (size_t i = 0; i < arraysize(snippets); i++) { | 565 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 536 Handle<BytecodeArray> bytecode_array = | 566 Handle<BytecodeArray> bytecode_array = |
| 537 helper.MakeBytecodeForFunction(snippets[i].code_snippet); | 567 helper.MakeBytecodeForFunction(snippets[i].code_snippet); |
| 538 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 568 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 539 } | 569 } |
| 540 } | 570 } |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 | 720 |
| 691 FeedbackVectorSpec feedback_spec(&zone); | 721 FeedbackVectorSpec feedback_spec(&zone); |
| 692 FeedbackVectorSlot slot1 = feedback_spec.AddLoadICSlot(); | 722 FeedbackVectorSlot slot1 = feedback_spec.AddLoadICSlot(); |
| 693 FeedbackVectorSlot slot2 = feedback_spec.AddLoadICSlot(); | 723 FeedbackVectorSlot slot2 = feedback_spec.AddLoadICSlot(); |
| 694 | 724 |
| 695 Handle<i::TypeFeedbackVector> vector = | 725 Handle<i::TypeFeedbackVector> vector = |
| 696 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); | 726 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); |
| 697 | 727 |
| 698 ExpectedSnippet<const char*> snippets[] = { | 728 ExpectedSnippet<const char*> snippets[] = { |
| 699 {"function f(a) { return a.name; }\nf({name : \"test\"})", | 729 {"function f(a) { return a.name; }\nf({name : \"test\"})", |
| 700 1 * kPointerSize, | 730 0, |
| 701 2, | 731 2, |
| 702 10, | 732 6, |
| 703 { | 733 { |
| 704 B(Ldar), R(helper.kLastParamIndex), // | 734 B(LdaConstant), U8(0), // |
| 705 B(Star), R(0), // | 735 B(LoadICSloppy), A(1, 2), U8(vector->GetIndex(slot1)), // |
| 706 B(LdaConstant), U8(0), // | 736 B(Return), // |
| 707 B(LoadICSloppy), R(0), U8(vector->GetIndex(slot1)), // | |
| 708 B(Return) // | |
| 709 }, | 737 }, |
| 710 1, | 738 1, |
| 711 {"name"}}, | 739 {"name"}}, |
| 712 {"function f(a) { return a[\"key\"]; }\nf({key : \"test\"})", | 740 {"function f(a) { return a[\"key\"]; }\nf({key : \"test\"})", |
| 713 1 * kPointerSize, | 741 0, |
| 714 2, | 742 2, |
| 715 10, | 743 6, |
| 716 { | 744 { |
| 717 B(Ldar), R(helper.kLastParamIndex), // | 745 B(LdaConstant), U8(0), // |
| 718 B(Star), R(0), // | 746 B(LoadICSloppy), A(1, 2), U8(vector->GetIndex(slot1)), // |
| 719 B(LdaConstant), U8(0), // | 747 B(Return) // |
| 720 B(LoadICSloppy), R(0), U8(vector->GetIndex(slot1)), // | |
| 721 B(Return) // | |
| 722 }, | 748 }, |
| 723 1, | 749 1, |
| 724 {"key"}}, | 750 {"key"}}, |
| 725 {"function f(a) { return a[100]; }\nf({100 : \"test\"})", | 751 {"function f(a) { return a[100]; }\nf({100 : \"test\"})", |
| 726 1 * kPointerSize, | 752 0, |
| 727 2, | 753 2, |
| 728 10, | 754 6, |
| 729 { | 755 { |
| 730 B(Ldar), R(helper.kLastParamIndex), // | 756 B(LdaSmi8), U8(100), // |
| 731 B(Star), R(0), // | 757 B(KeyedLoadICSloppy), A(1, 2), U8(vector->GetIndex(slot1)), // |
| 732 B(LdaSmi8), U8(100), // | 758 B(Return) // |
| 733 B(KeyedLoadICSloppy), R(0), U8(vector->GetIndex(slot1)), // | |
| 734 B(Return) // | |
| 735 }, | 759 }, |
| 736 0}, | 760 0}, |
| 737 {"function f(a, b) { return a[b]; }\nf({arg : \"test\"}, \"arg\")", | 761 {"function f(a, b) { return a[b]; }\nf({arg : \"test\"}, \"arg\")", |
| 738 1 * kPointerSize, | 762 0, |
| 739 3, | 763 3, |
| 740 10, | 764 6, |
| 741 { | 765 { |
| 742 B(Ldar), R(helper.kLastParamIndex - 1), // | 766 B(Ldar), A(1, 2), // |
| 743 B(Star), R(0), // | 767 B(KeyedLoadICSloppy), A(1, 3), U8(vector->GetIndex(slot1)), // |
| 744 B(Ldar), R(helper.kLastParamIndex), // | 768 B(Return) // |
| 745 B(KeyedLoadICSloppy), R(0), U8(vector->GetIndex(slot1)), // | |
| 746 B(Return) // | |
| 747 }, | 769 }, |
| 748 0}, | 770 0}, |
| 749 {"function f(a) { var b = a.name; return a[-124]; }\n" | 771 {"function f(a) { var b = a.name; return a[-124]; }\n" |
| 750 "f({\"-124\" : \"test\", name : 123 })", | 772 "f({\"-124\" : \"test\", name : 123 })", |
| 751 2 * kPointerSize, | 773 kPointerSize, |
| 752 2, | 774 2, |
| 753 21, | 775 13, |
| 754 { | 776 { |
| 755 B(Ldar), R(helper.kLastParamIndex), // | 777 B(LdaConstant), U8(0), // |
| 756 B(Star), R(1), // | 778 B(LoadICSloppy), A(1, 2), U8(vector->GetIndex(slot1)), // |
| 757 B(LdaConstant), U8(0), // | 779 B(Star), R(0), // |
| 758 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot1)), // | 780 B(LdaSmi8), U8(-124), // |
| 759 B(Star), R(0), // | 781 B(KeyedLoadICSloppy), A(1, 2), U8(vector->GetIndex(slot2)), // |
| 760 B(Ldar), R(helper.kLastParamIndex), // | 782 B(Return), // |
| 761 B(Star), R(1), // | |
| 762 B(LdaSmi8), U8(-124), // | |
| 763 B(KeyedLoadICSloppy), R(1), U8(vector->GetIndex(slot2)), // | |
| 764 B(Return) // | |
| 765 }, | 783 }, |
| 766 1, | 784 1, |
| 767 {"name"}}, | 785 {"name"}}, |
| 768 {"function f(a) { \"use strict\"; return a.name; }\nf({name : \"test\"})", | 786 {"function f(a) { \"use strict\"; return a.name; }\nf({name : \"test\"})", |
| 769 1 * kPointerSize, | 787 0, |
| 770 2, | 788 2, |
| 771 12, | 789 6, |
| 772 { | 790 { |
| 773 // TODO(rmcilroy) Avoid unnecessary LdaConstant for "use strict" | 791 B(LdaConstant), U8(0), // |
| 774 // expression, or any other unused literal expression. | 792 B(LoadICStrict), A(1, 2), U8(vector->GetIndex(slot1)), // |
| 775 B(LdaConstant), U8(0), // | 793 B(Return), // |
| 776 B(Ldar), R(helper.kLastParamIndex), // | |
| 777 B(Star), R(0), // | |
| 778 B(LdaConstant), U8(1), // | |
| 779 B(LoadICStrict), R(0), U8(vector->GetIndex(slot1)), // | |
| 780 B(Return) // | |
| 781 }, | 794 }, |
| 782 2, | 795 1, |
| 783 {"use strict", "name"}}, | 796 {"name"}}, |
| 784 {"function f(a, b) { \"use strict\"; return a[b]; }\n" | 797 {"function f(a, b) { \"use strict\"; return a[b]; }\n" |
| 785 "f({arg : \"test\"}, \"arg\")", | 798 "f({arg : \"test\"}, \"arg\")", |
| 786 1 * kPointerSize, | 799 0, |
| 787 3, | 800 3, |
| 788 12, | 801 6, |
| 789 { | 802 { |
| 790 // TODO(rmcilroy) Avoid unnecessary LdaConstant for "use strict" | 803 B(Ldar), A(2, 3), // |
| 791 // expression, or any other unused literal expression. | 804 B(KeyedLoadICStrict), A(1, 3), U8(vector->GetIndex(slot1)), // |
| 792 B(LdaConstant), U8(0), // | 805 B(Return), // |
| 793 B(Ldar), R(helper.kLastParamIndex - 1), // | |
| 794 B(Star), R(0), // | |
| 795 B(Ldar), R(helper.kLastParamIndex), // | |
| 796 B(KeyedLoadICStrict), R(0), U8(vector->GetIndex(slot1)), // | |
| 797 B(Return) // | |
| 798 }, | 806 }, |
| 799 1, | 807 0, |
| 800 {"use strict"}}}; | 808 }}; |
| 801 for (size_t i = 0; i < arraysize(snippets); i++) { | 809 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 802 Handle<BytecodeArray> bytecode_array = | 810 Handle<BytecodeArray> bytecode_array = |
| 803 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); | 811 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); |
| 804 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 812 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 805 } | 813 } |
| 806 } | 814 } |
| 807 | 815 |
| 808 | 816 |
| 809 TEST(PropertyStores) { | 817 TEST(PropertyStores) { |
| 810 InitializedHandleScope handle_scope; | 818 InitializedHandleScope handle_scope; |
| 811 BytecodeGeneratorHelper helper; | 819 BytecodeGeneratorHelper helper; |
| 812 Zone zone; | 820 Zone zone; |
| 813 | 821 |
| 814 FeedbackVectorSpec feedback_spec(&zone); | 822 FeedbackVectorSpec feedback_spec(&zone); |
| 815 FeedbackVectorSlot slot1 = feedback_spec.AddStoreICSlot(); | 823 FeedbackVectorSlot slot1 = feedback_spec.AddStoreICSlot(); |
| 816 FeedbackVectorSlot slot2 = feedback_spec.AddStoreICSlot(); | 824 FeedbackVectorSlot slot2 = feedback_spec.AddStoreICSlot(); |
| 817 | 825 |
| 818 Handle<i::TypeFeedbackVector> vector = | 826 Handle<i::TypeFeedbackVector> vector = |
| 819 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); | 827 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); |
| 820 | 828 |
| 821 ExpectedSnippet<const char*> snippets[] = { | 829 ExpectedSnippet<const char*> snippets[] = { |
| 822 {"function f(a) { a.name = \"val\"; }\nf({name : \"test\"})", | 830 {"function f(a) { a.name = \"val\"; }\nf({name : \"test\"})", |
| 823 2 * kPointerSize, | 831 kPointerSize, |
| 824 2, | 832 2, |
| 825 16, | 833 12, |
| 826 { | 834 { |
| 827 B(Ldar), R(helper.kLastParamIndex), // | 835 B(LdaConstant), U8(0), // |
| 828 B(Star), R(0), // | 836 B(Star), R(0), // |
| 829 B(LdaConstant), U8(0), // | 837 B(LdaConstant), U8(1), // |
| 830 B(Star), R(1), // | 838 B(StoreICSloppy), A(1, 2), R(0), U8(vector->GetIndex(slot1)), // |
| 831 B(LdaConstant), U8(1), // | 839 B(LdaUndefined), // |
| 832 B(StoreICSloppy), R(0), R(1), U8(vector->GetIndex(slot1)), // | 840 B(Return), // |
| 833 B(LdaUndefined), // | |
| 834 B(Return) // | |
| 835 }, | 841 }, |
| 836 2, | 842 2, |
| 837 {"name", "val"}}, | 843 {"name", "val"}}, |
| 838 {"function f(a) { a[\"key\"] = \"val\"; }\nf({key : \"test\"})", | 844 {"function f(a) { a[\"key\"] = \"val\"; }\nf({key : \"test\"})", |
| 839 2 * kPointerSize, | 845 kPointerSize, |
| 840 2, | 846 2, |
| 841 16, | 847 12, |
| 842 { | 848 { |
| 843 B(Ldar), R(helper.kLastParamIndex), // | 849 B(LdaConstant), U8(0), // |
| 844 B(Star), R(0), // | 850 B(Star), R(0), // |
| 845 B(LdaConstant), U8(0), // | 851 B(LdaConstant), U8(1), // |
| 846 B(Star), R(1), // | 852 B(StoreICSloppy), A(1, 2), R(0), U8(vector->GetIndex(slot1)), // |
| 847 B(LdaConstant), U8(1), // | 853 B(LdaUndefined), // |
| 848 B(StoreICSloppy), R(0), R(1), U8(vector->GetIndex(slot1)), // | 854 B(Return), // |
| 849 B(LdaUndefined), // | |
| 850 B(Return) // | |
| 851 }, | 855 }, |
| 852 2, | 856 2, |
| 853 {"key", "val"}}, | 857 {"key", "val"}}, |
| 854 {"function f(a) { a[100] = \"val\"; }\nf({100 : \"test\"})", | 858 {"function f(a) { a[100] = \"val\"; }\nf({100 : \"test\"})", |
| 855 2 * kPointerSize, | 859 kPointerSize, |
| 856 2, | 860 2, |
| 857 16, | 861 12, |
| 858 { | 862 { |
| 859 B(Ldar), R(helper.kLastParamIndex), // | 863 B(LdaSmi8), U8(100), // |
| 860 B(Star), R(0), // | 864 B(Star), R(0), // |
| 861 B(LdaSmi8), U8(100), // | 865 B(LdaConstant), U8(0), // |
| 862 B(Star), R(1), // | 866 B(KeyedStoreICSloppy), // |
| 863 B(LdaConstant), U8(0), // | 867 A(1, 2), R(0), U8(vector->GetIndex(slot1)), // |
| 864 B(KeyedStoreICSloppy), R(0), R(1), U8(vector->GetIndex(slot1)), // | 868 B(LdaUndefined), // |
| 865 B(LdaUndefined), // | 869 B(Return), // |
| 866 B(Return) // | |
| 867 }, | 870 }, |
| 868 1, | 871 1, |
| 869 {"val"}}, | 872 {"val"}}, |
| 870 {"function f(a, b) { a[b] = \"val\"; }\nf({arg : \"test\"}, \"arg\")", | 873 {"function f(a, b) { a[b] = \"val\"; }\nf({arg : \"test\"}, \"arg\")", |
| 871 2 * kPointerSize, | 874 0, |
| 872 3, | 875 3, |
| 873 16, | 876 8, |
| 874 { | 877 { |
| 875 B(Ldar), R(helper.kLastParamIndex - 1), // | 878 B(LdaConstant), U8(0), // |
| 876 B(Star), R(0), // | 879 B(KeyedStoreICSloppy), // |
| 877 B(Ldar), R(helper.kLastParamIndex), // | 880 A(1, 3), A(2, 3), U8(vector->GetIndex(slot1)), // |
| 878 B(Star), R(1), // | 881 B(LdaUndefined), // |
| 879 B(LdaConstant), U8(0), // | 882 B(Return), // |
| 880 B(KeyedStoreICSloppy), R(0), R(1), U8(vector->GetIndex(slot1)), // | |
| 881 B(LdaUndefined), // | |
| 882 B(Return) // | |
| 883 }, | 883 }, |
| 884 1, | 884 1, |
| 885 {"val"}}, | 885 {"val"}}, |
| 886 {"function f(a) { a.name = a[-124]; }\n" | 886 {"function f(a) { a.name = a[-124]; }\n" |
| 887 "f({\"-124\" : \"test\", name : 123 })", | 887 "f({\"-124\" : \"test\", name : 123 })", |
| 888 3 * kPointerSize, | 888 kPointerSize, |
| 889 2, | 889 2, |
| 890 23, | 890 15, |
| 891 { | 891 { |
| 892 B(Ldar), R(helper.kLastParamIndex), // | 892 B(LdaConstant), U8(0), // |
| 893 B(Star), R(0), // | 893 B(Star), R(0), // |
| 894 B(LdaConstant), U8(0), // | 894 B(LdaSmi8), U8(-124), // |
| 895 B(Star), R(1), // | 895 B(KeyedLoadICSloppy), A(1, 2), U8(vector->GetIndex(slot1)), // |
| 896 B(Ldar), R(helper.kLastParamIndex), // | 896 B(StoreICSloppy), A(1, 2), R(0), U8(vector->GetIndex(slot2)), // |
| 897 B(Star), R(2), // | 897 B(LdaUndefined), // |
| 898 B(LdaSmi8), U8(-124), // | 898 B(Return), // |
| 899 B(KeyedLoadICSloppy), R(2), U8(vector->GetIndex(slot1)), // | |
| 900 B(StoreICSloppy), R(0), R(1), U8(vector->GetIndex(slot2)), // | |
| 901 B(LdaUndefined), // | |
| 902 B(Return) // | |
| 903 }, | 899 }, |
| 904 1, | 900 1, |
| 905 {"name"}}, | 901 {"name"}}, |
| 906 {"function f(a) { \"use strict\"; a.name = \"val\"; }\n" | 902 {"function f(a) { \"use strict\"; a.name = \"val\"; }\n" |
| 907 "f({name : \"test\"})", | 903 "f({name : \"test\"})", |
| 908 2 * kPointerSize, | 904 kPointerSize, |
| 909 2, | 905 2, |
| 910 18, | 906 12, |
| 911 { | 907 { |
| 912 // TODO(rmcilroy) Avoid unnecessary LdaConstant for "use strict" | 908 B(LdaConstant), U8(0), // |
| 913 // expression, or any other unused literal expression. | 909 B(Star), R(0), // |
| 914 B(LdaConstant), U8(0), // | 910 B(LdaConstant), U8(1), // |
| 915 B(Ldar), R(helper.kLastParamIndex), // | 911 B(StoreICStrict), A(1, 2), R(0), U8(vector->GetIndex(slot1)), // |
| 916 B(Star), R(0), // | 912 B(LdaUndefined), // |
| 917 B(LdaConstant), U8(1), // | 913 B(Return), // |
| 918 B(Star), R(1), // | |
| 919 B(LdaConstant), U8(2), // | |
| 920 B(StoreICStrict), R(0), R(1), U8(vector->GetIndex(slot1)), // | |
| 921 B(LdaUndefined), // | |
| 922 B(Return) // | |
| 923 }, | 914 }, |
| 924 3, | 915 2, |
| 925 {"use strict", "name", "val"}}, | 916 {"name", "val"}}, |
| 926 {"function f(a, b) { \"use strict\"; a[b] = \"val\"; }\n" | 917 {"function f(a, b) { \"use strict\"; a[b] = \"val\"; }\n" |
| 927 "f({arg : \"test\"}, \"arg\")", | 918 "f({arg : \"test\"}, \"arg\")", |
| 928 2 * kPointerSize, | 919 0, |
| 929 3, | 920 3, |
| 930 18, | 921 8, |
| 931 { | 922 { |
| 932 // TODO(rmcilroy) Avoid unnecessary LdaConstant for "use strict" | 923 B(LdaConstant), U8(0), // |
| 933 // expression, or any other unused literal expression. | 924 B(KeyedStoreICStrict), A(1, 3), A(2, 3), // |
| 934 B(LdaConstant), U8(0), // | 925 U8(vector->GetIndex(slot1)), // |
| 935 B(Ldar), R(helper.kLastParamIndex - 1), // | 926 B(LdaUndefined), // |
| 936 B(Star), R(0), // | 927 B(Return), // |
| 937 B(Ldar), R(helper.kLastParamIndex), // | |
| 938 B(Star), R(1), // | |
| 939 B(LdaConstant), U8(1), // | |
| 940 B(KeyedStoreICStrict), R(0), R(1), U8(vector->GetIndex(slot1)), // | |
| 941 B(LdaUndefined), // | |
| 942 B(Return) // | |
| 943 }, | 928 }, |
| 944 2, | 929 1, |
| 945 {"use strict", "val"}}}; | 930 {"val"}}}; |
| 946 for (size_t i = 0; i < arraysize(snippets); i++) { | 931 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 947 Handle<BytecodeArray> bytecode_array = | 932 Handle<BytecodeArray> bytecode_array = |
| 948 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); | 933 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); |
| 949 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 934 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 950 } | 935 } |
| 951 } | 936 } |
| 952 | 937 |
| 953 | 938 |
| 954 #define FUNC_ARG "new (function Obj() { this.func = function() { return; }})()" | 939 #define FUNC_ARG "new (function Obj() { this.func = function() { return; }})()" |
| 955 | 940 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 966 | 951 |
| 967 Handle<i::TypeFeedbackVector> vector = | 952 Handle<i::TypeFeedbackVector> vector = |
| 968 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); | 953 i::NewTypeFeedbackVector(helper.isolate(), &feedback_spec); |
| 969 | 954 |
| 970 ExpectedSnippet<const char*> snippets[] = { | 955 ExpectedSnippet<const char*> snippets[] = { |
| 971 {"function f(a) { return a.func(); }\nf(" FUNC_ARG ")", | 956 {"function f(a) { return a.func(); }\nf(" FUNC_ARG ")", |
| 972 2 * kPointerSize, | 957 2 * kPointerSize, |
| 973 2, | 958 2, |
| 974 16, | 959 16, |
| 975 { | 960 { |
| 976 B(Ldar), R(helper.kLastParamIndex), // | 961 B(Ldar), A(1, 2), // |
| 977 B(Star), R(1), // | 962 B(Star), R(1), // |
| 978 B(LdaConstant), U8(0), // | 963 B(LdaConstant), U8(0), // |
| 979 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), // | 964 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), // |
| 980 B(Star), R(0), // | 965 B(Star), R(0), // |
| 981 B(Call), R(0), R(1), U8(0), // | 966 B(Call), R(0), R(1), U8(0), // |
| 982 B(Return) // | 967 B(Return), // |
| 983 }, | 968 }, |
| 984 1, | 969 1, |
| 985 {"func"}}, | 970 {"func"}}, |
| 986 {"function f(a, b, c) { return a.func(b, c); }\nf(" FUNC_ARG ", 1, 2)", | 971 {"function f(a, b, c) { return a.func(b, c); }\nf(" FUNC_ARG ", 1, 2)", |
| 987 4 * kPointerSize, | 972 4 * kPointerSize, |
| 988 4, | 973 4, |
| 989 24, | 974 24, |
| 990 { | 975 { |
| 991 B(Ldar), R(helper.kLastParamIndex - 2), // | 976 B(Ldar), A(1, 4), // |
| 992 B(Star), R(1), // | 977 B(Star), R(1), // |
| 993 B(LdaConstant), U8(0), // | 978 B(LdaConstant), U8(0), // |
| 994 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), // | 979 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), // |
| 995 B(Star), R(0), // | 980 B(Star), R(0), // |
| 996 B(Ldar), R(helper.kLastParamIndex - 1), // | 981 B(Ldar), A(2, 4), // |
| 997 B(Star), R(2), // | 982 B(Star), R(2), // |
| 998 B(Ldar), R(helper.kLastParamIndex), // | 983 B(Ldar), A(3, 4), // |
| 999 B(Star), R(3), // | 984 B(Star), R(3), // |
| 1000 B(Call), R(0), R(1), U8(2), // | 985 B(Call), R(0), R(1), U8(2), // |
| 1001 B(Return) // | 986 B(Return) // |
| 1002 }, | 987 }, |
| 1003 1, | 988 1, |
| 1004 {"func"}}, | 989 {"func"}}, |
| 1005 {"function f(a, b) { return a.func(b + b, b); }\nf(" FUNC_ARG ", 1)", | 990 {"function f(a, b) { return a.func(b + b, b); }\nf(" FUNC_ARG ", 1)", |
| 1006 4 * kPointerSize, | 991 4 * kPointerSize, |
| 1007 3, | 992 3, |
| 1008 30, | 993 26, |
| 1009 { | 994 { |
| 1010 B(Ldar), R(helper.kLastParamIndex - 1), // | 995 B(Ldar), A(1, 3), // |
| 1011 B(Star), R(1), // | 996 B(Star), R(1), // |
| 1012 B(LdaConstant), U8(0), // | 997 B(LdaConstant), U8(0), // |
| 1013 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), // | 998 B(LoadICSloppy), R(1), U8(vector->GetIndex(slot2)), // |
| 1014 B(Star), R(0), // | 999 B(Star), R(0), // |
| 1015 B(Ldar), R(helper.kLastParamIndex), // | 1000 B(Ldar), A(2, 3), // |
| 1016 B(Star), R(3), // | 1001 B(Add), A(2, 3), // |
| 1017 B(Ldar), R(helper.kLastParamIndex), // | |
| 1018 B(Add), R(3), // | |
| 1019 B(Star), R(2), // | 1002 B(Star), R(2), // |
| 1020 B(Ldar), R(helper.kLastParamIndex), // | 1003 B(Ldar), A(2, 3), // |
| 1021 B(Star), R(3), // | 1004 B(Star), R(3), // |
| 1022 B(Call), R(0), R(1), U8(2), // | 1005 B(Call), R(0), R(1), U8(2), // |
| 1023 B(Return), // | 1006 B(Return), // |
| 1024 }, | 1007 }, |
| 1025 1, | 1008 1, |
| 1026 {"func"}}}; | 1009 {"func"}}}; |
| 1027 for (size_t i = 0; i < arraysize(snippets); i++) { | 1010 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1028 Handle<BytecodeArray> bytecode_array = | 1011 Handle<BytecodeArray> bytecode_array = |
| 1029 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); | 1012 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); |
| 1030 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 1013 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1287 B(LdaUndefined), // | 1270 B(LdaUndefined), // |
| 1288 B(Return) // | 1271 B(Return) // |
| 1289 }, | 1272 }, |
| 1290 }, | 1273 }, |
| 1291 { | 1274 { |
| 1292 "function f(a) { return %IsArray(a) }\nf(undefined)", | 1275 "function f(a) { return %IsArray(a) }\nf(undefined)", |
| 1293 1 * kPointerSize, | 1276 1 * kPointerSize, |
| 1294 2, | 1277 2, |
| 1295 10, | 1278 10, |
| 1296 { | 1279 { |
| 1297 B(Ldar), R(helper.kLastParamIndex), // | 1280 B(Ldar), A(1, 2), // |
| 1298 B(Star), R(0), // | 1281 B(Star), R(0), // |
| 1299 B(CallRuntime), U16(Runtime::kIsArray), R(0), U8(1), // | 1282 B(CallRuntime), U16(Runtime::kIsArray), R(0), U8(1), // |
| 1300 B(Return) // | 1283 B(Return) // |
| 1301 }, | 1284 }, |
| 1302 }, | 1285 }, |
| 1303 { | 1286 { |
| 1304 "function f() { return %Add(1, 2) }\nf()", | 1287 "function f() { return %Add(1, 2) }\nf()", |
| 1305 2 * kPointerSize, | 1288 2 * kPointerSize, |
| 1306 1, | 1289 1, |
| 1307 14, | 1290 14, |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1374 B(Return), // | 1357 B(Return), // |
| 1375 B(Jump), U8(5), // | 1358 B(Jump), U8(5), // |
| 1376 B(LdaSmi8), U8(-1), // | 1359 B(LdaSmi8), U8(-1), // |
| 1377 B(Return), // | 1360 B(Return), // |
| 1378 B(LdaUndefined), // | 1361 B(LdaUndefined), // |
| 1379 B(Return)}, // | 1362 B(Return)}, // |
| 1380 0, | 1363 0, |
| 1381 {unused, unused, unused, unused, unused, unused}}, | 1364 {unused, unused, unused, unused, unused, unused}}, |
| 1382 {"function f(a) { if (a <= 0) { return 200; } else { return -200; } }" | 1365 {"function f(a) { if (a <= 0) { return 200; } else { return -200; } }" |
| 1383 "f(99);", | 1366 "f(99);", |
| 1384 kPointerSize, | 1367 0, |
| 1385 2, | 1368 2, |
| 1386 19, | 1369 15, |
| 1387 {B(Ldar), R(helper.kLastParamIndex), // | 1370 {B(LdaZero), // |
| 1388 B(Star), R(0), // | 1371 B(TestLessThanOrEqual), A(1, 2), // |
| 1389 B(LdaZero), // | 1372 B(JumpIfFalse), U8(7), // |
| 1390 B(TestLessThanOrEqual), R(0), // | 1373 B(LdaConstant), U8(0), // |
| 1391 B(JumpIfFalse), U8(7), // | 1374 B(Return), // |
| 1392 B(LdaConstant), U8(0), // | 1375 B(Jump), U8(5), // |
| 1393 B(Return), // | 1376 B(LdaConstant), U8(1), // |
| 1394 B(Jump), U8(5), // | 1377 B(Return), // |
| 1395 B(LdaConstant), U8(1), // | 1378 B(LdaUndefined), // |
| 1396 B(Return), // | 1379 B(Return)}, // |
| 1397 B(LdaUndefined), // | |
| 1398 B(Return)}, // | |
| 1399 2, | 1380 2, |
| 1400 {helper.factory()->NewNumberFromInt(200), | 1381 {helper.factory()->NewNumberFromInt(200), |
| 1401 helper.factory()->NewNumberFromInt(-200), unused, unused, unused, | 1382 helper.factory()->NewNumberFromInt(-200), unused, unused, unused, |
| 1402 unused}}, | 1383 unused}}, |
| 1403 {"function f(a, b) { if (a in b) { return 200; } }" | 1384 {"function f(a, b) { if (a in b) { return 200; } }" |
| 1404 "f('prop', { prop: 'yes'});", | 1385 "f('prop', { prop: 'yes'});", |
| 1405 kPointerSize, | 1386 0, |
| 1406 3, | 1387 3, |
| 1407 15, | 1388 11, |
| 1408 {B(Ldar), R(helper.kLastParamIndex - 1), // | 1389 {B(Ldar), A(2, 3), // |
| 1409 B(Star), R(0), // | 1390 B(TestIn), A(1, 3), // |
| 1410 B(Ldar), R(helper.kLastParamIndex), // | 1391 B(JumpIfFalse), U8(5), // |
| 1411 B(TestIn), R(0), // | 1392 B(LdaConstant), U8(0), // |
| 1412 B(JumpIfFalse), U8(5), // | 1393 B(Return), // |
| 1413 B(LdaConstant), U8(0), // | 1394 B(LdaUndefined), // |
| 1414 B(Return), // | 1395 B(Return)}, // |
| 1415 B(LdaUndefined), // | |
| 1416 B(Return)}, // | |
| 1417 1, | 1396 1, |
| 1418 {helper.factory()->NewNumberFromInt(200), unused, unused, unused, unused, | 1397 {helper.factory()->NewNumberFromInt(200), unused, unused, unused, unused, |
| 1419 unused}}, | 1398 unused}}, |
| 1420 {"function f(z) { var a = 0; var b = 0; if (a === 0.01) { " | 1399 {"function f(z) { var a = 0; var b = 0; if (a === 0.01) { " |
| 1421 #define X "b = a; a = b; " | 1400 #define X "b = a; a = b; " |
| 1422 X X X X X X X X X X X X X X X X X X X X X X X X | 1401 X X X X X X X X X X X X X X X X X X X X X X X X |
| 1423 #undef X | 1402 #undef X |
| 1424 " return 200; } else { return -200; } } f(0.001)", | 1403 " return 200; } else { return -200; } } f(0.001)", |
| 1425 3 * kPointerSize, | 1404 2 * kPointerSize, |
| 1426 2, | 1405 2, |
| 1427 218, | 1406 214, |
| 1428 {B(LdaZero), // | 1407 { |
| 1429 B(Star), R(0), // | 1408 #define X B(Ldar), R(0), B(Star), R(1), B(Ldar), R(1), B(Star), R(0) |
| 1430 B(LdaZero), // | 1409 B(LdaZero), // |
| 1431 B(Star), R(1), // | 1410 B(Star), R(0), // |
| 1432 B(Ldar), R(0), // | 1411 B(LdaZero), // |
| 1433 B(Star), R(2), // | 1412 B(Star), R(1), // |
| 1434 B(LdaConstant), U8(0), // | 1413 B(LdaConstant), U8(0), // |
| 1435 B(TestEqualStrict), R(2), // | 1414 B(TestEqualStrict), R(0), // |
| 1436 B(JumpIfFalseConstant), U8(2), // | 1415 B(JumpIfFalseConstant), U8(2), // |
| 1437 #define X B(Ldar), R(0), B(Star), R(1), B(Ldar), R(1), B(Star), R(0), | 1416 X, X, X, X, X, X, X, X, X, X, // |
| 1438 X X X X X X X X X X X X X X X X X X X X X X X X | 1417 X, X, X, X, X, X, X, X, X, X, // |
| 1418 X, X, X, X, // |
| 1419 B(LdaConstant), U8(1), // |
| 1420 B(Return), // |
| 1421 B(Jump), U8(5), // |
| 1422 B(LdaConstant), U8(3), // |
| 1423 B(Return), // |
| 1424 B(LdaUndefined), // |
| 1425 B(Return)}, // |
| 1439 #undef X | 1426 #undef X |
| 1440 B(LdaConstant), U8(1), // | |
| 1441 B(Return), // | |
| 1442 B(Jump), U8(5), // | |
| 1443 B(LdaConstant), U8(3), // | |
| 1444 B(Return), // | |
| 1445 B(LdaUndefined), // | |
| 1446 B(Return)}, // | |
| 1447 4, | 1427 4, |
| 1448 {helper.factory()->NewHeapNumber(0.01), | 1428 {helper.factory()->NewHeapNumber(0.01), |
| 1449 helper.factory()->NewNumberFromInt(200), | 1429 helper.factory()->NewNumberFromInt(200), |
| 1450 helper.factory()->NewNumberFromInt(199), | 1430 helper.factory()->NewNumberFromInt(199), |
| 1451 helper.factory()->NewNumberFromInt(-200), | 1431 helper.factory()->NewNumberFromInt(-200), unused, unused}}, |
| 1452 unused, unused}}, | |
| 1453 {"function f(a, b) {\n" | 1432 {"function f(a, b) {\n" |
| 1454 " if (a == b) { return 1; }\n" | 1433 " if (a == b) { return 1; }\n" |
| 1455 " if (a === b) { return 1; }\n" | 1434 " if (a === b) { return 1; }\n" |
| 1456 " if (a < b) { return 1; }\n" | 1435 " if (a < b) { return 1; }\n" |
| 1457 " if (a > b) { return 1; }\n" | 1436 " if (a > b) { return 1; }\n" |
| 1458 " if (a <= b) { return 1; }\n" | 1437 " if (a <= b) { return 1; }\n" |
| 1459 " if (a >= b) { return 1; }\n" | 1438 " if (a >= b) { return 1; }\n" |
| 1460 " if (a in b) { return 1; }\n" | 1439 " if (a in b) { return 1; }\n" |
| 1461 " if (a instanceof b) { return 1; }\n" | 1440 " if (a instanceof b) { return 1; }\n" |
| 1462 " /* if (a != b) { return 1; } */" // TODO(oth) Ast visitor yields | |
| 1463 " /* if (a !== b) { return 1; } */" // UNARY NOT, rather than !=/!==. | |
| 1464 " return 0;\n" | 1441 " return 0;\n" |
| 1465 "} f(1, 1);", | 1442 "} f(1, 1);", |
| 1466 kPointerSize, | 1443 0, |
| 1467 3, | 1444 3, |
| 1468 106, | 1445 74, |
| 1469 { | 1446 { |
| 1470 #define IF_CONDITION_RETURN(condition) \ | 1447 #define IF_CONDITION_RETURN(condition) \ |
| 1471 B(Ldar), R(helper.kLastParamIndex - 1), \ | 1448 B(Ldar), A(2, 3), \ |
| 1472 B(Star), R(0), \ | 1449 B(condition), A(1, 3), \ |
| 1473 B(Ldar), R(helper.kLastParamIndex), \ | 1450 B(JumpIfFalse), U8(5), \ |
| 1474 B(condition), R(0), \ | 1451 B(LdaSmi8), U8(1), \ |
| 1475 B(JumpIfFalse), U8(5), \ | 1452 B(Return), |
| 1476 B(LdaSmi8), U8(1), \ | |
| 1477 B(Return), | |
| 1478 IF_CONDITION_RETURN(TestEqual) // | 1453 IF_CONDITION_RETURN(TestEqual) // |
| 1479 IF_CONDITION_RETURN(TestEqualStrict) // | 1454 IF_CONDITION_RETURN(TestEqualStrict) // |
| 1480 IF_CONDITION_RETURN(TestLessThan) // | 1455 IF_CONDITION_RETURN(TestLessThan) // |
| 1481 IF_CONDITION_RETURN(TestGreaterThan) // | 1456 IF_CONDITION_RETURN(TestGreaterThan) // |
| 1482 IF_CONDITION_RETURN(TestLessThanOrEqual) // | 1457 IF_CONDITION_RETURN(TestLessThanOrEqual) // |
| 1483 IF_CONDITION_RETURN(TestGreaterThanOrEqual) // | 1458 IF_CONDITION_RETURN(TestGreaterThanOrEqual) // |
| 1484 IF_CONDITION_RETURN(TestIn) // | 1459 IF_CONDITION_RETURN(TestIn) // |
| 1485 IF_CONDITION_RETURN(TestInstanceOf) // | 1460 IF_CONDITION_RETURN(TestInstanceOf) // |
| 1461 B(LdaZero), // |
| 1462 B(Return)}, // |
| 1486 #undef IF_CONDITION_RETURN | 1463 #undef IF_CONDITION_RETURN |
| 1487 B(LdaZero), // | |
| 1488 B(Return)}, // | |
| 1489 0, | 1464 0, |
| 1490 {unused, unused, unused, unused, unused, unused}}, | 1465 {unused, unused, unused, unused, unused, unused}}, |
| 1491 }; | 1466 }; |
| 1492 | 1467 |
| 1493 for (size_t i = 0; i < arraysize(snippets); i++) { | 1468 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1494 Handle<BytecodeArray> bytecode_array = | 1469 Handle<BytecodeArray> bytecode_array = |
| 1495 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); | 1470 helper.MakeBytecode(snippets[i].code_snippet, helper.kFunctionName); |
| 1496 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 1471 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 1497 } | 1472 } |
| 1498 } | 1473 } |
| 1499 | 1474 |
| 1500 | 1475 |
| 1501 TEST(DeclareGlobals) { | 1476 TEST(DeclareGlobals) { |
| 1502 InitializedHandleScope handle_scope; | 1477 InitializedHandleScope handle_scope; |
| 1503 BytecodeGeneratorHelper helper; | 1478 BytecodeGeneratorHelper helper; |
| 1504 | 1479 |
| 1505 ExpectedSnippet<InstanceType> snippets[] = { | 1480 ExpectedSnippet<InstanceType> snippets[] = { |
| 1506 {"var a = 1;", | 1481 {"var a = 1;", |
| 1507 5 * kPointerSize, | 1482 5 * kPointerSize, |
| 1508 1, | 1483 1, |
| 1509 45, | 1484 45, |
| 1510 { | 1485 { |
| 1511 B(Ldar), R(Register::function_closure().index()), // | 1486 B(Ldar), R(Register::function_closure().index()), // |
| 1512 B(Star), R(2), // | 1487 B(Star), R(2), // |
| 1513 B(LdaConstant), U8(0), // | 1488 B(LdaConstant), U8(0), // |
| 1514 B(Star), R(3), // | 1489 B(Star), R(3), // |
| 1515 B(CallRuntime), U16(Runtime::kNewScriptContext), R(2), U8(2), // | 1490 B(CallRuntime), U16(Runtime::kNewScriptContext), R(2), U8(2), // |
| 1516 B(PushContext), R(1), // | 1491 B(PushContext), R(1), // |
| 1517 B(LdaConstant), U8(1), // | 1492 B(LdaConstant), U8(1), // |
| 1518 B(Star), R(2), // | 1493 B(Star), R(2), // |
| 1519 B(LdaZero), // | 1494 B(LdaZero), // |
| 1520 B(Star), R(3), // | 1495 B(Star), R(3), // |
| 1521 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(2), U8(2), // | 1496 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(2), U8(2), // |
| 1522 B(LdaConstant), U8(2), // | 1497 B(LdaConstant), U8(2), // |
| 1523 B(Star), R(2), // | 1498 B(Star), R(2), // |
| 1524 B(LdaZero), // | 1499 B(LdaZero), // |
| 1525 B(Star), R(3), // | 1500 B(Star), R(3), // |
| 1526 B(LdaSmi8), U8(1), // | 1501 B(LdaSmi8), U8(1), // |
| 1527 B(Star), R(4), // | 1502 B(Star), R(4), // |
| 1528 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), // | 1503 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), U8(3), // |
| 1529 U8(3), // | 1504 B(LdaUndefined), // |
| 1530 B(LdaUndefined), // | 1505 B(Return), // |
| 1531 B(Return) // | |
| 1532 }, | 1506 }, |
| 1533 3, | 1507 3, |
| 1534 {InstanceType::FIXED_ARRAY_TYPE, | 1508 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::FIXED_ARRAY_TYPE, |
| 1535 InstanceType::FIXED_ARRAY_TYPE, | |
| 1536 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | 1509 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
| 1537 {"function f() {}", | 1510 {"function f() {}", |
| 1538 3 * kPointerSize, | 1511 3 * kPointerSize, |
| 1539 1, | 1512 1, |
| 1540 29, | 1513 29, |
| 1541 { | 1514 { |
| 1542 B(Ldar), R(Register::function_closure().index()), // | 1515 B(Ldar), R(Register::function_closure().index()), // |
| 1543 B(Star), R(1), // | 1516 B(Star), R(1), // |
| 1544 B(LdaConstant), U8(0), // | 1517 B(LdaConstant), U8(0), // |
| 1545 B(Star), R(2), // | 1518 B(Star), R(2), // |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1571 B(LdaZero), // | 1544 B(LdaZero), // |
| 1572 B(Star), R(3), // | 1545 B(Star), R(3), // |
| 1573 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(2), U8(2), // | 1546 B(CallRuntime), U16(Runtime::kDeclareGlobals), R(2), U8(2), // |
| 1574 B(LdaConstant), U8(2), // | 1547 B(LdaConstant), U8(2), // |
| 1575 B(Star), R(2), // | 1548 B(Star), R(2), // |
| 1576 B(LdaZero), // | 1549 B(LdaZero), // |
| 1577 B(Star), R(3), // | 1550 B(Star), R(3), // |
| 1578 B(LdaSmi8), U8(1), // | 1551 B(LdaSmi8), U8(1), // |
| 1579 B(Star), R(4), // | 1552 B(Star), R(4), // |
| 1580 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), // | 1553 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), // |
| 1581 U8(3), // | 1554 U8(3), // |
| 1582 B(LdaSmi8), U8(2), // | 1555 B(LdaSmi8), U8(2), // |
| 1583 B(StaGlobalSloppy), _, // | 1556 B(StaGlobalSloppy), _, // |
| 1584 B(Star), R(0), // | 1557 B(Star), R(0), // |
| 1585 B(Ldar), R(0), // | 1558 B(Ldar), R(0), // |
| 1586 B(Return) // | 1559 B(Return) // |
| 1587 }, | 1560 }, |
| 1588 3, | 1561 3, |
| 1589 {InstanceType::FIXED_ARRAY_TYPE, | 1562 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::FIXED_ARRAY_TYPE, |
| 1590 InstanceType::FIXED_ARRAY_TYPE, | |
| 1591 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | 1563 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
| 1592 {"function f() {}\nf();", | 1564 {"function f() {}\nf();", |
| 1593 4 * kPointerSize, | 1565 4 * kPointerSize, |
| 1594 1, | 1566 1, |
| 1595 43, | 1567 43, |
| 1596 { | 1568 { |
| 1597 B(Ldar), R(Register::function_closure().index()), // | 1569 B(Ldar), R(Register::function_closure().index()), // |
| 1598 B(Star), R(2), // | 1570 B(Star), R(2), // |
| 1599 B(LdaConstant), U8(0), // | 1571 B(LdaConstant), U8(0), // |
| 1600 B(Star), R(3), // | 1572 B(Star), R(3), // |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1627 | 1599 |
| 1628 | 1600 |
| 1629 TEST(BasicLoops) { | 1601 TEST(BasicLoops) { |
| 1630 InitializedHandleScope handle_scope; | 1602 InitializedHandleScope handle_scope; |
| 1631 BytecodeGeneratorHelper helper; | 1603 BytecodeGeneratorHelper helper; |
| 1632 | 1604 |
| 1633 ExpectedSnippet<int> snippets[] = { | 1605 ExpectedSnippet<int> snippets[] = { |
| 1634 {"var x = 0;" | 1606 {"var x = 0;" |
| 1635 "var y = 1;" | 1607 "var y = 1;" |
| 1636 "while (x < 10) {" | 1608 "while (x < 10) {" |
| 1637 " y = y * 10;" | 1609 " y = y * 12;" |
| 1638 " x = x + 1;" | 1610 " x = x + 1;" |
| 1639 "}" | 1611 "}" |
| 1640 "return y;", | 1612 "return y;", |
| 1641 3 * kPointerSize, | 1613 2 * kPointerSize, |
| 1642 1, | 1614 1, |
| 1643 42, | 1615 30, |
| 1644 { | 1616 { |
| 1645 B(LdaZero), // | 1617 B(LdaZero), // |
| 1646 B(Star), R(0), // | 1618 B(Star), R(0), // |
| 1647 B(LdaSmi8), U8(1), // | 1619 B(LdaSmi8), U8(1), // |
| 1648 B(Star), R(1), // | 1620 B(Star), R(1), // |
| 1649 B(Jump), U8(22), // | 1621 B(Jump), U8(14), // |
| 1650 B(Ldar), R(1), // | 1622 B(LdaSmi8), U8(12), // |
| 1651 B(Star), R(2), // | 1623 B(Mul), R(1), // |
| 1624 B(Star), R(1), // |
| 1625 B(LdaSmi8), U8(1), // |
| 1626 B(Add), R(0), // |
| 1627 B(Star), R(0), // |
| 1652 B(LdaSmi8), U8(10), // | 1628 B(LdaSmi8), U8(10), // |
| 1653 B(Mul), R(2), // | 1629 B(TestLessThan), R(0), // |
| 1654 B(Star), R(1), // | 1630 B(JumpIfTrue), U8(-16), // |
| 1655 B(Ldar), R(0), // | |
| 1656 B(Star), R(2), // | |
| 1657 B(LdaSmi8), U8(1), // | |
| 1658 B(Add), R(2), // | |
| 1659 B(Star), R(0), // | |
| 1660 B(Ldar), R(0), // | |
| 1661 B(Star), R(2), // | |
| 1662 B(LdaSmi8), U8(10), // | |
| 1663 B(TestLessThan), R(2), // | |
| 1664 B(JumpIfTrue), U8(-28), // | |
| 1665 B(Ldar), R(1), // | 1631 B(Ldar), R(1), // |
| 1666 B(Return), // | 1632 B(Return), // |
| 1667 }, | 1633 }, |
| 1668 0}, | 1634 0}, |
| 1669 {"var i = 0;" | 1635 {"var i = 0;" |
| 1670 "while(true) {" | 1636 "while(true) {" |
| 1671 " if (i < 0) continue;" | 1637 " if (i < 0) continue;" |
| 1672 " if (i == 3) break;" | 1638 " if (i == 3) break;" |
| 1673 " if (i == 4) break;" | 1639 " if (i == 4) break;" |
| 1674 " if (i == 10) continue;" | 1640 " if (i == 10) continue;" |
| 1675 " if (i == 5) break;" | 1641 " if (i == 5) break;" |
| 1676 " i = i + 1;" | 1642 " i = i + 1;" |
| 1677 "}" | 1643 "}" |
| 1678 "return i;", | 1644 "return i;", |
| 1679 2 * kPointerSize, | 1645 1 * kPointerSize, |
| 1680 1, | 1646 1, |
| 1681 80, | 1647 56, |
| 1682 { | 1648 { |
| 1683 B(LdaZero), // | 1649 B(LdaZero), // |
| 1684 B(Star), R(0), // | 1650 B(Star), R(0), // |
| 1685 B(Jump), U8(71), // | 1651 B(Jump), U8(47), // |
| 1686 B(Ldar), R(0), // | |
| 1687 B(Star), R(1), // | |
| 1688 B(LdaZero), // | 1652 B(LdaZero), // |
| 1689 B(TestLessThan), R(1), // | 1653 B(TestLessThan), R(0), // |
| 1690 B(JumpIfFalse), U8(4), // | 1654 B(JumpIfFalse), U8(4), // |
| 1691 B(Jump), U8(60), // | 1655 B(Jump), U8(40), // |
| 1692 B(Ldar), R(0), // | |
| 1693 B(Star), R(1), // | |
| 1694 B(LdaSmi8), U8(3), // | 1656 B(LdaSmi8), U8(3), // |
| 1695 B(TestEqual), R(1), // | 1657 B(TestEqual), R(0), // |
| 1696 B(JumpIfFalse), U8(4), // | 1658 B(JumpIfFalse), U8(4), // |
| 1697 B(Jump), U8(51), // | 1659 B(Jump), U8(35), // |
| 1698 B(Ldar), R(0), // | |
| 1699 B(Star), R(1), // | |
| 1700 B(LdaSmi8), U8(4), // | 1660 B(LdaSmi8), U8(4), // |
| 1701 B(TestEqual), R(1), // | 1661 B(TestEqual), R(0), // |
| 1702 B(JumpIfFalse), U8(4), // | 1662 B(JumpIfFalse), U8(4), // |
| 1703 B(Jump), U8(39), // | 1663 B(Jump), U8(27), // |
| 1704 B(Ldar), R(0), // | |
| 1705 B(Star), R(1), // | |
| 1706 B(LdaSmi8), U8(10), // | 1664 B(LdaSmi8), U8(10), // |
| 1707 B(TestEqual), R(1), // | 1665 B(TestEqual), R(0), // |
| 1708 B(JumpIfFalse), U8(4), // | 1666 B(JumpIfFalse), U8(4), // |
| 1709 B(Jump), U8(24), // | 1667 B(Jump), U8(16), // |
| 1710 B(Ldar), R(0), // | |
| 1711 B(Star), R(1), // | |
| 1712 B(LdaSmi8), U8(5), // | 1668 B(LdaSmi8), U8(5), // |
| 1713 B(TestEqual), R(1), // | 1669 B(TestEqual), R(0), // |
| 1714 B(JumpIfFalse), U8(4), // | 1670 B(JumpIfFalse), U8(4), // |
| 1715 B(Jump), U8(15), // | 1671 B(Jump), U8(11), // |
| 1716 B(Ldar), R(0), // | |
| 1717 B(Star), R(1), // | |
| 1718 B(LdaSmi8), U8(1), // | 1672 B(LdaSmi8), U8(1), // |
| 1719 B(Add), R(1), // | 1673 B(Add), R(0), // |
| 1720 B(Star), R(0), // | 1674 B(Star), R(0), // |
| 1721 B(LdaTrue), // | 1675 B(LdaTrue), // |
| 1722 B(JumpIfTrue), U8(-70), // | 1676 B(JumpIfTrue), U8(-46), // |
| 1723 B(Ldar), R(0), // | 1677 B(Ldar), R(0), // |
| 1724 B(Return) // | 1678 B(Return), // |
| 1725 }, | 1679 }, |
| 1726 0}, | 1680 0}, |
| 1727 {"var x = 0; var y = 1;" | 1681 {"var x = 0; var y = 1;" |
| 1728 "do {" | 1682 "do {" |
| 1729 " y = y * 10;" | 1683 " y = y * 10;" |
| 1730 " if (x == 5) break;" | 1684 " if (x == 5) break;" |
| 1731 " if (x == 6) continue;" | 1685 " if (x == 6) continue;" |
| 1732 " x = x + 1;" | 1686 " x = x + 1;" |
| 1733 "} while (x < 10);" | 1687 "} while (x < 10);" |
| 1734 "return y;", | 1688 "return y;", |
| 1735 3 * kPointerSize, | 1689 2 * kPointerSize, |
| 1736 1, | 1690 1, |
| 1737 64, | 1691 44, |
| 1738 { | 1692 { |
| 1739 B(LdaZero), // | 1693 B(LdaZero), // |
| 1740 B(Star), R(0), // | 1694 B(Star), R(0), // |
| 1741 B(LdaSmi8), U8(1), // | 1695 B(LdaSmi8), U8(1), // |
| 1742 B(Star), R(1), // | 1696 B(Star), R(1), // |
| 1697 B(LdaSmi8), U8(10), // |
| 1698 B(Mul), R(1), // |
| 1699 B(Star), R(1), // |
| 1700 B(LdaSmi8), U8(5), // |
| 1701 B(TestEqual), R(0), // |
| 1702 B(JumpIfFalse), U8(4), // |
| 1703 B(Jump), U8(22), // |
| 1704 B(LdaSmi8), U8(6), // |
| 1705 B(TestEqual), R(0), // |
| 1706 B(JumpIfFalse), U8(4), // |
| 1707 B(Jump), U8(8), // |
| 1708 B(LdaSmi8), U8(1), // |
| 1709 B(Add), R(0), // |
| 1710 B(Star), R(0), // |
| 1711 B(LdaSmi8), U8(10), // |
| 1712 B(TestLessThan), R(0), // |
| 1713 B(JumpIfTrue), U8(-32), // |
| 1743 B(Ldar), R(1), // | 1714 B(Ldar), R(1), // |
| 1744 B(Star), R(2), // | 1715 B(Return), // |
| 1745 B(LdaSmi8), U8(10), // | |
| 1746 B(Mul), R(2), // | |
| 1747 B(Star), R(1), // | |
| 1748 B(Ldar), R(0), // | |
| 1749 B(Star), R(2), // | |
| 1750 B(LdaSmi8), U8(5), // | |
| 1751 B(TestEqual), R(2), // | |
| 1752 B(JumpIfFalse), U8(4), // | |
| 1753 B(Jump), U8(34), // | |
| 1754 B(Ldar), R(0), // | |
| 1755 B(Star), R(2), // | |
| 1756 B(LdaSmi8), U8(6), // | |
| 1757 B(TestEqual), R(2), // | |
| 1758 B(JumpIfFalse), U8(4), // | |
| 1759 B(Jump), U8(12), // | |
| 1760 B(Ldar), R(0), // | |
| 1761 B(Star), R(2), // | |
| 1762 B(LdaSmi8), U8(1), // | |
| 1763 B(Add), R(2), // | |
| 1764 B(Star), R(0), // | |
| 1765 B(Ldar), R(0), // | |
| 1766 B(Star), R(2), // | |
| 1767 B(LdaSmi8), U8(10), // | |
| 1768 B(TestLessThan), R(2), // | |
| 1769 B(JumpIfTrue), U8(-52), // | |
| 1770 B(Ldar), R(1), // | |
| 1771 B(Return) // | |
| 1772 }, | 1716 }, |
| 1773 0}, | 1717 0}, |
| 1774 {"var x = 0; " | 1718 {"var x = 0; " |
| 1775 "for(;;) {" | 1719 "for(;;) {" |
| 1776 " if (x == 1) break;" | 1720 " if (x == 1) break;" |
| 1777 " x = x + 1;" | 1721 " x = x + 1;" |
| 1778 "}", | 1722 "}", |
| 1779 2 * kPointerSize, | 1723 1 * kPointerSize, |
| 1780 1, | 1724 1, |
| 1781 29, | 1725 21, |
| 1782 { | 1726 { |
| 1783 B(LdaZero), // | 1727 B(LdaZero), // |
| 1784 B(Star), R(0), // | 1728 B(Star), R(0), // |
| 1785 B(Ldar), R(0), // | |
| 1786 B(Star), R(1), // | |
| 1787 B(LdaSmi8), U8(1), // | 1729 B(LdaSmi8), U8(1), // |
| 1788 B(TestEqual), R(1), // | 1730 B(TestEqual), R(0), // |
| 1789 B(JumpIfFalse), U8(4), // | 1731 B(JumpIfFalse), U8(4), // |
| 1790 B(Jump), U8(14), // | 1732 B(Jump), U8(10), // |
| 1791 B(Ldar), R(0), // | |
| 1792 B(Star), R(1), // | |
| 1793 B(LdaSmi8), U8(1), // | 1733 B(LdaSmi8), U8(1), // |
| 1794 B(Add), R(1), // | 1734 B(Add), R(0), // |
| 1795 B(Star), R(0), // | 1735 B(Star), R(0), // |
| 1796 B(Jump), U8(-22), // | 1736 B(Jump), U8(-14), // |
| 1797 B(LdaUndefined), // | 1737 B(LdaUndefined), // |
| 1798 B(Return), // | 1738 B(Return), // |
| 1799 }, | 1739 }, |
| 1800 0}, | 1740 0}, |
| 1801 {"var u = 0;" | 1741 {"var u = 0;" |
| 1802 "for(var i = 0; i < 100; i = i + 1) {" | 1742 "for(var i = 0; i < 100; i = i + 1) {" |
| 1803 " u = u + 1;" | 1743 " u = u + 1;" |
| 1804 " continue;" | 1744 " continue;" |
| 1805 "}", | 1745 "}", |
| 1806 3 * kPointerSize, | 1746 2 * kPointerSize, |
| 1807 1, | 1747 1, |
| 1808 42, | 1748 30, |
| 1809 { | 1749 { |
| 1810 B(LdaZero), // | 1750 B(LdaZero), // |
| 1811 B(Star), R(0), // | 1751 B(Star), R(0), // |
| 1812 B(LdaZero), // | 1752 B(LdaZero), // |
| 1813 B(Star), R(1), // | 1753 B(Star), R(1), // |
| 1814 B(Jump), U8(24), // | 1754 B(Jump), U8(16), // |
| 1815 B(Ldar), R(0), // | |
| 1816 B(Star), R(2), // | |
| 1817 B(LdaSmi8), U8(1), // | 1755 B(LdaSmi8), U8(1), // |
| 1818 B(Add), R(2), // | 1756 B(Add), R(0), // |
| 1819 B(Star), R(0), // | 1757 B(Star), R(0), // |
| 1820 B(Jump), U8(2), // | 1758 B(Jump), U8(2), // |
| 1821 B(Ldar), R(1), // | |
| 1822 B(Star), R(2), // | |
| 1823 B(LdaSmi8), U8(1), // | 1759 B(LdaSmi8), U8(1), // |
| 1824 B(Add), R(2), // | 1760 B(Add), R(1), // |
| 1825 B(Star), R(1), // | 1761 B(Star), R(1), // |
| 1826 B(Ldar), R(1), // | |
| 1827 B(Star), R(2), // | |
| 1828 B(LdaSmi8), U8(100), // | 1762 B(LdaSmi8), U8(100), // |
| 1829 B(TestLessThan), R(2), // | 1763 B(TestLessThan), R(1), // |
| 1830 B(JumpIfTrue), U8(-30), // | 1764 B(JumpIfTrue), U8(-18), // |
| 1831 B(LdaUndefined), // | 1765 B(LdaUndefined), // |
| 1832 B(Return), // | 1766 B(Return), // |
| 1833 }, | 1767 }, |
| 1834 0}, | 1768 0}, |
| 1835 {"var i = 0;" | 1769 {"var i = 0;" |
| 1836 "while(true) {" | 1770 "while(true) {" |
| 1837 " while (i < 3) {" | 1771 " while (i < 3) {" |
| 1838 " if (i == 2) break;" | 1772 " if (i == 2) break;" |
| 1839 " i = i + 1;" | 1773 " i = i + 1;" |
| 1840 " }" | 1774 " }" |
| 1841 " i = i + 1;" | 1775 " i = i + 1;" |
| 1842 " break;" | 1776 " break;" |
| 1843 "}" | 1777 "}" |
| 1844 "return i;", | 1778 "return i;", |
| 1845 2 * kPointerSize, | 1779 1 * kPointerSize, |
| 1846 1, | 1780 1, |
| 1847 57, | 1781 41, |
| 1848 { | 1782 { |
| 1849 B(LdaZero), // | 1783 B(LdaZero), // |
| 1850 B(Star), R(0), // | 1784 B(Star), R(0), // |
| 1851 B(Jump), U8(48), // | 1785 B(Jump), U8(32), // |
| 1852 B(Jump), U8(24), // | 1786 B(Jump), U8(16), // |
| 1853 B(Ldar), R(0), // | |
| 1854 B(Star), R(1), // | |
| 1855 B(LdaSmi8), U8(2), // | 1787 B(LdaSmi8), U8(2), // |
| 1856 B(TestEqual), R(1), // | 1788 B(TestEqual), R(0), // |
| 1857 B(JumpIfFalse), U8(4), // | 1789 B(JumpIfFalse), U8(4), // |
| 1858 B(Jump), U8(22), // | 1790 B(Jump), U8(14), // |
| 1859 B(Ldar), R(0), // | |
| 1860 B(Star), R(1), // | |
| 1861 B(LdaSmi8), U8(1), // | 1791 B(LdaSmi8), U8(1), // |
| 1862 B(Add), R(1), // | 1792 B(Add), R(0), // |
| 1863 B(Star), R(0), // | 1793 B(Star), R(0), // |
| 1864 B(Ldar), R(0), // | |
| 1865 B(Star), R(1), // | |
| 1866 B(LdaSmi8), U8(3), // | 1794 B(LdaSmi8), U8(3), // |
| 1867 B(TestLessThan), R(1), // | 1795 B(TestLessThan), R(0), // |
| 1868 B(JumpIfTrue), U8(-30), // | 1796 B(JumpIfTrue), U8(-18), // |
| 1869 B(Ldar), R(0), // | |
| 1870 B(Star), R(1), // | |
| 1871 B(LdaSmi8), U8(1), // | 1797 B(LdaSmi8), U8(1), // |
| 1872 B(Add), R(1), // | 1798 B(Add), R(0), // |
| 1873 B(Star), R(0), // | 1799 B(Star), R(0), // |
| 1874 B(Jump), U8(5), // | 1800 B(Jump), U8(5), // |
| 1875 B(LdaTrue), // | 1801 B(LdaTrue), // |
| 1876 B(JumpIfTrue), U8(-47), // | 1802 B(JumpIfTrue), U8(-31), // |
| 1877 B(Ldar), R(0), // | 1803 B(Ldar), R(0), // |
| 1878 B(Return), // | 1804 B(Return), // |
| 1879 }, | 1805 }, |
| 1880 0}, | 1806 0}, |
| 1881 }; | 1807 }; |
| 1882 | 1808 |
| 1883 for (size_t i = 0; i < arraysize(snippets); i++) { | 1809 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 1884 Handle<BytecodeArray> bytecode_array = | 1810 Handle<BytecodeArray> bytecode_array = |
| 1885 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 1811 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| 1886 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 1812 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 1887 } | 1813 } |
| 1888 } | 1814 } |
| 1889 | 1815 |
| 1890 | 1816 |
| 1891 TEST(UnaryOperators) { | 1817 TEST(UnaryOperators) { |
| 1892 InitializedHandleScope handle_scope; | 1818 InitializedHandleScope handle_scope; |
| 1893 BytecodeGeneratorHelper helper; | 1819 BytecodeGeneratorHelper helper; |
| 1894 | 1820 |
| 1895 ExpectedSnippet<int> snippets[] = { | 1821 ExpectedSnippet<int> snippets[] = { |
| 1896 {"var x = 0;" | 1822 {"var x = 0;" |
| 1897 "while (x != 10) {" | 1823 "while (x != 10) {" |
| 1898 " x = x + 10;" | 1824 " x = x + 10;" |
| 1899 "}" | 1825 "}" |
| 1900 "return x;", | 1826 "return x;", |
| 1901 2 * kPointerSize, | 1827 kPointerSize, |
| 1902 1, | 1828 1, |
| 1903 29, | 1829 21, |
| 1904 { | 1830 { |
| 1905 B(LdaZero), // | 1831 B(LdaZero), // |
| 1906 B(Star), R(0), // | 1832 B(Star), R(0), // |
| 1907 B(Jump), U8(12), // | 1833 B(Jump), U8(8), // |
| 1908 B(Ldar), R(0), // | |
| 1909 B(Star), R(1), // | |
| 1910 B(LdaSmi8), U8(10), // | 1834 B(LdaSmi8), U8(10), // |
| 1911 B(Add), R(1), // | 1835 B(Add), R(0), // |
| 1912 B(Star), R(0), // | 1836 B(Star), R(0), // |
| 1913 B(Ldar), R(0), // | |
| 1914 B(Star), R(1), // | |
| 1915 B(LdaSmi8), U8(10), // | 1837 B(LdaSmi8), U8(10), // |
| 1916 B(TestEqual), R(1), // | 1838 B(TestEqual), R(0), // |
| 1917 B(LogicalNot), // | 1839 B(LogicalNot), // |
| 1918 B(JumpIfTrue), U8(-19), // | 1840 B(JumpIfTrue), U8(-11), // |
| 1919 B(Ldar), R(0), // | 1841 B(Ldar), R(0), // |
| 1920 B(Return), // | 1842 B(Return), // |
| 1921 }, | 1843 }, |
| 1922 0}, | 1844 0}, |
| 1923 {"var x = false;" | 1845 {"var x = false;" |
| 1924 "do {" | 1846 "do {" |
| 1925 " x = !x;" | 1847 " x = !x;" |
| 1926 "} while(x == false);" | 1848 "} while(x == false);" |
| 1927 "return x;", | 1849 "return x;", |
| 1928 2 * kPointerSize, | 1850 kPointerSize, |
| 1929 1, | 1851 1, |
| 1930 20, | 1852 16, |
| 1931 { | 1853 { |
| 1932 B(LdaFalse), // | 1854 B(LdaFalse), // |
| 1933 B(Star), R(0), // | 1855 B(Star), R(0), // |
| 1934 B(Ldar), R(0), // | 1856 B(Ldar), R(0), // |
| 1935 B(LogicalNot), // | 1857 B(LogicalNot), // |
| 1936 B(Star), R(0), // | 1858 B(Star), R(0), // |
| 1937 B(Ldar), R(0), // | 1859 B(LdaFalse), // |
| 1938 B(Star), R(1), // | 1860 B(TestEqual), R(0), // |
| 1939 B(LdaFalse), // | 1861 B(JumpIfTrue), U8(-8), // |
| 1940 B(TestEqual), R(1), // | 1862 B(Ldar), R(0), // |
| 1941 B(JumpIfTrue), U8(-12), // | 1863 B(Return), // |
| 1942 B(Ldar), R(0), // | |
| 1943 B(Return), // | |
| 1944 }, | 1864 }, |
| 1945 0}, | 1865 0}, |
| 1946 {"var x = 101;" | 1866 {"var x = 101;" |
| 1947 "return void(x * 3);", | 1867 "return void(x * 3);", |
| 1948 2 * kPointerSize, | 1868 kPointerSize, |
| 1949 1, | 1869 1, |
| 1950 14, | 1870 10, |
| 1951 { | 1871 { |
| 1952 B(LdaSmi8), U8(101), // | 1872 B(LdaSmi8), U8(101), // |
| 1953 B(Star), R(0), // | 1873 B(Star), R(0), // |
| 1954 B(Ldar), R(0), // | |
| 1955 B(Star), R(1), // | |
| 1956 B(LdaSmi8), U8(3), // | 1874 B(LdaSmi8), U8(3), // |
| 1957 B(Mul), R(1), // | 1875 B(Mul), R(0), // |
| 1958 B(LdaUndefined), // | 1876 B(LdaUndefined), // |
| 1959 B(Return), // | 1877 B(Return), // |
| 1960 }, | 1878 }, |
| 1961 0}, | 1879 0}, |
| 1962 {"var x = 1234;" | 1880 {"var x = 1234;" |
| 1963 "var y = void (x * x - 1);" | 1881 "var y = void (x * x - 1);" |
| 1964 "return y;", | 1882 "return y;", |
| 1965 4 * kPointerSize, | 1883 3 * kPointerSize, |
| 1966 1, | 1884 1, |
| 1967 24, | 1885 20, |
| 1968 { | 1886 { |
| 1969 B(LdaConstant), U8(0), // | 1887 B(LdaConstant), U8(0), // |
| 1970 B(Star), R(0), // | 1888 B(Star), R(0), // |
| 1971 B(Ldar), R(0), // | 1889 B(Ldar), R(0), // |
| 1972 B(Star), R(3), // | 1890 B(Mul), R(0), // |
| 1973 B(Ldar), R(0), // | |
| 1974 B(Mul), R(3), // | |
| 1975 B(Star), R(2), // | 1891 B(Star), R(2), // |
| 1976 B(LdaSmi8), U8(1), // | 1892 B(LdaSmi8), U8(1), // |
| 1977 B(Sub), R(2), // | 1893 B(Sub), R(2), // |
| 1978 B(LdaUndefined), // | 1894 B(LdaUndefined), // |
| 1979 B(Star), R(1), // | 1895 B(Star), R(1), // |
| 1980 B(Ldar), R(1), // | 1896 B(Ldar), R(1), // |
| 1981 B(Return), // | 1897 B(Return), // |
| 1982 }, | 1898 }, |
| 1983 1, | 1899 1, |
| 1984 {1234}}, | 1900 {1234}}, |
| 1985 {"var x = 13;" | 1901 {"var x = 13;" |
| 1986 "return typeof(x);", | 1902 "return typeof(x);", |
| 1987 1 * kPointerSize, | 1903 kPointerSize, |
| 1988 1, | 1904 1, |
| 1989 8, | 1905 8, |
| 1990 { | 1906 { |
| 1991 B(LdaSmi8), U8(13), // | 1907 B(LdaSmi8), U8(13), // |
| 1992 B(Star), R(0), // | 1908 B(Star), R(0), // TODO(oth): Ldar R(X) following Star R(X) |
| 1993 B(Ldar), R(0), // | 1909 B(Ldar), R(0), // could be culled in bytecode array builder. |
| 1994 B(TypeOf), // | 1910 B(TypeOf), // |
| 1995 B(Return), // | 1911 B(Return), // |
| 1996 }, | 1912 }, |
| 1997 0}, | 1913 0}, |
| 1998 }; | 1914 }; |
| 1999 | 1915 |
| 2000 for (size_t i = 0; i < arraysize(snippets); i++) { | 1916 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 2001 Handle<BytecodeArray> bytecode_array = | 1917 Handle<BytecodeArray> bytecode_array = |
| 2002 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 1918 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| 2003 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 1919 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2154 1, | 2070 1, |
| 2155 6, | 2071 6, |
| 2156 { | 2072 { |
| 2157 B(LdaConstant), U8(0), // | 2073 B(LdaConstant), U8(0), // |
| 2158 B(CreateArrayLiteral), U8(0), U8(simple_flags), // | 2074 B(CreateArrayLiteral), U8(0), U8(simple_flags), // |
| 2159 B(Return) // | 2075 B(Return) // |
| 2160 }, | 2076 }, |
| 2161 1, | 2077 1, |
| 2162 {InstanceType::FIXED_ARRAY_TYPE}}, | 2078 {InstanceType::FIXED_ARRAY_TYPE}}, |
| 2163 {"var a = 1; return [ a, a + 1 ];", | 2079 {"var a = 1; return [ a, a + 1 ];", |
| 2164 4 * kPointerSize, | 2080 3 * kPointerSize, |
| 2165 1, | 2081 1, |
| 2166 39, | 2082 35, |
| 2167 { | 2083 { |
| 2168 B(LdaSmi8), U8(1), // | 2084 B(LdaSmi8), U8(1), // |
| 2169 B(Star), R(0), // | 2085 B(Star), R(0), // |
| 2170 B(LdaConstant), U8(0), // | 2086 B(LdaConstant), U8(0), // |
| 2171 B(CreateArrayLiteral), U8(0), U8(3), // | 2087 B(CreateArrayLiteral), U8(0), U8(3), // |
| 2172 B(Star), R(2), // | 2088 B(Star), R(2), // |
| 2173 B(LdaZero), // | 2089 B(LdaZero), // |
| 2174 B(Star), R(1), // | 2090 B(Star), R(1), // |
| 2175 B(Ldar), R(0), // | 2091 B(Ldar), R(0), // |
| 2176 B(KeyedStoreICSloppy), R(2), R(1), U8(vector->GetIndex(slot1)), // | 2092 B(KeyedStoreICSloppy), R(2), R(1), U8(vector->GetIndex(slot1)), // |
| 2177 B(LdaSmi8), U8(1), // | 2093 B(LdaSmi8), U8(1), // |
| 2178 B(Star), R(1), // | 2094 B(Star), R(1), // |
| 2179 B(Ldar), R(0), // | |
| 2180 B(Star), R(3), // | |
| 2181 B(LdaSmi8), U8(1), // | 2095 B(LdaSmi8), U8(1), // |
| 2182 B(Add), R(3), // | 2096 B(Add), R(0), // |
| 2183 B(KeyedStoreICSloppy), R(2), R(1), U8(vector->GetIndex(slot1)), // | 2097 B(KeyedStoreICSloppy), R(2), R(1), U8(vector->GetIndex(slot1)), // |
| 2184 B(Ldar), R(2), // | 2098 B(Ldar), R(2), // |
| 2185 B(Return) // | 2099 B(Return), // |
| 2186 }, | 2100 }, |
| 2187 1, | 2101 1, |
| 2188 {InstanceType::FIXED_ARRAY_TYPE}}, | 2102 {InstanceType::FIXED_ARRAY_TYPE}}, |
| 2189 {"return [ [ 1, 2 ], [ 3 ] ];", | 2103 {"return [ [ 1, 2 ], [ 3 ] ];", |
| 2190 0, | 2104 0, |
| 2191 1, | 2105 1, |
| 2192 6, | 2106 6, |
| 2193 { | 2107 { |
| 2194 B(LdaConstant), U8(0), // | 2108 B(LdaConstant), U8(0), // |
| 2195 B(CreateArrayLiteral), U8(2), U8(deep_elements_flags), // | 2109 B(CreateArrayLiteral), U8(2), U8(deep_elements_flags), // |
| 2196 B(Return) // | 2110 B(Return) // |
| 2197 }, | 2111 }, |
| 2198 1, | 2112 1, |
| 2199 {InstanceType::FIXED_ARRAY_TYPE}}, | 2113 {InstanceType::FIXED_ARRAY_TYPE}}, |
| 2200 {"var a = 1; return [ [ a, 2 ], [ a + 2 ] ];", | 2114 {"var a = 1; return [ [ a, 2 ], [ a + 2 ] ];", |
| 2201 6 * kPointerSize, | 2115 5 * kPointerSize, |
| 2202 1, | 2116 1, |
| 2203 71, | 2117 67, |
| 2204 { | 2118 { |
| 2205 B(LdaSmi8), U8(1), // | 2119 B(LdaSmi8), U8(1), // |
| 2206 B(Star), R(0), // | 2120 B(Star), R(0), // |
| 2207 B(LdaConstant), U8(0), // | 2121 B(LdaConstant), U8(0), // |
| 2208 B(CreateArrayLiteral), U8(2), U8(deep_elements_flags), // | 2122 B(CreateArrayLiteral), U8(2), U8(deep_elements_flags), // |
| 2209 B(Star), R(2), // | 2123 B(Star), R(2), // |
| 2210 B(LdaZero), // | 2124 B(LdaZero), // |
| 2211 B(Star), R(1), // | 2125 B(Star), R(1), // |
| 2212 B(LdaConstant), U8(1), // | 2126 B(LdaConstant), U8(1), // |
| 2213 B(CreateArrayLiteral), U8(0), U8(simple_flags), // | 2127 B(CreateArrayLiteral), U8(0), U8(simple_flags), // |
| 2214 B(Star), R(4), // | 2128 B(Star), R(4), // |
| 2215 B(LdaZero), // | 2129 B(LdaZero), // |
| 2216 B(Star), R(3), // | 2130 B(Star), R(3), // |
| 2217 B(Ldar), R(0), // | 2131 B(Ldar), R(0), // |
| 2218 B(KeyedStoreICSloppy), R(4), R(3), U8(vector->GetIndex(slot1)), // | 2132 B(KeyedStoreICSloppy), R(4), R(3), U8(vector->GetIndex(slot1)), // |
| 2219 B(Ldar), R(4), // | 2133 B(Ldar), R(4), // |
| 2220 B(KeyedStoreICSloppy), R(2), R(1), U8(vector->GetIndex(slot3)), // | 2134 B(KeyedStoreICSloppy), R(2), R(1), U8(vector->GetIndex(slot3)), // |
| 2221 B(LdaSmi8), U8(1), // | 2135 B(LdaSmi8), U8(1), // |
| 2222 B(Star), R(1), // | 2136 B(Star), R(1), // |
| 2223 B(LdaConstant), U8(2), // | 2137 B(LdaConstant), U8(2), // |
| 2224 B(CreateArrayLiteral), U8(1), U8(simple_flags), // | 2138 B(CreateArrayLiteral), U8(1), U8(simple_flags), // |
| 2225 B(Star), R(4), // | 2139 B(Star), R(4), // |
| 2226 B(LdaZero), // | 2140 B(LdaZero), // |
| 2227 B(Star), R(3), // | 2141 B(Star), R(3), // |
| 2228 B(Ldar), R(0), // | |
| 2229 B(Star), R(5), // | |
| 2230 B(LdaSmi8), U8(2), // | 2142 B(LdaSmi8), U8(2), // |
| 2231 B(Add), R(5), // | 2143 B(Add), R(0), // |
| 2232 B(KeyedStoreICSloppy), R(4), R(3), U8(vector->GetIndex(slot2)), // | 2144 B(KeyedStoreICSloppy), R(4), R(3), U8(vector->GetIndex(slot2)), // |
| 2233 B(Ldar), R(4), // | 2145 B(Ldar), R(4), // |
| 2234 B(KeyedStoreICSloppy), R(2), R(1), U8(vector->GetIndex(slot3)), // | 2146 B(KeyedStoreICSloppy), R(2), R(1), U8(vector->GetIndex(slot3)), // |
| 2235 B(Ldar), R(2), // | 2147 B(Ldar), R(2), // |
| 2236 B(Return), // | 2148 B(Return), // |
| 2237 }, | 2149 }, |
| 2238 3, | 2150 3, |
| 2239 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::FIXED_ARRAY_TYPE, | 2151 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::FIXED_ARRAY_TYPE, |
| 2240 InstanceType::FIXED_ARRAY_TYPE}}, | 2152 InstanceType::FIXED_ARRAY_TYPE}}, |
| 2241 }; | 2153 }; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2294 B(Star), R(2), // | 2206 B(Star), R(2), // |
| 2295 B(Ldar), R(0), // | 2207 B(Ldar), R(0), // |
| 2296 B(StoreICSloppy), R(1), R(2), U8(3), // | 2208 B(StoreICSloppy), R(1), R(2), U8(3), // |
| 2297 B(Ldar), R(1), // | 2209 B(Ldar), R(1), // |
| 2298 B(Return), // | 2210 B(Return), // |
| 2299 }, | 2211 }, |
| 2300 2, | 2212 2, |
| 2301 {InstanceType::FIXED_ARRAY_TYPE, | 2213 {InstanceType::FIXED_ARRAY_TYPE, |
| 2302 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | 2214 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
| 2303 {"var a = 1; return { val: a, val: a + 1 };", | 2215 {"var a = 1; return { val: a, val: a + 1 };", |
| 2304 4 * kPointerSize, | 2216 3 * kPointerSize, |
| 2305 1, | 2217 1, |
| 2306 32, | 2218 26, |
| 2307 { | 2219 { |
| 2308 B(LdaSmi8), U8(1), // | 2220 B(LdaSmi8), U8(1), // |
| 2309 B(Star), R(0), // | 2221 B(Star), R(0), // |
| 2310 B(LdaConstant), U8(0), // | 2222 B(LdaConstant), U8(0), // |
| 2311 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // | 2223 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
| 2312 B(Star), R(1), // | 2224 B(Star), R(1), // |
| 2313 B(Ldar), R(0), // | |
| 2314 B(LdaConstant), U8(1), // | 2225 B(LdaConstant), U8(1), // |
| 2315 B(Star), R(2), // | 2226 B(Star), R(2), // |
| 2316 B(Ldar), R(0), // | |
| 2317 B(Star), R(3), // | |
| 2318 B(LdaSmi8), U8(1), // | 2227 B(LdaSmi8), U8(1), // |
| 2319 B(Add), R(3), // | 2228 B(Add), R(0), // |
| 2320 B(StoreICSloppy), R(1), R(2), U8(3), // | 2229 B(StoreICSloppy), R(1), R(2), U8(3), // |
| 2321 B(Ldar), R(1), // | 2230 B(Ldar), R(1), // |
| 2322 B(Return), // | 2231 B(Return), // |
| 2323 }, | 2232 }, |
| 2324 2, | 2233 2, |
| 2325 {InstanceType::FIXED_ARRAY_TYPE, | 2234 {InstanceType::FIXED_ARRAY_TYPE, |
| 2326 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | 2235 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
| 2327 {"return { func: function() { } };", | 2236 {"return { func: function() { } };", |
| 2328 2 * kPointerSize, | 2237 2 * kPointerSize, |
| 2329 1, | 2238 1, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2375 B(LdaConstant), U8(1), // | 2284 B(LdaConstant), U8(1), // |
| 2376 B(Star), R(1), // | 2285 B(Star), R(1), // |
| 2377 B(LdaConstant), U8(2), // | 2286 B(LdaConstant), U8(2), // |
| 2378 B(CreateClosure), U8(0), // | 2287 B(CreateClosure), U8(0), // |
| 2379 B(Star), R(2), // | 2288 B(Star), R(2), // |
| 2380 B(LdaNull), // | 2289 B(LdaNull), // |
| 2381 B(Star), R(3), // | 2290 B(Star), R(3), // |
| 2382 B(LdaZero), // | 2291 B(LdaZero), // |
| 2383 B(Star), R(4), // | 2292 B(Star), R(4), // |
| 2384 B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), // | 2293 B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), // |
| 2385 R(0), U8(5), // | 2294 R(0), U8(5), // |
| 2386 B(Ldar), R(0), // | 2295 B(Ldar), R(0), // |
| 2387 B(Return), // | 2296 B(Return), // |
| 2388 }, | 2297 }, |
| 2389 3, | 2298 3, |
| 2390 {InstanceType::FIXED_ARRAY_TYPE, | 2299 {InstanceType::FIXED_ARRAY_TYPE, |
| 2391 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2300 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2392 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 2301 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 2393 {"return { get a() { return this.x; }, set a(val) { this.x = val } };", | 2302 {"return { get a() { return this.x; }, set a(val) { this.x = val } };", |
| 2394 5 * kPointerSize, | 2303 5 * kPointerSize, |
| 2395 1, | 2304 1, |
| 2396 34, | 2305 34, |
| 2397 { | 2306 { |
| 2398 B(LdaConstant), U8(0), // | 2307 B(LdaConstant), U8(0), // |
| 2399 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // | 2308 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
| 2400 B(Star), R(0), // | 2309 B(Star), R(0), // |
| 2401 B(LdaConstant), U8(1), // | 2310 B(LdaConstant), U8(1), // |
| 2402 B(Star), R(1), // | 2311 B(Star), R(1), // |
| 2403 B(LdaConstant), U8(2), // | 2312 B(LdaConstant), U8(2), // |
| 2404 B(CreateClosure), U8(0), // | 2313 B(CreateClosure), U8(0), // |
| 2405 B(Star), R(2), // | 2314 B(Star), R(2), // |
| 2406 B(LdaConstant), U8(3), // | 2315 B(LdaConstant), U8(3), // |
| 2407 B(CreateClosure), U8(0), // | 2316 B(CreateClosure), U8(0), // |
| 2408 B(Star), R(3), // | 2317 B(Star), R(3), // |
| 2409 B(LdaZero), // | 2318 B(LdaZero), // |
| 2410 B(Star), R(4), // | 2319 B(Star), R(4), // |
| 2411 B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), // | 2320 B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), // |
| 2412 R(0), U8(5), // | 2321 R(0), U8(5), // |
| 2413 B(Ldar), R(0), // | 2322 B(Ldar), R(0), // |
| 2414 B(Return), // | 2323 B(Return), // |
| 2415 }, | 2324 }, |
| 2416 4, | 2325 4, |
| 2417 {InstanceType::FIXED_ARRAY_TYPE, | 2326 {InstanceType::FIXED_ARRAY_TYPE, |
| 2418 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2327 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2419 InstanceType::SHARED_FUNCTION_INFO_TYPE, | 2328 InstanceType::SHARED_FUNCTION_INFO_TYPE, |
| 2420 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 2329 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 2421 {"return { set b(val) { this.y = val } };", | 2330 {"return { set b(val) { this.y = val } };", |
| 2422 5 * kPointerSize, | 2331 5 * kPointerSize, |
| 2423 1, | 2332 1, |
| 2424 31, | 2333 31, |
| 2425 { | 2334 { |
| 2426 B(LdaConstant), U8(0), // | 2335 B(LdaConstant), U8(0), // |
| 2427 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // | 2336 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
| 2428 B(Star), R(0), // | 2337 B(Star), R(0), // |
| 2429 B(LdaConstant), U8(1), // | 2338 B(LdaConstant), U8(1), // |
| 2430 B(Star), R(1), // | 2339 B(Star), R(1), // |
| 2431 B(LdaNull), // | 2340 B(LdaNull), // |
| 2432 B(Star), R(2), // | 2341 B(Star), R(2), // |
| 2433 B(LdaConstant), U8(2), // | 2342 B(LdaConstant), U8(2), // |
| 2434 B(CreateClosure), U8(0), // | 2343 B(CreateClosure), U8(0), // |
| 2435 B(Star), R(3), // | 2344 B(Star), R(3), // |
| 2436 B(LdaZero), // | 2345 B(LdaZero), // |
| 2437 B(Star), R(4), // | 2346 B(Star), R(4), // |
| 2438 B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), // | 2347 B(CallRuntime), U16(Runtime::kDefineAccessorPropertyUnchecked), // |
| 2439 R(0), U8(5), // | 2348 R(0), U8(5), // |
| 2440 B(Ldar), R(0), // | 2349 B(Ldar), R(0), // |
| 2441 B(Return), // | 2350 B(Return), // |
| 2442 }, | 2351 }, |
| 2443 3, | 2352 3, |
| 2444 {InstanceType::FIXED_ARRAY_TYPE, | 2353 {InstanceType::FIXED_ARRAY_TYPE, |
| 2445 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2354 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2446 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 2355 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 2447 {"var a = 1; return { 1: a };", | 2356 {"var a = 1; return { 1: a };", |
| 2448 5 * kPointerSize, | 2357 5 * kPointerSize, |
| 2449 1, | 2358 1, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2492 B(CreateObjectLiteral), U8(0), U8(simple_flags), // | 2401 B(CreateObjectLiteral), U8(0), U8(simple_flags), // |
| 2493 B(Star), R(1), // | 2402 B(Star), R(1), // |
| 2494 B(Ldar), R(0), // | 2403 B(Ldar), R(0), // |
| 2495 B(ToName), // | 2404 B(ToName), // |
| 2496 B(Star), R(2), // | 2405 B(Star), R(2), // |
| 2497 B(LdaSmi8), U8(1), // | 2406 B(LdaSmi8), U8(1), // |
| 2498 B(Star), R(3), // | 2407 B(Star), R(3), // |
| 2499 B(LdaZero), // | 2408 B(LdaZero), // |
| 2500 B(Star), R(4), // | 2409 B(Star), R(4), // |
| 2501 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // | 2410 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // |
| 2502 U8(4), // | 2411 U8(4), // |
| 2503 B(Ldar), R(1), // | 2412 B(Ldar), R(1), // |
| 2504 B(Return), // | 2413 B(Return), // |
| 2505 }, | 2414 }, |
| 2506 2, | 2415 2, |
| 2507 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2416 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2508 InstanceType::FIXED_ARRAY_TYPE}}, | 2417 InstanceType::FIXED_ARRAY_TYPE}}, |
| 2509 {"var a = 'test'; return { val: a, [a]: 1 }", | 2418 {"var a = 'test'; return { val: a, [a]: 1 }", |
| 2510 5 * kPointerSize, | 2419 5 * kPointerSize, |
| 2511 1, | 2420 1, |
| 2512 41, | 2421 41, |
| 2513 { | 2422 { |
| 2514 B(LdaConstant), U8(0), // | 2423 B(LdaConstant), U8(0), // |
| 2515 B(Star), R(0), // | 2424 B(Star), R(0), // |
| 2516 B(LdaConstant), U8(1), // | 2425 B(LdaConstant), U8(1), // |
| 2517 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // | 2426 B(CreateObjectLiteral), U8(0), U8(deep_elements_flags), // |
| 2518 B(Star), R(1), // | 2427 B(Star), R(1), // |
| 2519 B(LdaConstant), U8(2), // | 2428 B(LdaConstant), U8(2), // |
| 2520 B(Star), R(2), // | 2429 B(Star), R(2), // |
| 2521 B(Ldar), R(0), // | 2430 B(Ldar), R(0), // |
| 2522 B(StoreICSloppy), R(1), R(2), U8(3), // | 2431 B(StoreICSloppy), R(1), R(2), U8(3), // |
| 2523 B(Ldar), R(0), // | 2432 B(Ldar), R(0), // |
| 2524 B(ToName), // | 2433 B(ToName), // |
| 2525 B(Star), R(2), // | 2434 B(Star), R(2), // |
| 2526 B(LdaSmi8), U8(1), // | 2435 B(LdaSmi8), U8(1), // |
| 2527 B(Star), R(3), // | 2436 B(Star), R(3), // |
| 2528 B(LdaZero), // | 2437 B(LdaZero), // |
| 2529 B(Star), R(4), // | 2438 B(Star), R(4), // |
| 2530 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // | 2439 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // |
| 2531 U8(4), // | 2440 U8(4), // |
| 2532 B(Ldar), R(1), // | 2441 B(Ldar), R(1), // |
| 2533 B(Return), // | 2442 B(Return), // |
| 2534 }, | 2443 }, |
| 2535 3, | 2444 3, |
| 2536 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2445 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2537 InstanceType::FIXED_ARRAY_TYPE, | 2446 InstanceType::FIXED_ARRAY_TYPE, |
| 2538 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, | 2447 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE}}, |
| 2539 {"var a = 'test'; return { [a]: 1, __proto__: {} }", | 2448 {"var a = 'test'; return { [a]: 1, __proto__: {} }", |
| 2540 5 * kPointerSize, | 2449 5 * kPointerSize, |
| 2541 1, | 2450 1, |
| 2542 43, | 2451 43, |
| 2543 { | 2452 { |
| 2544 B(LdaConstant), U8(0), // | 2453 B(LdaConstant), U8(0), // |
| 2545 B(Star), R(0), // | 2454 B(Star), R(0), // |
| 2546 B(LdaConstant), U8(1), // | 2455 B(LdaConstant), U8(1), // |
| 2547 B(CreateObjectLiteral), U8(1), U8(simple_flags), // | 2456 B(CreateObjectLiteral), U8(1), U8(simple_flags), // |
| 2548 B(Star), R(1), // | 2457 B(Star), R(1), // |
| 2549 B(Ldar), R(0), // | 2458 B(Ldar), R(0), // |
| 2550 B(ToName), // | 2459 B(ToName), // |
| 2551 B(Star), R(2), // | 2460 B(Star), R(2), // |
| 2552 B(LdaSmi8), U8(1), // | 2461 B(LdaSmi8), U8(1), // |
| 2553 B(Star), R(3), // | 2462 B(Star), R(3), // |
| 2554 B(LdaZero), // | 2463 B(LdaZero), // |
| 2555 B(Star), R(4), // | 2464 B(Star), R(4), // |
| 2556 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // | 2465 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // |
| 2557 U8(4), // | 2466 U8(4), // |
| 2558 B(LdaConstant), U8(1), // | 2467 B(LdaConstant), U8(1), // |
| 2559 B(CreateObjectLiteral), U8(0), U8(13), // | 2468 B(CreateObjectLiteral), U8(0), U8(13), // |
| 2560 B(Star), R(2), // | 2469 B(Star), R(2), // |
| 2561 B(CallRuntime), U16(Runtime::kInternalSetPrototype), R(1), U8(2), // | 2470 B(CallRuntime), U16(Runtime::kInternalSetPrototype), R(1), U8(2), // |
| 2562 B(Ldar), R(1), // | 2471 B(Ldar), R(1), // |
| 2563 B(Return), // | 2472 B(Return), // |
| 2564 }, | 2473 }, |
| 2565 2, | 2474 2, |
| 2566 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2475 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2567 InstanceType::FIXED_ARRAY_TYPE}}, | 2476 InstanceType::FIXED_ARRAY_TYPE}}, |
| 2568 {"var n = 'name'; return { [n]: 'val', get a() { }, set a(b) {} };", | 2477 {"var n = 'name'; return { [n]: 'val', get a() { }, set a(b) {} };", |
| 2569 5 * kPointerSize, | 2478 5 * kPointerSize, |
| 2570 1, | 2479 1, |
| 2571 69, | 2480 69, |
| 2572 { | 2481 { |
| 2573 B(LdaConstant), U8(0), // | 2482 B(LdaConstant), U8(0), // |
| 2574 B(Star), R(0), // | 2483 B(Star), R(0), // |
| 2575 B(LdaConstant), U8(1), // | 2484 B(LdaConstant), U8(1), // |
| 2576 B(CreateObjectLiteral), U8(0), U8(simple_flags), // | 2485 B(CreateObjectLiteral), U8(0), U8(simple_flags), // |
| 2577 B(Star), R(1), // | 2486 B(Star), R(1), // |
| 2578 B(Ldar), R(0), // | 2487 B(Ldar), R(0), // |
| 2579 B(ToName), // | 2488 B(ToName), // |
| 2580 B(Star), R(2), // | 2489 B(Star), R(2), // |
| 2581 B(LdaConstant), U8(2), // | 2490 B(LdaConstant), U8(2), // |
| 2582 B(Star), R(3), // | 2491 B(Star), R(3), // |
| 2583 B(LdaZero), // | 2492 B(LdaZero), // |
| 2584 B(Star), R(4), // | 2493 B(Star), R(4), // |
| 2585 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // | 2494 B(CallRuntime), U16(Runtime::kDefineDataPropertyUnchecked), R(1), // |
| 2586 U8(4), // | 2495 U8(4), // |
| 2587 B(LdaConstant), U8(3), // | 2496 B(LdaConstant), U8(3), // |
| 2588 B(ToName), // | 2497 B(ToName), // |
| 2589 B(Star), R(2), // | 2498 B(Star), R(2), // |
| 2590 B(LdaConstant), U8(4), // | 2499 B(LdaConstant), U8(4), // |
| 2591 B(CreateClosure), U8(0), // | 2500 B(CreateClosure), U8(0), // |
| 2592 B(Star), R(3), // | 2501 B(Star), R(3), // |
| 2593 B(LdaZero), // | 2502 B(LdaZero), // |
| 2594 B(Star), R(4), // | 2503 B(Star), R(4), // |
| 2595 B(CallRuntime), U16(Runtime::kDefineGetterPropertyUnchecked), // | 2504 B(CallRuntime), U16(Runtime::kDefineGetterPropertyUnchecked), // |
| 2596 R(1), U8(4), // | 2505 R(1), U8(4), // |
| 2597 B(LdaConstant), U8(3), // | 2506 B(LdaConstant), U8(3), // |
| 2598 B(ToName), // | 2507 B(ToName), // |
| 2599 B(Star), R(2), // | 2508 B(Star), R(2), // |
| 2600 B(LdaConstant), U8(5), // | 2509 B(LdaConstant), U8(5), // |
| 2601 B(CreateClosure), U8(0), // | 2510 B(CreateClosure), U8(0), // |
| 2602 B(Star), R(3), // | 2511 B(Star), R(3), // |
| 2603 B(LdaZero), // | 2512 B(LdaZero), // |
| 2604 B(Star), R(4), // | 2513 B(Star), R(4), // |
| 2605 B(CallRuntime), U16(Runtime::kDefineSetterPropertyUnchecked), // | 2514 B(CallRuntime), U16(Runtime::kDefineSetterPropertyUnchecked), // |
| 2606 R(1), U8(4), // | 2515 R(1), U8(4), // |
| 2607 B(Ldar), R(1), // | 2516 B(Ldar), R(1), // |
| 2608 B(Return), // | 2517 B(Return), // |
| 2609 }, | 2518 }, |
| 2610 6, | 2519 6, |
| 2611 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2520 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2612 InstanceType::FIXED_ARRAY_TYPE, | 2521 InstanceType::FIXED_ARRAY_TYPE, |
| 2613 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2522 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2614 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2523 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2615 InstanceType::SHARED_FUNCTION_INFO_TYPE, | 2524 InstanceType::SHARED_FUNCTION_INFO_TYPE, |
| 2616 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 2525 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2658 B(LdaConstant), U8(4), // | 2567 B(LdaConstant), U8(4), // |
| 2659 B(Star), R(6), // | 2568 B(Star), R(6), // |
| 2660 B(LdaConstant), U8(5), // | 2569 B(LdaConstant), U8(5), // |
| 2661 B(CreateClosure), U8(1), // | 2570 B(CreateClosure), U8(1), // |
| 2662 B(StoreICSloppy), R(5), R(6), U8(3), // | 2571 B(StoreICSloppy), R(5), R(6), U8(3), // |
| 2663 B(CallRuntime), U16(Runtime::kToFastProperties), R(5), U8(1), // | 2572 B(CallRuntime), U16(Runtime::kToFastProperties), R(5), U8(1), // |
| 2664 B(Ldar), R(5), // | 2573 B(Ldar), R(5), // |
| 2665 B(Star), R(4), // | 2574 B(Star), R(4), // |
| 2666 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), U8(3), // | 2575 B(CallRuntime), U16(Runtime::kInitializeVarGlobal), R(2), U8(3), // |
| 2667 B(LdaUndefined), // | 2576 B(LdaUndefined), // |
| 2668 B(Return), // | 2577 B(Return), |
| 2669 }, | 2578 }, |
| 2670 6, | 2579 6, |
| 2671 {InstanceType::FIXED_ARRAY_TYPE, | 2580 {InstanceType::FIXED_ARRAY_TYPE, InstanceType::FIXED_ARRAY_TYPE, |
| 2672 InstanceType::FIXED_ARRAY_TYPE, | |
| 2673 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2581 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2674 InstanceType::FIXED_ARRAY_TYPE, | 2582 InstanceType::FIXED_ARRAY_TYPE, |
| 2675 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2583 InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, |
| 2676 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 2584 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 2677 }; | 2585 }; |
| 2678 | 2586 |
| 2679 for (size_t i = 0; i < arraysize(snippets); i++) { | 2587 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 2680 Handle<BytecodeArray> bytecode_array = | 2588 Handle<BytecodeArray> bytecode_array = |
| 2681 helper.MakeTopLevelBytecode(snippets[i].code_snippet); | 2589 helper.MakeTopLevelBytecode(snippets[i].code_snippet); |
| 2682 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 2590 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 2683 } | 2591 } |
| 2684 } | 2592 } |
| 2685 | 2593 |
| 2686 | 2594 |
| 2687 TEST(TryCatch) { | 2595 TEST(TryCatch) { |
| 2688 InitializedHandleScope handle_scope; | 2596 InitializedHandleScope handle_scope; |
| 2689 BytecodeGeneratorHelper helper; | 2597 BytecodeGeneratorHelper helper; |
| 2690 | 2598 |
| 2691 // TODO(rmcilroy): modify tests when we have real try catch support. | 2599 // TODO(rmcilroy): modify tests when we have real try catch support. |
| 2692 ExpectedSnippet<int> snippets[] = { | 2600 ExpectedSnippet<int> snippets[] = { |
| 2693 {"try { return 1; } catch(e) { return 2; }", | 2601 {"try { return 1; } catch(e) { return 2; }", |
| 2694 1 * kPointerSize, | 2602 kPointerSize, |
| 2695 1, | 2603 1, |
| 2696 5, | 2604 5, |
| 2697 { | 2605 { |
| 2698 B(LdaSmi8), U8(1), // | 2606 B(LdaSmi8), U8(1), // |
| 2699 B(Return), // | 2607 B(Return), // |
| 2700 B(LdaUndefined), // | 2608 B(LdaUndefined), // |
| 2701 B(Return), // | 2609 B(Return), // |
| 2702 }, | 2610 }, |
| 2703 0}, | 2611 0}, |
| 2704 }; | 2612 }; |
| 2705 | 2613 |
| 2706 for (size_t i = 0; i < arraysize(snippets); i++) { | 2614 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 2707 Handle<BytecodeArray> bytecode_array = | 2615 Handle<BytecodeArray> bytecode_array = |
| 2708 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 2616 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| 2709 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 2617 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 2710 } | 2618 } |
| 2711 } | 2619 } |
| 2712 | 2620 |
| 2713 | 2621 |
| 2714 TEST(TryFinally) { | 2622 TEST(TryFinally) { |
| 2715 InitializedHandleScope handle_scope; | 2623 InitializedHandleScope handle_scope; |
| 2716 BytecodeGeneratorHelper helper; | 2624 BytecodeGeneratorHelper helper; |
| 2717 | 2625 |
| 2718 // TODO(rmcilroy): modify tests when we have real try finally support. | 2626 // TODO(rmcilroy): modify tests when we have real try finally support. |
| 2719 ExpectedSnippet<int> snippets[] = { | 2627 ExpectedSnippet<int> snippets[] = { |
| 2720 {"var a = 1; try { a = 2; } finally { a = 3; }", | 2628 {"var a = 1; try { a = 2; } finally { a = 3; }", |
| 2721 1 * kPointerSize, | 2629 kPointerSize, |
| 2722 1, | 2630 1, |
| 2723 14, | 2631 14, |
| 2724 { | 2632 { |
| 2725 B(LdaSmi8), U8(1), // | 2633 B(LdaSmi8), U8(1), // |
| 2726 B(Star), R(0), // | 2634 B(Star), R(0), // |
| 2727 B(LdaSmi8), U8(2), // | 2635 B(LdaSmi8), U8(2), // |
| 2728 B(Star), R(0), // | 2636 B(Star), R(0), // |
| 2729 B(LdaSmi8), U8(3), // | 2637 B(LdaSmi8), U8(3), // |
| 2730 B(Star), R(0), // | 2638 B(Star), R(0), // |
| 2731 B(LdaUndefined), // | 2639 B(LdaUndefined), // |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2943 B(Star), R(1), // | 2851 B(Star), R(1), // |
| 2944 B(Call), R(1), R(2), U8(0), // | 2852 B(Call), R(1), R(2), U8(0), // |
| 2945 B(LdaContextSlot), R(0), U8(first_context_slot), // | 2853 B(LdaContextSlot), R(0), U8(first_context_slot), // |
| 2946 B(Return), // | 2854 B(Return), // |
| 2947 }, | 2855 }, |
| 2948 1, | 2856 1, |
| 2949 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 2857 {InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 2950 {"'use strict'; let a = 1; { let b = 2; return function() { a + b; }; }", | 2858 {"'use strict'; let a = 1; { let b = 2; return function() { a + b; }; }", |
| 2951 4 * kPointerSize, | 2859 4 * kPointerSize, |
| 2952 1, | 2860 1, |
| 2953 51, | 2861 49, |
| 2954 { | 2862 { |
| 2955 B(CallRuntime), U16(Runtime::kNewFunctionContext), // | 2863 B(CallRuntime), U16(Runtime::kNewFunctionContext), // |
| 2956 R(closure), U8(1), // | 2864 R(closure), U8(1), // |
| 2957 B(PushContext), R(0), // | 2865 B(PushContext), R(0), // |
| 2958 B(LdaTheHole), // | 2866 B(LdaTheHole), // |
| 2959 B(StaContextSlot), R(0), U8(first_context_slot), // | 2867 B(StaContextSlot), R(0), U8(first_context_slot), // |
| 2960 B(LdaConstant), U8(0), // | |
| 2961 B(LdaSmi8), U8(1), // | 2868 B(LdaSmi8), U8(1), // |
| 2962 B(StaContextSlot), R(0), U8(first_context_slot), // | 2869 B(StaContextSlot), R(0), U8(first_context_slot), // |
| 2963 B(LdaConstant), U8(1), // | 2870 B(LdaConstant), U8(0), // |
| 2964 B(Star), R(2), // | 2871 B(Star), R(2), // |
| 2965 B(Ldar), R(closure), // | 2872 B(Ldar), R(closure), // |
| 2966 B(Star), R(3), // | 2873 B(Star), R(3), // |
| 2967 B(CallRuntime), U16(Runtime::kPushBlockContext), R(2), U8(2), // | 2874 B(CallRuntime), U16(Runtime::kPushBlockContext), R(2), U8(2), // |
| 2968 B(PushContext), R(1), // | 2875 B(PushContext), R(1), // |
| 2969 B(LdaTheHole), // | 2876 B(LdaTheHole), // |
| 2970 B(StaContextSlot), R(1), U8(first_context_slot), // | 2877 B(StaContextSlot), R(1), U8(first_context_slot), // |
| 2971 B(LdaSmi8), U8(2), // | 2878 B(LdaSmi8), U8(2), // |
| 2972 B(StaContextSlot), R(1), U8(first_context_slot), // | 2879 B(StaContextSlot), R(1), U8(first_context_slot), // |
| 2973 B(LdaConstant), U8(2), // | 2880 B(LdaConstant), U8(1), // |
| 2974 B(CreateClosure), U8(0), // | 2881 B(CreateClosure), U8(0), // |
| 2975 B(Return), // | 2882 B(Return), // |
| 2976 // TODO(rmcilroy): Dead code after this point due to return in nested | 2883 // TODO(rmcilroy): Dead code after this point due to return in nested |
| 2977 // block - investigate eliminating this. | 2884 // block - investigate eliminating this. |
| 2978 B(PopContext), R(0), | 2885 B(PopContext), R(0), |
| 2979 B(LdaUndefined), // | 2886 B(LdaUndefined), // |
| 2980 B(Return), // | 2887 B(Return), // |
| 2981 }, | 2888 }, |
| 2982 3, | 2889 2, |
| 2983 {InstanceType::ONE_BYTE_INTERNALIZED_STRING_TYPE, | 2890 {InstanceType::FIXED_ARRAY_TYPE, |
| 2984 InstanceType::FIXED_ARRAY_TYPE, | |
| 2985 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, | 2891 InstanceType::SHARED_FUNCTION_INFO_TYPE}}, |
| 2986 }; | 2892 }; |
| 2987 | 2893 |
| 2988 for (size_t i = 0; i < arraysize(snippets); i++) { | 2894 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 2989 Handle<BytecodeArray> bytecode_array = | 2895 Handle<BytecodeArray> bytecode_array = |
| 2990 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); | 2896 helper.MakeBytecodeForFunctionBody(snippets[i].code_snippet); |
| 2991 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 2897 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 2992 } | 2898 } |
| 2993 } | 2899 } |
| 2994 | 2900 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3073 for (size_t i = 0; i < arraysize(snippets); i++) { | 2979 for (size_t i = 0; i < arraysize(snippets); i++) { |
| 3074 Handle<BytecodeArray> bytecode_array = | 2980 Handle<BytecodeArray> bytecode_array = |
| 3075 helper.MakeBytecodeForFunction(snippets[i].code_snippet); | 2981 helper.MakeBytecodeForFunction(snippets[i].code_snippet); |
| 3076 CheckBytecodeArrayEqual(snippets[i], bytecode_array); | 2982 CheckBytecodeArrayEqual(snippets[i], bytecode_array); |
| 3077 } | 2983 } |
| 3078 } | 2984 } |
| 3079 | 2985 |
| 3080 } // namespace interpreter | 2986 } // namespace interpreter |
| 3081 } // namespace internal | 2987 } // namespace internal |
| 3082 } // namespace v8 | 2988 } // namespace v8 |
| OLD | NEW |