| 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();
|
|
|