OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 } | 330 } |
331 } | 331 } |
332 } | 332 } |
333 | 333 |
334 // Invoke the platform-dependent code generator to do the actual | 334 // Invoke the platform-dependent code generator to do the actual |
335 // declaration the global variables and functions. | 335 // declaration the global variables and functions. |
336 DeclareGlobals(array); | 336 DeclareGlobals(array); |
337 } | 337 } |
338 | 338 |
339 | 339 |
340 // List of special runtime calls which are generated inline. For some of these | 340 InlineRuntimeFunctionsTable::Entry* CodeGenerator::FindInlineRuntimeLUT( |
341 // functions the code will be generated inline, and for others a call to a code | |
342 // stub will be inlined. | |
343 | |
344 #define INLINE_RUNTIME_ENTRY(Name, argc, ressize) \ | |
345 {&CodeGenerator::Generate##Name, "_" #Name, argc}, \ | |
346 | |
347 CodeGenerator::InlineRuntimeLUT CodeGenerator::kInlineRuntimeLUT[] = { | |
348 INLINE_RUNTIME_FUNCTION_LIST(INLINE_RUNTIME_ENTRY) | |
349 }; | |
350 | |
351 #undef INLINE_RUNTIME_ENTRY | |
352 | |
353 CodeGenerator::InlineRuntimeLUT* CodeGenerator::FindInlineRuntimeLUT( | |
354 Handle<String> name) { | 341 Handle<String> name) { |
355 const int entries_count = | 342 Isolate* isolate = Isolate::Current(); |
356 sizeof(kInlineRuntimeLUT) / sizeof(InlineRuntimeLUT); | 343 InlineRuntimeFunctionsTable::Entry* entries = |
357 for (int i = 0; i < entries_count; i++) { | 344 isolate->inline_runtime_functions_table()->entries(); |
358 InlineRuntimeLUT* entry = &kInlineRuntimeLUT[i]; | 345 for (int i = 0; |
| 346 i < InlineRuntimeFunctionsTable::kInlineRuntimeFunctionsTableSize; |
| 347 ++i) { |
| 348 InlineRuntimeFunctionsTable::Entry* entry = &entries[i]; |
359 if (name->IsEqualTo(CStrVector(entry->name))) { | 349 if (name->IsEqualTo(CStrVector(entry->name))) { |
360 return entry; | 350 return entry; |
361 } | 351 } |
362 } | 352 } |
363 return NULL; | 353 return NULL; |
364 } | 354 } |
365 | 355 |
366 | 356 |
367 bool CodeGenerator::CheckForInlineRuntimeCall(CallRuntime* node) { | 357 bool CodeGenerator::CheckForInlineRuntimeCall(CallRuntime* node) { |
368 ZoneList<Expression*>* args = node->arguments(); | 358 ZoneList<Expression*>* args = node->arguments(); |
369 Handle<String> name = node->name(); | 359 Handle<String> name = node->name(); |
370 if (name->length() > 0 && name->Get(0) == '_') { | 360 if (name->length() > 0 && name->Get(0) == '_') { |
371 InlineRuntimeLUT* entry = FindInlineRuntimeLUT(name); | 361 InlineRuntimeFunctionsTable::Entry* entry = FindInlineRuntimeLUT(name); |
372 if (entry != NULL) { | 362 if (entry != NULL) { |
373 ((*this).*(entry->method))(args); | 363 ((*this).*(entry->method))(args); |
374 return true; | 364 return true; |
375 } | 365 } |
376 } | 366 } |
377 return false; | 367 return false; |
378 } | 368 } |
379 | 369 |
380 | 370 |
381 bool CodeGenerator::PatchInlineRuntimeEntry(Handle<String> name, | 371 bool CodeGenerator::PatchInlineRuntimeEntry(Handle<String> name, |
382 const CodeGenerator::InlineRuntimeLUT& new_entry, | 372 const InlineRuntimeFunctionsTable::Entry& new_entry, |
383 CodeGenerator::InlineRuntimeLUT* old_entry) { | 373 InlineRuntimeFunctionsTable::Entry* old_entry) { |
384 InlineRuntimeLUT* entry = FindInlineRuntimeLUT(name); | 374 InlineRuntimeFunctionsTable::Entry* entry = FindInlineRuntimeLUT(name); |
385 if (entry == NULL) return false; | 375 if (entry == NULL) return false; |
386 if (old_entry != NULL) { | 376 if (old_entry != NULL) { |
387 old_entry->name = entry->name; | 377 old_entry->name = entry->name; |
388 old_entry->method = entry->method; | 378 old_entry->method = entry->method; |
389 } | 379 } |
390 entry->name = new_entry.name; | 380 entry->name = new_entry.name; |
391 entry->method = new_entry.method; | 381 entry->method = new_entry.method; |
392 return true; | 382 return true; |
393 } | 383 } |
394 | 384 |
395 | 385 |
396 int CodeGenerator::InlineRuntimeCallArgumentsCount(Handle<String> name) { | 386 int CodeGenerator::InlineRuntimeCallArgumentsCount(Handle<String> name) { |
397 CodeGenerator::InlineRuntimeLUT* f = | 387 InlineRuntimeFunctionsTable::Entry* f = |
398 CodeGenerator::FindInlineRuntimeLUT(name); | 388 CodeGenerator::FindInlineRuntimeLUT(name); |
399 if (f != NULL) return f->nargs; | 389 if (f != NULL) return f->nargs; |
400 return -1; | 390 return -1; |
401 } | 391 } |
402 | 392 |
403 | 393 |
404 // Simple condition analysis. ALWAYS_TRUE and ALWAYS_FALSE represent a | 394 // Simple condition analysis. ALWAYS_TRUE and ALWAYS_FALSE represent a |
405 // known result for the test expression, with no side effects. | 395 // known result for the test expression, with no side effects. |
406 CodeGenerator::ConditionAnalysis CodeGenerator::AnalyzeCondition( | 396 CodeGenerator::ConditionAnalysis CodeGenerator::AnalyzeCondition( |
407 Expression* cond) { | 397 Expression* cond) { |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 } | 498 } |
509 } | 499 } |
510 | 500 |
511 | 501 |
512 void ApiGetterEntryStub::SetCustomCache(Code* value) { | 502 void ApiGetterEntryStub::SetCustomCache(Code* value) { |
513 info()->set_load_stub_cache(value); | 503 info()->set_load_stub_cache(value); |
514 } | 504 } |
515 | 505 |
516 | 506 |
517 } } // namespace v8::internal | 507 } } // namespace v8::internal |
OLD | NEW |