Index: src/interpreter/bytecode-generator.cc |
diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc |
index 7257fd413422de3b43b4b146e3aa319b1e7b4264..c927d23595f5aac7b5d65dda2bc40b3d7b9a604d 100644 |
--- a/src/interpreter/bytecode-generator.cc |
+++ b/src/interpreter/bytecode-generator.cc |
@@ -460,7 +460,28 @@ void BytecodeGenerator::VisitCall(Call* expr) { |
void BytecodeGenerator::VisitCallNew(CallNew* expr) { UNIMPLEMENTED(); } |
-void BytecodeGenerator::VisitCallRuntime(CallRuntime* expr) { UNIMPLEMENTED(); } |
+void BytecodeGenerator::VisitCallRuntime(CallRuntime* expr) { |
+ if (expr->is_jsruntime()) { |
+ UNIMPLEMENTED(); |
+ } |
+ |
+ // Evaluate all arguments to the runtime call. |
+ ZoneList<Expression*>* args = expr->arguments(); |
+ TemporaryRegisterScope temporary_register_scope(&builder_); |
+ // Ensure we always have a valid first_arg register even if there are no |
+ // arguments to pass. |
+ Register first_arg = temporary_register_scope.NewRegister(); |
+ for (int i = 0; i < args->length(); ++i) { |
+ Register arg = |
+ (i == 0) ? first_arg : temporary_register_scope.NewRegister(); |
+ Visit(args->at(i)); |
+ DCHECK(arg.index() - i == first_arg.index()); |
+ builder().StoreAccumulatorInRegister(arg); |
+ } |
+ |
+ Runtime::FunctionId function_id = expr->function()->function_id; |
+ builder().CallRuntime(function_id, first_arg, args->length()); |
+} |
void BytecodeGenerator::VisitUnaryOperation(UnaryOperation* expr) { |