Index: src/full-codegen.cc |
=================================================================== |
--- src/full-codegen.cc (revision 5450) |
+++ src/full-codegen.cc (working copy) |
@@ -505,21 +505,39 @@ |
} |
-void FullCodeGenerator::EmitInlineRuntimeCall(CallRuntime* expr) { |
- Handle<String> name = expr->name(); |
- SmartPointer<char> cstring = name->ToCString(); |
+// Lookup table for code generators for special runtime calls which are |
+// generated inline. |
+#define INLINE_FUNCTION_GENERATOR_ADDRESS(Name, argc, ressize) \ |
+ &FullCodeGenerator::Emit##Name, |
-#define CHECK_EMIT_INLINE_CALL(name, x, y) \ |
- if (strcmp("_"#name, *cstring) == 0) { \ |
- Emit##name(expr->arguments()); \ |
- return; \ |
- } |
- INLINE_RUNTIME_FUNCTION_LIST(CHECK_EMIT_INLINE_CALL) |
-#undef CHECK_EMIT_INLINE_CALL |
- UNREACHABLE(); |
+const FullCodeGenerator::InlineFunctionGenerator |
+ FullCodeGenerator::kInlineFunctionGenerators[] = { |
+ INLINE_FUNCTION_LIST(INLINE_FUNCTION_GENERATOR_ADDRESS) |
+ INLINE_RUNTIME_FUNCTION_LIST(INLINE_FUNCTION_GENERATOR_ADDRESS) |
+ }; |
+#undef INLINE_FUNCTION_GENERATOR_ADDRESS |
+ |
+ |
+FullCodeGenerator::InlineFunctionGenerator |
+ FullCodeGenerator::FindInlineFunctionGenerator(Runtime::FunctionId id) { |
+ return kInlineFunctionGenerators[ |
+ static_cast<int>(id) - static_cast<int>(Runtime::kFirstInlineFunction)]; |
} |
+void FullCodeGenerator::EmitInlineRuntimeCall(CallRuntime* node) { |
+ ZoneList<Expression*>* args = node->arguments(); |
+ Handle<String> name = node->name(); |
+ Runtime::Function* function = node->function(); |
+ ASSERT(function != NULL); |
+ ASSERT(function->intrinsic_type == Runtime::INLINE); |
+ InlineFunctionGenerator generator = |
+ FindInlineFunctionGenerator(function->function_id); |
+ ASSERT(generator != NULL); |
+ ((*this).*(generator))(args); |
+} |
+ |
+ |
void FullCodeGenerator::VisitBinaryOperation(BinaryOperation* expr) { |
Comment cmnt(masm_, "[ BinaryOperation"); |
Token::Value op = expr->op(); |