Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(89)

Side by Side Diff: test/cctest/test-compiler.cc

Issue 1458003006: Remove usage of deprecated APIs from compiler/deopt test (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: updates Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | test/cctest/test-deoptimization.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution. 11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its 12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived 13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission. 14 // from this software without specific prior written permission.
15 // 15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 27
28 // TODO(jochen): Remove this after the setting is turned on globally.
29 #define V8_IMMINENT_DEPRECATION_WARNINGS
30
28 #include <stdlib.h> 31 #include <stdlib.h>
29 #include <wchar.h> 32 #include <wchar.h>
30 33
31 #include "src/v8.h" 34 #include "src/v8.h"
32 35
33 #include "src/compiler.h" 36 #include "src/compiler.h"
34 #include "src/disasm.h" 37 #include "src/disasm.h"
35 #include "src/parser.h" 38 #include "src/parser.h"
36 #include "test/cctest/cctest.h" 39 #include "test/cctest/cctest.h"
37 40
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 script->set_source(CcTest::heap()->undefined_value()); 258 script->set_source(CcTest::heap()->undefined_value());
256 CHECK_EQ(-1, Script::GetLineNumber(script, 0)); 259 CHECK_EQ(-1, Script::GetLineNumber(script, 0));
257 CHECK_EQ(-1, Script::GetLineNumber(script, 100)); 260 CHECK_EQ(-1, Script::GetLineNumber(script, 100));
258 CHECK_EQ(-1, Script::GetLineNumber(script, -1)); 261 CHECK_EQ(-1, Script::GetLineNumber(script, -1));
259 } 262 }
260 263
261 264
262 TEST(GetScriptLineNumber) { 265 TEST(GetScriptLineNumber) {
263 LocalContext context; 266 LocalContext context;
264 v8::HandleScope scope(CcTest::isolate()); 267 v8::HandleScope scope(CcTest::isolate());
265 v8::ScriptOrigin origin = 268 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str("test"));
266 v8::ScriptOrigin(v8::String::NewFromUtf8(CcTest::isolate(), "test"));
267 const char function_f[] = "function f() {}"; 269 const char function_f[] = "function f() {}";
268 const int max_rows = 1000; 270 const int max_rows = 1000;
269 const int buffer_size = max_rows + sizeof(function_f); 271 const int buffer_size = max_rows + sizeof(function_f);
270 ScopedVector<char> buffer(buffer_size); 272 ScopedVector<char> buffer(buffer_size);
271 memset(buffer.start(), '\n', buffer_size - 1); 273 memset(buffer.start(), '\n', buffer_size - 1);
272 buffer[buffer_size - 1] = '\0'; 274 buffer[buffer_size - 1] = '\0';
273 275
274 for (int i = 0; i < max_rows; ++i) { 276 for (int i = 0; i < max_rows; ++i) {
275 if (i > 0) 277 if (i > 0)
276 buffer[i - 1] = '\n'; 278 buffer[i - 1] = '\n';
277 MemCopy(&buffer[i], function_f, sizeof(function_f) - 1); 279 MemCopy(&buffer[i], function_f, sizeof(function_f) - 1);
278 v8::Handle<v8::String> script_body = 280 v8::Local<v8::String> script_body = v8_str(buffer.start());
279 v8::String::NewFromUtf8(CcTest::isolate(), buffer.start()); 281 v8::Script::Compile(context.local(), script_body, &origin)
280 v8::Script::Compile(script_body, &origin)->Run(); 282 .ToLocalChecked()
281 v8::Local<v8::Function> f = 283 ->Run(context.local())
282 v8::Local<v8::Function>::Cast(context->Global()->Get( 284 .ToLocalChecked();
283 v8::String::NewFromUtf8(CcTest::isolate(), "f"))); 285 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
286 context->Global()->Get(context.local(), v8_str("f")).ToLocalChecked());
284 CHECK_EQ(i, f->GetScriptLineNumber()); 287 CHECK_EQ(i, f->GetScriptLineNumber());
285 } 288 }
286 } 289 }
287 290
288 291
289 TEST(FeedbackVectorPreservedAcrossRecompiles) { 292 TEST(FeedbackVectorPreservedAcrossRecompiles) {
290 if (i::FLAG_always_opt || !i::FLAG_crankshaft) return; 293 if (i::FLAG_always_opt || !i::FLAG_crankshaft) return;
291 i::FLAG_allow_natives_syntax = true; 294 i::FLAG_allow_natives_syntax = true;
292 CcTest::InitializeVM(); 295 CcTest::InitializeVM();
293 if (!CcTest::i_isolate()->use_crankshaft()) return; 296 if (!CcTest::i_isolate()->use_crankshaft()) return;
294 v8::HandleScope scope(CcTest::isolate()); 297 v8::HandleScope scope(CcTest::isolate());
298 v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext();
295 299
296 // Make sure function f has a call that uses a type feedback slot. 300 // Make sure function f has a call that uses a type feedback slot.
297 CompileRun("function fun() {};" 301 CompileRun("function fun() {};"
298 "fun1 = fun;" 302 "fun1 = fun;"
299 "function f(a) { a(); } f(fun1);"); 303 "function f(a) { a(); } f(fun1);");
300 304
301 Handle<JSFunction> f = Handle<JSFunction>::cast(v8::Utils::OpenHandle( 305 Handle<JSFunction> f = Handle<JSFunction>::cast(
302 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f"))))); 306 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast(
307 CcTest::global()->Get(context, v8_str("f")).ToLocalChecked())));
303 308
304 // We shouldn't have deoptimization support. We want to recompile and 309 // We shouldn't have deoptimization support. We want to recompile and
305 // verify that our feedback vector preserves information. 310 // verify that our feedback vector preserves information.
306 CHECK(!f->shared()->has_deoptimization_support()); 311 CHECK(!f->shared()->has_deoptimization_support());
307 Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector()); 312 Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector());
308 313
309 // Verify that we gathered feedback. 314 // Verify that we gathered feedback.
310 CHECK(!feedback_vector->is_empty()); 315 CHECK(!feedback_vector->is_empty());
311 FeedbackVectorSlot slot_for_a(0); 316 FeedbackVectorSlot slot_for_a(0);
312 Object* object = feedback_vector->Get(slot_for_a); 317 Object* object = feedback_vector->Get(slot_for_a);
313 CHECK(object->IsWeakCell() && 318 CHECK(object->IsWeakCell() &&
314 WeakCell::cast(object)->value()->IsJSFunction()); 319 WeakCell::cast(object)->value()->IsJSFunction());
315 320
316 CompileRun("%OptimizeFunctionOnNextCall(f); f(fun1);"); 321 CompileRun("%OptimizeFunctionOnNextCall(f); f(fun1);");
317 322
318 // Verify that the feedback is still "gathered" despite a recompilation 323 // Verify that the feedback is still "gathered" despite a recompilation
319 // of the full code. 324 // of the full code.
320 CHECK(f->IsOptimized()); 325 CHECK(f->IsOptimized());
321 CHECK(f->shared()->has_deoptimization_support()); 326 CHECK(f->shared()->has_deoptimization_support());
322 object = f->shared()->feedback_vector()->Get(slot_for_a); 327 object = f->shared()->feedback_vector()->Get(slot_for_a);
323 CHECK(object->IsWeakCell() && 328 CHECK(object->IsWeakCell() &&
324 WeakCell::cast(object)->value()->IsJSFunction()); 329 WeakCell::cast(object)->value()->IsJSFunction());
325 } 330 }
326 331
327 332
328 TEST(FeedbackVectorUnaffectedByScopeChanges) { 333 TEST(FeedbackVectorUnaffectedByScopeChanges) {
329 if (i::FLAG_always_opt || !i::FLAG_lazy) return; 334 if (i::FLAG_always_opt || !i::FLAG_lazy) return;
330 CcTest::InitializeVM(); 335 CcTest::InitializeVM();
331 v8::HandleScope scope(CcTest::isolate()); 336 v8::HandleScope scope(CcTest::isolate());
337 v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext();
332 338
333 CompileRun("function builder() {" 339 CompileRun("function builder() {"
334 " call_target = function() { return 3; };" 340 " call_target = function() { return 3; };"
335 " return (function() {" 341 " return (function() {"
336 " eval('');" 342 " eval('');"
337 " return function() {" 343 " return function() {"
338 " 'use strict';" 344 " 'use strict';"
339 " call_target();" 345 " call_target();"
340 " }" 346 " }"
341 " })();" 347 " })();"
342 "}" 348 "}"
343 "morphing_call = builder();"); 349 "morphing_call = builder();");
344 350
345 Handle<JSFunction> f = Handle<JSFunction>::cast( 351 Handle<JSFunction> f = Handle<JSFunction>::cast(v8::Utils::OpenHandle(
346 v8::Utils::OpenHandle(*v8::Handle<v8::Function>::Cast( 352 *v8::Local<v8::Function>::Cast(CcTest::global()
347 CcTest::global()->Get(v8_str("morphing_call"))))); 353 ->Get(context, v8_str("morphing_call"))
354 .ToLocalChecked())));
348 355
349 // Not compiled, and so no feedback vector allocated yet. 356 // Not compiled, and so no feedback vector allocated yet.
350 CHECK(!f->shared()->is_compiled()); 357 CHECK(!f->shared()->is_compiled());
351 CHECK(f->shared()->feedback_vector()->is_empty()); 358 CHECK(f->shared()->feedback_vector()->is_empty());
352 359
353 CompileRun("morphing_call();"); 360 CompileRun("morphing_call();");
354 361
355 // Now a feedback vector is allocated. 362 // Now a feedback vector is allocated.
356 CHECK(f->shared()->is_compiled()); 363 CHECK(f->shared()->is_compiled());
357 CHECK(!f->shared()->feedback_vector()->is_empty()); 364 CHECK(!f->shared()->feedback_vector()->is_empty());
358 } 365 }
359 366
360 367
361 // Test that optimized code for different closures is actually shared 368 // Test that optimized code for different closures is actually shared
362 // immediately by the FastNewClosureStub when run in the same context. 369 // immediately by the FastNewClosureStub when run in the same context.
363 TEST(OptimizedCodeSharing1) { 370 TEST(OptimizedCodeSharing1) {
364 FLAG_stress_compaction = false; 371 FLAG_stress_compaction = false;
365 FLAG_allow_natives_syntax = true; 372 FLAG_allow_natives_syntax = true;
366 CcTest::InitializeVM(); 373 CcTest::InitializeVM();
367 v8::HandleScope scope(CcTest::isolate()); 374 v8::HandleScope scope(CcTest::isolate());
368 for (int i = 0; i < 3; i++) { 375 for (int i = 0; i < 3; i++) {
369 LocalContext env; 376 LocalContext env;
370 env->Global()->Set(v8::String::NewFromUtf8(CcTest::isolate(), "x"), 377 env->Global()
371 v8::Integer::New(CcTest::isolate(), i)); 378 ->Set(env.local(), v8_str("x"), v8::Integer::New(CcTest::isolate(), i))
379 .FromJust();
372 CompileRun( 380 CompileRun(
373 "function MakeClosure() {" 381 "function MakeClosure() {"
374 " return function() { return x; };" 382 " return function() { return x; };"
375 "}" 383 "}"
376 "var closure0 = MakeClosure();" 384 "var closure0 = MakeClosure();"
377 "%DebugPrint(closure0());" 385 "%DebugPrint(closure0());"
378 "%OptimizeFunctionOnNextCall(closure0);" 386 "%OptimizeFunctionOnNextCall(closure0);"
379 "%DebugPrint(closure0());" 387 "%DebugPrint(closure0());"
380 "var closure1 = MakeClosure();" 388 "var closure1 = MakeClosure();"
381 "var closure2 = MakeClosure();"); 389 "var closure2 = MakeClosure();");
382 Handle<JSFunction> fun1 = Handle<JSFunction>::cast( 390 Handle<JSFunction> fun1 = Handle<JSFunction>::cast(
383 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( 391 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast(
384 env->Global()->Get(v8_str("closure1"))))); 392 env->Global()
393 ->Get(env.local(), v8_str("closure1"))
394 .ToLocalChecked())));
385 Handle<JSFunction> fun2 = Handle<JSFunction>::cast( 395 Handle<JSFunction> fun2 = Handle<JSFunction>::cast(
386 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( 396 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast(
387 env->Global()->Get(v8_str("closure2"))))); 397 env->Global()
398 ->Get(env.local(), v8_str("closure2"))
399 .ToLocalChecked())));
388 CHECK(fun1->IsOptimized() || !CcTest::i_isolate()->use_crankshaft()); 400 CHECK(fun1->IsOptimized() || !CcTest::i_isolate()->use_crankshaft());
389 CHECK(fun2->IsOptimized() || !CcTest::i_isolate()->use_crankshaft()); 401 CHECK(fun2->IsOptimized() || !CcTest::i_isolate()->use_crankshaft());
390 CHECK_EQ(fun1->code(), fun2->code()); 402 CHECK_EQ(fun1->code(), fun2->code());
391 } 403 }
392 } 404 }
393 405
394 406
395 // Test that optimized code for different closures is actually shared 407 // Test that optimized code for different closures is actually shared
396 // immediately by the FastNewClosureStub when run different contexts. 408 // immediately by the FastNewClosureStub when run different contexts.
397 TEST(OptimizedCodeSharing2) { 409 TEST(OptimizedCodeSharing2) {
398 if (FLAG_stress_compaction) return; 410 if (FLAG_stress_compaction) return;
399 FLAG_allow_natives_syntax = true; 411 FLAG_allow_natives_syntax = true;
400 FLAG_native_context_specialization = false; 412 FLAG_native_context_specialization = false;
401 FLAG_turbo_cache_shared_code = true; 413 FLAG_turbo_cache_shared_code = true;
402 const char* flag = "--turbo-filter=*"; 414 const char* flag = "--turbo-filter=*";
403 FlagList::SetFlagsFromString(flag, StrLength(flag)); 415 FlagList::SetFlagsFromString(flag, StrLength(flag));
404 CcTest::InitializeVM(); 416 CcTest::InitializeVM();
405 v8::HandleScope scope(CcTest::isolate()); 417 v8::HandleScope scope(CcTest::isolate());
406 v8::Local<v8::Script> script = v8_compile( 418 v8::Local<v8::Script> script = v8_compile(
407 "function MakeClosure() {" 419 "function MakeClosure() {"
408 " return function() { return x; };" 420 " return function() { return x; };"
409 "}"); 421 "}");
410 Handle<Code> reference_code; 422 Handle<Code> reference_code;
411 { 423 {
412 LocalContext env; 424 LocalContext env;
413 env->Global()->Set(v8::String::NewFromUtf8(CcTest::isolate(), "x"), 425 env->Global()
414 v8::Integer::New(CcTest::isolate(), 23)); 426 ->Set(env.local(), v8_str("x"), v8::Integer::New(CcTest::isolate(), 23))
415 script->GetUnboundScript()->BindToCurrentContext()->Run(); 427 .FromJust();
428 script->GetUnboundScript()
429 ->BindToCurrentContext()
430 ->Run(env.local())
431 .ToLocalChecked();
416 CompileRun( 432 CompileRun(
417 "var closure0 = MakeClosure();" 433 "var closure0 = MakeClosure();"
418 "%DebugPrint(closure0());" 434 "%DebugPrint(closure0());"
419 "%OptimizeFunctionOnNextCall(closure0);" 435 "%OptimizeFunctionOnNextCall(closure0);"
420 "%DebugPrint(closure0());"); 436 "%DebugPrint(closure0());");
421 Handle<JSFunction> fun0 = Handle<JSFunction>::cast( 437 Handle<JSFunction> fun0 = Handle<JSFunction>::cast(
422 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( 438 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast(
423 env->Global()->Get(v8_str("closure0"))))); 439 env->Global()
440 ->Get(env.local(), v8_str("closure0"))
441 .ToLocalChecked())));
424 CHECK(fun0->IsOptimized() || !CcTest::i_isolate()->use_crankshaft()); 442 CHECK(fun0->IsOptimized() || !CcTest::i_isolate()->use_crankshaft());
425 reference_code = handle(fun0->code()); 443 reference_code = handle(fun0->code());
426 } 444 }
427 for (int i = 0; i < 3; i++) { 445 for (int i = 0; i < 3; i++) {
428 LocalContext env; 446 LocalContext env;
429 env->Global()->Set(v8::String::NewFromUtf8(CcTest::isolate(), "x"), 447 env->Global()
430 v8::Integer::New(CcTest::isolate(), i)); 448 ->Set(env.local(), v8_str("x"), v8::Integer::New(CcTest::isolate(), i))
431 script->GetUnboundScript()->BindToCurrentContext()->Run(); 449 .FromJust();
450 script->GetUnboundScript()
451 ->BindToCurrentContext()
452 ->Run(env.local())
453 .ToLocalChecked();
432 CompileRun( 454 CompileRun(
433 "var closure0 = MakeClosure();" 455 "var closure0 = MakeClosure();"
434 "%DebugPrint(closure0());" 456 "%DebugPrint(closure0());"
435 "%OptimizeFunctionOnNextCall(closure0);" 457 "%OptimizeFunctionOnNextCall(closure0);"
436 "%DebugPrint(closure0());" 458 "%DebugPrint(closure0());"
437 "var closure1 = MakeClosure();" 459 "var closure1 = MakeClosure();"
438 "var closure2 = MakeClosure();"); 460 "var closure2 = MakeClosure();");
439 Handle<JSFunction> fun1 = Handle<JSFunction>::cast( 461 Handle<JSFunction> fun1 = Handle<JSFunction>::cast(
440 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( 462 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast(
441 env->Global()->Get(v8_str("closure1"))))); 463 env->Global()
464 ->Get(env.local(), v8_str("closure1"))
465 .ToLocalChecked())));
442 Handle<JSFunction> fun2 = Handle<JSFunction>::cast( 466 Handle<JSFunction> fun2 = Handle<JSFunction>::cast(
443 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( 467 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast(
444 env->Global()->Get(v8_str("closure2"))))); 468 env->Global()
469 ->Get(env.local(), v8_str("closure2"))
470 .ToLocalChecked())));
445 CHECK(fun1->IsOptimized() || !CcTest::i_isolate()->use_crankshaft()); 471 CHECK(fun1->IsOptimized() || !CcTest::i_isolate()->use_crankshaft());
446 CHECK(fun2->IsOptimized() || !CcTest::i_isolate()->use_crankshaft()); 472 CHECK(fun2->IsOptimized() || !CcTest::i_isolate()->use_crankshaft());
447 CHECK_EQ(*reference_code, fun1->code()); 473 CHECK_EQ(*reference_code, fun1->code());
448 CHECK_EQ(*reference_code, fun2->code()); 474 CHECK_EQ(*reference_code, fun2->code());
449 } 475 }
450 } 476 }
451 477
452 478
453 // Test that optimized code for different closures is actually shared 479 // Test that optimized code for different closures is actually shared
454 // immediately by the FastNewClosureStub without context-dependent entries. 480 // immediately by the FastNewClosureStub without context-dependent entries.
455 TEST(OptimizedCodeSharing3) { 481 TEST(OptimizedCodeSharing3) {
456 if (FLAG_stress_compaction) return; 482 if (FLAG_stress_compaction) return;
457 FLAG_allow_natives_syntax = true; 483 FLAG_allow_natives_syntax = true;
458 FLAG_native_context_specialization = false; 484 FLAG_native_context_specialization = false;
459 FLAG_turbo_cache_shared_code = true; 485 FLAG_turbo_cache_shared_code = true;
460 const char* flag = "--turbo-filter=*"; 486 const char* flag = "--turbo-filter=*";
461 FlagList::SetFlagsFromString(flag, StrLength(flag)); 487 FlagList::SetFlagsFromString(flag, StrLength(flag));
462 CcTest::InitializeVM(); 488 CcTest::InitializeVM();
463 v8::HandleScope scope(CcTest::isolate()); 489 v8::HandleScope scope(CcTest::isolate());
464 v8::Local<v8::Script> script = v8_compile( 490 v8::Local<v8::Script> script = v8_compile(
465 "function MakeClosure() {" 491 "function MakeClosure() {"
466 " return function() { return x; };" 492 " return function() { return x; };"
467 "}"); 493 "}");
468 Handle<Code> reference_code; 494 Handle<Code> reference_code;
469 { 495 {
470 LocalContext env; 496 LocalContext env;
471 env->Global()->Set(v8::String::NewFromUtf8(CcTest::isolate(), "x"), 497 env->Global()
472 v8::Integer::New(CcTest::isolate(), 23)); 498 ->Set(env.local(), v8_str("x"), v8::Integer::New(CcTest::isolate(), 23))
473 script->GetUnboundScript()->BindToCurrentContext()->Run(); 499 .FromJust();
500 script->GetUnboundScript()
501 ->BindToCurrentContext()
502 ->Run(env.local())
503 .ToLocalChecked();
474 CompileRun( 504 CompileRun(
475 "var closure0 = MakeClosure();" 505 "var closure0 = MakeClosure();"
476 "%DebugPrint(closure0());" 506 "%DebugPrint(closure0());"
477 "%OptimizeFunctionOnNextCall(closure0);" 507 "%OptimizeFunctionOnNextCall(closure0);"
478 "%DebugPrint(closure0());"); 508 "%DebugPrint(closure0());");
479 Handle<JSFunction> fun0 = Handle<JSFunction>::cast( 509 Handle<JSFunction> fun0 = Handle<JSFunction>::cast(
480 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( 510 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast(
481 env->Global()->Get(v8_str("closure0"))))); 511 env->Global()
512 ->Get(env.local(), v8_str("closure0"))
513 .ToLocalChecked())));
482 CHECK(fun0->IsOptimized() || !CcTest::i_isolate()->use_crankshaft()); 514 CHECK(fun0->IsOptimized() || !CcTest::i_isolate()->use_crankshaft());
483 reference_code = handle(fun0->code()); 515 reference_code = handle(fun0->code());
484 // Evict only the context-dependent entry from the optimized code map. This 516 // Evict only the context-dependent entry from the optimized code map. This
485 // leaves it in a state where only the context-independent entry exists. 517 // leaves it in a state where only the context-independent entry exists.
486 fun0->shared()->TrimOptimizedCodeMap(SharedFunctionInfo::kEntryLength); 518 fun0->shared()->TrimOptimizedCodeMap(SharedFunctionInfo::kEntryLength);
487 } 519 }
488 for (int i = 0; i < 3; i++) { 520 for (int i = 0; i < 3; i++) {
489 LocalContext env; 521 LocalContext env;
490 env->Global()->Set(v8::String::NewFromUtf8(CcTest::isolate(), "x"), 522 env->Global()
491 v8::Integer::New(CcTest::isolate(), i)); 523 ->Set(env.local(), v8_str("x"), v8::Integer::New(CcTest::isolate(), i))
492 script->GetUnboundScript()->BindToCurrentContext()->Run(); 524 .FromJust();
525 script->GetUnboundScript()
526 ->BindToCurrentContext()
527 ->Run(env.local())
528 .ToLocalChecked();
493 CompileRun( 529 CompileRun(
494 "var closure0 = MakeClosure();" 530 "var closure0 = MakeClosure();"
495 "%DebugPrint(closure0());" 531 "%DebugPrint(closure0());"
496 "%OptimizeFunctionOnNextCall(closure0);" 532 "%OptimizeFunctionOnNextCall(closure0);"
497 "%DebugPrint(closure0());" 533 "%DebugPrint(closure0());"
498 "var closure1 = MakeClosure();" 534 "var closure1 = MakeClosure();"
499 "var closure2 = MakeClosure();"); 535 "var closure2 = MakeClosure();");
500 Handle<JSFunction> fun1 = Handle<JSFunction>::cast( 536 Handle<JSFunction> fun1 = Handle<JSFunction>::cast(
501 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( 537 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast(
502 env->Global()->Get(v8_str("closure1"))))); 538 env->Global()
539 ->Get(env.local(), v8_str("closure1"))
540 .ToLocalChecked())));
503 Handle<JSFunction> fun2 = Handle<JSFunction>::cast( 541 Handle<JSFunction> fun2 = Handle<JSFunction>::cast(
504 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast( 542 v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast(
505 env->Global()->Get(v8_str("closure2"))))); 543 env->Global()
544 ->Get(env.local(), v8_str("closure2"))
545 .ToLocalChecked())));
506 CHECK(fun1->IsOptimized() || !CcTest::i_isolate()->use_crankshaft()); 546 CHECK(fun1->IsOptimized() || !CcTest::i_isolate()->use_crankshaft());
507 CHECK(fun2->IsOptimized() || !CcTest::i_isolate()->use_crankshaft()); 547 CHECK(fun2->IsOptimized() || !CcTest::i_isolate()->use_crankshaft());
508 CHECK_EQ(*reference_code, fun1->code()); 548 CHECK_EQ(*reference_code, fun1->code());
509 CHECK_EQ(*reference_code, fun2->code()); 549 CHECK_EQ(*reference_code, fun2->code());
510 } 550 }
511 } 551 }
512 552
513 553
514 TEST(CompileFunctionInContext) { 554 TEST(CompileFunctionInContext) {
515 CcTest::InitializeVM(); 555 CcTest::InitializeVM();
516 v8::HandleScope scope(CcTest::isolate()); 556 v8::HandleScope scope(CcTest::isolate());
517 LocalContext env; 557 LocalContext env;
518 CompileRun("var r = 10;"); 558 CompileRun("var r = 10;");
519 v8::Local<v8::Object> math = 559 v8::Local<v8::Object> math = v8::Local<v8::Object>::Cast(
520 v8::Local<v8::Object>::Cast(env->Global()->Get(v8_str("Math"))); 560 env->Global()->Get(env.local(), v8_str("Math")).ToLocalChecked());
521 v8::ScriptCompiler::Source script_source(v8_str( 561 v8::ScriptCompiler::Source script_source(v8_str(
522 "a = PI * r * r;" 562 "a = PI * r * r;"
523 "x = r * cos(PI);" 563 "x = r * cos(PI);"
524 "y = r * sin(PI / 2);")); 564 "y = r * sin(PI / 2);"));
525 v8::Local<v8::Function> fun = v8::ScriptCompiler::CompileFunctionInContext( 565 v8::Local<v8::Function> fun =
526 CcTest::isolate(), &script_source, env.local(), 0, NULL, 1, &math); 566 v8::ScriptCompiler::CompileFunctionInContext(env.local(), &script_source,
567 0, NULL, 1, &math)
568 .ToLocalChecked();
527 CHECK(!fun.IsEmpty()); 569 CHECK(!fun.IsEmpty());
528 fun->Call(env->Global(), 0, NULL); 570 fun->Call(env.local(), env->Global(), 0, NULL).ToLocalChecked();
529 CHECK(env->Global()->Has(v8_str("a"))); 571 CHECK(env->Global()->Has(env.local(), v8_str("a")).FromJust());
530 v8::Local<v8::Value> a = env->Global()->Get(v8_str("a")); 572 v8::Local<v8::Value> a =
573 env->Global()->Get(env.local(), v8_str("a")).ToLocalChecked();
531 CHECK(a->IsNumber()); 574 CHECK(a->IsNumber());
532 CHECK(env->Global()->Has(v8_str("x"))); 575 CHECK(env->Global()->Has(env.local(), v8_str("x")).FromJust());
533 v8::Local<v8::Value> x = env->Global()->Get(v8_str("x")); 576 v8::Local<v8::Value> x =
577 env->Global()->Get(env.local(), v8_str("x")).ToLocalChecked();
534 CHECK(x->IsNumber()); 578 CHECK(x->IsNumber());
535 CHECK(env->Global()->Has(v8_str("y"))); 579 CHECK(env->Global()->Has(env.local(), v8_str("y")).FromJust());
536 v8::Local<v8::Value> y = env->Global()->Get(v8_str("y")); 580 v8::Local<v8::Value> y =
581 env->Global()->Get(env.local(), v8_str("y")).ToLocalChecked();
537 CHECK(y->IsNumber()); 582 CHECK(y->IsNumber());
538 CHECK_EQ(314.1592653589793, a->NumberValue()); 583 CHECK_EQ(314.1592653589793, a->NumberValue(env.local()).FromJust());
539 CHECK_EQ(-10.0, x->NumberValue()); 584 CHECK_EQ(-10.0, x->NumberValue(env.local()).FromJust());
540 CHECK_EQ(10.0, y->NumberValue()); 585 CHECK_EQ(10.0, y->NumberValue(env.local()).FromJust());
541 } 586 }
542 587
543 588
544 TEST(CompileFunctionInContextComplex) { 589 TEST(CompileFunctionInContextComplex) {
545 CcTest::InitializeVM(); 590 CcTest::InitializeVM();
546 v8::HandleScope scope(CcTest::isolate()); 591 v8::HandleScope scope(CcTest::isolate());
547 LocalContext env; 592 LocalContext env;
548 CompileRun( 593 CompileRun(
549 "var x = 1;" 594 "var x = 1;"
550 "var y = 2;" 595 "var y = 2;"
551 "var z = 4;" 596 "var z = 4;"
552 "var a = {x: 8, y: 16};" 597 "var a = {x: 8, y: 16};"
553 "var b = {x: 32};"); 598 "var b = {x: 32};");
554 v8::Local<v8::Object> ext[2]; 599 v8::Local<v8::Object> ext[2];
555 ext[0] = v8::Local<v8::Object>::Cast(env->Global()->Get(v8_str("a"))); 600 ext[0] = v8::Local<v8::Object>::Cast(
556 ext[1] = v8::Local<v8::Object>::Cast(env->Global()->Get(v8_str("b"))); 601 env->Global()->Get(env.local(), v8_str("a")).ToLocalChecked());
602 ext[1] = v8::Local<v8::Object>::Cast(
603 env->Global()->Get(env.local(), v8_str("b")).ToLocalChecked());
557 v8::ScriptCompiler::Source script_source(v8_str("result = x + y + z")); 604 v8::ScriptCompiler::Source script_source(v8_str("result = x + y + z"));
558 v8::Local<v8::Function> fun = v8::ScriptCompiler::CompileFunctionInContext( 605 v8::Local<v8::Function> fun =
559 CcTest::isolate(), &script_source, env.local(), 0, NULL, 2, ext); 606 v8::ScriptCompiler::CompileFunctionInContext(env.local(), &script_source,
607 0, NULL, 2, ext)
608 .ToLocalChecked();
560 CHECK(!fun.IsEmpty()); 609 CHECK(!fun.IsEmpty());
561 fun->Call(env->Global(), 0, NULL); 610 fun->Call(env.local(), env->Global(), 0, NULL).ToLocalChecked();
562 CHECK(env->Global()->Has(v8_str("result"))); 611 CHECK(env->Global()->Has(env.local(), v8_str("result")).FromJust());
563 v8::Local<v8::Value> result = env->Global()->Get(v8_str("result")); 612 v8::Local<v8::Value> result =
613 env->Global()->Get(env.local(), v8_str("result")).ToLocalChecked();
564 CHECK(result->IsNumber()); 614 CHECK(result->IsNumber());
565 CHECK_EQ(52.0, result->NumberValue()); 615 CHECK_EQ(52.0, result->NumberValue(env.local()).FromJust());
566 } 616 }
567 617
568 618
569 TEST(CompileFunctionInContextArgs) { 619 TEST(CompileFunctionInContextArgs) {
570 CcTest::InitializeVM(); 620 CcTest::InitializeVM();
571 v8::HandleScope scope(CcTest::isolate()); 621 v8::HandleScope scope(CcTest::isolate());
572 LocalContext env; 622 LocalContext env;
573 CompileRun("var a = {x: 23};"); 623 CompileRun("var a = {x: 23};");
574 v8::Local<v8::Object> ext[1]; 624 v8::Local<v8::Object> ext[1];
575 ext[0] = v8::Local<v8::Object>::Cast(env->Global()->Get(v8_str("a"))); 625 ext[0] = v8::Local<v8::Object>::Cast(
626 env->Global()->Get(env.local(), v8_str("a")).ToLocalChecked());
576 v8::ScriptCompiler::Source script_source(v8_str("result = x + b")); 627 v8::ScriptCompiler::Source script_source(v8_str("result = x + b"));
577 v8::Local<v8::String> arg = v8_str("b"); 628 v8::Local<v8::String> arg = v8_str("b");
578 v8::Local<v8::Function> fun = v8::ScriptCompiler::CompileFunctionInContext( 629 v8::Local<v8::Function> fun =
579 CcTest::isolate(), &script_source, env.local(), 1, &arg, 1, ext); 630 v8::ScriptCompiler::CompileFunctionInContext(env.local(), &script_source,
631 1, &arg, 1, ext)
632 .ToLocalChecked();
580 CHECK(!fun.IsEmpty()); 633 CHECK(!fun.IsEmpty());
581 v8::Local<v8::Value> b_value = v8::Number::New(CcTest::isolate(), 42.0); 634 v8::Local<v8::Value> b_value = v8::Number::New(CcTest::isolate(), 42.0);
582 fun->Call(env->Global(), 1, &b_value); 635 fun->Call(env.local(), env->Global(), 1, &b_value).ToLocalChecked();
583 CHECK(env->Global()->Has(v8_str("result"))); 636 CHECK(env->Global()->Has(env.local(), v8_str("result")).FromJust());
584 v8::Local<v8::Value> result = env->Global()->Get(v8_str("result")); 637 v8::Local<v8::Value> result =
638 env->Global()->Get(env.local(), v8_str("result")).ToLocalChecked();
585 CHECK(result->IsNumber()); 639 CHECK(result->IsNumber());
586 CHECK_EQ(65.0, result->NumberValue()); 640 CHECK_EQ(65.0, result->NumberValue(env.local()).FromJust());
587 } 641 }
588 642
589 643
590 TEST(CompileFunctionInContextComments) { 644 TEST(CompileFunctionInContextComments) {
591 CcTest::InitializeVM(); 645 CcTest::InitializeVM();
592 v8::HandleScope scope(CcTest::isolate()); 646 v8::HandleScope scope(CcTest::isolate());
593 LocalContext env; 647 LocalContext env;
594 CompileRun("var a = {x: 23, y: 1, z: 2};"); 648 CompileRun("var a = {x: 23, y: 1, z: 2};");
595 v8::Local<v8::Object> ext[1]; 649 v8::Local<v8::Object> ext[1];
596 ext[0] = v8::Local<v8::Object>::Cast(env->Global()->Get(v8_str("a"))); 650 ext[0] = v8::Local<v8::Object>::Cast(
651 env->Global()->Get(env.local(), v8_str("a")).ToLocalChecked());
597 v8::ScriptCompiler::Source script_source( 652 v8::ScriptCompiler::Source script_source(
598 v8_str("result = /* y + */ x + b // + z")); 653 v8_str("result = /* y + */ x + b // + z"));
599 v8::Local<v8::String> arg = v8_str("b"); 654 v8::Local<v8::String> arg = v8_str("b");
600 v8::Local<v8::Function> fun = v8::ScriptCompiler::CompileFunctionInContext( 655 v8::Local<v8::Function> fun =
601 CcTest::isolate(), &script_source, env.local(), 1, &arg, 1, ext); 656 v8::ScriptCompiler::CompileFunctionInContext(env.local(), &script_source,
657 1, &arg, 1, ext)
658 .ToLocalChecked();
602 CHECK(!fun.IsEmpty()); 659 CHECK(!fun.IsEmpty());
603 v8::Local<v8::Value> b_value = v8::Number::New(CcTest::isolate(), 42.0); 660 v8::Local<v8::Value> b_value = v8::Number::New(CcTest::isolate(), 42.0);
604 fun->Call(env->Global(), 1, &b_value); 661 fun->Call(env.local(), env->Global(), 1, &b_value).ToLocalChecked();
605 CHECK(env->Global()->Has(v8_str("result"))); 662 CHECK(env->Global()->Has(env.local(), v8_str("result")).FromJust());
606 v8::Local<v8::Value> result = env->Global()->Get(v8_str("result")); 663 v8::Local<v8::Value> result =
664 env->Global()->Get(env.local(), v8_str("result")).ToLocalChecked();
607 CHECK(result->IsNumber()); 665 CHECK(result->IsNumber());
608 CHECK_EQ(65.0, result->NumberValue()); 666 CHECK_EQ(65.0, result->NumberValue(env.local()).FromJust());
609 } 667 }
610 668
611 669
612 TEST(CompileFunctionInContextNonIdentifierArgs) { 670 TEST(CompileFunctionInContextNonIdentifierArgs) {
613 CcTest::InitializeVM(); 671 CcTest::InitializeVM();
614 v8::HandleScope scope(CcTest::isolate()); 672 v8::HandleScope scope(CcTest::isolate());
615 LocalContext env; 673 LocalContext env;
616 v8::ScriptCompiler::Source script_source(v8_str("result = 1")); 674 v8::ScriptCompiler::Source script_source(v8_str("result = 1"));
617 v8::Local<v8::String> arg = v8_str("b }"); 675 v8::Local<v8::String> arg = v8_str("b }");
618 v8::Local<v8::Function> fun = v8::ScriptCompiler::CompileFunctionInContext( 676 CHECK(v8::ScriptCompiler::CompileFunctionInContext(
619 CcTest::isolate(), &script_source, env.local(), 1, &arg, 0, NULL); 677 env.local(), &script_source, 1, &arg, 0, NULL)
620 CHECK(fun.IsEmpty()); 678 .IsEmpty());
621 } 679 }
622 680
623 681
624 TEST(CompileFunctionInContextScriptOrigin) { 682 TEST(CompileFunctionInContextScriptOrigin) {
625 CcTest::InitializeVM(); 683 CcTest::InitializeVM();
626 v8::HandleScope scope(CcTest::isolate()); 684 v8::HandleScope scope(CcTest::isolate());
627 LocalContext env; 685 LocalContext env;
628 v8::ScriptOrigin origin(v8_str("test"), 686 v8::ScriptOrigin origin(v8_str("test"),
629 v8::Integer::New(CcTest::isolate(), 22), 687 v8::Integer::New(CcTest::isolate(), 22),
630 v8::Integer::New(CcTest::isolate(), 41)); 688 v8::Integer::New(CcTest::isolate(), 41));
631 v8::ScriptCompiler::Source script_source(v8_str("throw new Error()"), origin); 689 v8::ScriptCompiler::Source script_source(v8_str("throw new Error()"), origin);
632 v8::Local<v8::Function> fun = v8::ScriptCompiler::CompileFunctionInContext( 690 v8::Local<v8::Function> fun =
633 CcTest::isolate(), &script_source, env.local(), 0, NULL, 0, NULL); 691 v8::ScriptCompiler::CompileFunctionInContext(env.local(), &script_source,
692 0, NULL, 0, NULL)
693 .ToLocalChecked();
634 CHECK(!fun.IsEmpty()); 694 CHECK(!fun.IsEmpty());
635 v8::TryCatch try_catch; 695 v8::TryCatch try_catch(CcTest::isolate());
636 CcTest::isolate()->SetCaptureStackTraceForUncaughtExceptions(true); 696 CcTest::isolate()->SetCaptureStackTraceForUncaughtExceptions(true);
637 fun->Call(env->Global(), 0, NULL); 697 CHECK(fun->Call(env.local(), env->Global(), 0, NULL).IsEmpty());
638 CHECK(try_catch.HasCaught()); 698 CHECK(try_catch.HasCaught());
639 CHECK(!try_catch.Exception().IsEmpty()); 699 CHECK(!try_catch.Exception().IsEmpty());
640 v8::Local<v8::StackTrace> stack = 700 v8::Local<v8::StackTrace> stack =
641 v8::Exception::GetStackTrace(try_catch.Exception()); 701 v8::Exception::GetStackTrace(try_catch.Exception());
642 CHECK(!stack.IsEmpty()); 702 CHECK(!stack.IsEmpty());
643 CHECK(stack->GetFrameCount() > 0); 703 CHECK(stack->GetFrameCount() > 0);
644 v8::Local<v8::StackFrame> frame = stack->GetFrame(0); 704 v8::Local<v8::StackFrame> frame = stack->GetFrame(0);
645 CHECK_EQ(23, frame->GetLineNumber()); 705 CHECK_EQ(23, frame->GetLineNumber());
646 CHECK_EQ(42 + strlen("throw "), static_cast<unsigned>(frame->GetColumn())); 706 CHECK_EQ(42 + strlen("throw "), static_cast<unsigned>(frame->GetColumn()));
647 } 707 }
648 708
649 709
650 #ifdef ENABLE_DISASSEMBLER 710 #ifdef ENABLE_DISASSEMBLER
651 static Handle<JSFunction> GetJSFunction(v8::Handle<v8::Object> obj, 711 static Handle<JSFunction> GetJSFunction(v8::Local<v8::Object> obj,
652 const char* property_name) { 712 const char* property_name) {
653 v8::Local<v8::Function> fun = 713 v8::Local<v8::Function> fun = v8::Local<v8::Function>::Cast(
654 v8::Local<v8::Function>::Cast(obj->Get(v8_str(property_name))); 714 obj->Get(CcTest::isolate()->GetCurrentContext(), v8_str(property_name))
715 .ToLocalChecked());
655 return Handle<JSFunction>::cast(v8::Utils::OpenHandle(*fun)); 716 return Handle<JSFunction>::cast(v8::Utils::OpenHandle(*fun));
656 } 717 }
657 718
658 719
659 static void CheckCodeForUnsafeLiteral(Handle<JSFunction> f) { 720 static void CheckCodeForUnsafeLiteral(Handle<JSFunction> f) {
660 // Create a disassembler with default name lookup. 721 // Create a disassembler with default name lookup.
661 disasm::NameConverter name_converter; 722 disasm::NameConverter name_converter;
662 disasm::Disassembler d(name_converter); 723 disasm::Disassembler d(name_converter);
663 724
664 if (f->code()->kind() == Code::FUNCTION) { 725 if (f->code()->kind() == Code::FUNCTION) {
(...skipping 30 matching lines...) Expand all
695 CompileRun("function f() { a = 12345678 }; f();"); 756 CompileRun("function f() { a = 12345678 }; f();");
696 CheckCodeForUnsafeLiteral(GetJSFunction(context->Global(), "f")); 757 CheckCodeForUnsafeLiteral(GetJSFunction(context->Global(), "f"));
697 CompileRun("function f(x) { a = 12345678 + x}; f(1);"); 758 CompileRun("function f(x) { a = 12345678 + x}; f(1);");
698 CheckCodeForUnsafeLiteral(GetJSFunction(context->Global(), "f")); 759 CheckCodeForUnsafeLiteral(GetJSFunction(context->Global(), "f"));
699 CompileRun("function f(x) { var arguments = 1; x += 12345678}; f(1);"); 760 CompileRun("function f(x) { var arguments = 1; x += 12345678}; f(1);");
700 CheckCodeForUnsafeLiteral(GetJSFunction(context->Global(), "f")); 761 CheckCodeForUnsafeLiteral(GetJSFunction(context->Global(), "f"));
701 CompileRun("function f(x) { var arguments = 1; x = 12345678}; f(1);"); 762 CompileRun("function f(x) { var arguments = 1; x = 12345678}; f(1);");
702 CheckCodeForUnsafeLiteral(GetJSFunction(context->Global(), "f")); 763 CheckCodeForUnsafeLiteral(GetJSFunction(context->Global(), "f"));
703 } 764 }
704 #endif 765 #endif
OLDNEW
« no previous file with comments | « no previous file | test/cctest/test-deoptimization.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698