Index: src/codegen.cc |
=================================================================== |
--- src/codegen.cc (revision 5450) |
+++ src/codegen.cc (working copy) |
@@ -1,4 +1,4 @@ |
-// Copyright 2009 the V8 project authors. All rights reserved. |
+// Copyright 2010 the V8 project authors. All rights reserved. |
// Redistribution and use in source and binary forms, with or without |
// modification, are permitted provided that the following conditions are |
// met: |
@@ -344,40 +344,35 @@ |
} |
-// List of special runtime calls which are generated inline. For some of these |
-// functions the code will be generated inline, and for others a call to a code |
-// stub will be inlined. |
+// Lookup table for code generators for special runtime calls which are |
+// generated inline. |
+#define INLINE_FUNCTION_GENERATOR_ADDRESS(Name, argc, ressize) \ |
+ &CodeGenerator::Generate##Name, |
-#define INLINE_RUNTIME_ENTRY(Name, argc, ressize) \ |
- {&CodeGenerator::Generate##Name, "_" #Name, argc}, \ |
- |
-CodeGenerator::InlineRuntimeLUT CodeGenerator::kInlineRuntimeLUT[] = { |
- INLINE_RUNTIME_FUNCTION_LIST(INLINE_RUNTIME_ENTRY) |
+const CodeGenerator::InlineFunctionGenerator |
+ CodeGenerator::kInlineFunctionGenerators[] = { |
+ INLINE_FUNCTION_LIST(INLINE_FUNCTION_GENERATOR_ADDRESS) |
+ INLINE_RUNTIME_FUNCTION_LIST(INLINE_FUNCTION_GENERATOR_ADDRESS) |
}; |
+#undef INLINE_FUNCTION_GENERATOR_ADDRESS |
-#undef INLINE_RUNTIME_ENTRY |
-CodeGenerator::InlineRuntimeLUT* CodeGenerator::FindInlineRuntimeLUT( |
- Handle<String> name) { |
- const int entries_count = |
- sizeof(kInlineRuntimeLUT) / sizeof(InlineRuntimeLUT); |
- for (int i = 0; i < entries_count; i++) { |
- InlineRuntimeLUT* entry = &kInlineRuntimeLUT[i]; |
- if (name->IsEqualTo(CStrVector(entry->name))) { |
- return entry; |
- } |
- } |
- return NULL; |
+CodeGenerator::InlineFunctionGenerator |
+ CodeGenerator::FindInlineFunctionGenerator(Runtime::FunctionId id) { |
+ return kInlineFunctionGenerators[ |
+ static_cast<int>(id) - static_cast<int>(Runtime::kFirstInlineFunction)]; |
} |
bool CodeGenerator::CheckForInlineRuntimeCall(CallRuntime* node) { |
ZoneList<Expression*>* args = node->arguments(); |
Handle<String> name = node->name(); |
- if (name->length() > 0 && name->Get(0) == '_') { |
- InlineRuntimeLUT* entry = FindInlineRuntimeLUT(name); |
- if (entry != NULL) { |
- ((*this).*(entry->method))(args); |
+ Runtime::Function* function = node->function(); |
+ if (function != NULL && function->intrinsic_type == Runtime::INLINE) { |
+ InlineFunctionGenerator generator = |
+ FindInlineFunctionGenerator(function->function_id); |
+ if (generator != NULL) { |
+ ((*this).*(generator))(args); |
return true; |
} |
} |
@@ -385,14 +380,6 @@ |
} |
-int CodeGenerator::InlineRuntimeCallArgumentsCount(Handle<String> name) { |
- CodeGenerator::InlineRuntimeLUT* f = |
- CodeGenerator::FindInlineRuntimeLUT(name); |
- if (f != NULL) return f->nargs; |
- return -1; |
-} |
- |
- |
// Simple condition analysis. ALWAYS_TRUE and ALWAYS_FALSE represent a |
// known result for the test expression, with no side effects. |
CodeGenerator::ConditionAnalysis CodeGenerator::AnalyzeCondition( |