Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Unified Diff: src/interpreter/bytecode-generator.cc

Issue 1508293003: [Interpreter] Add support for calling eval. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix comments Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/compiler/ast-graph-builder.cc ('k') | test/cctest/interpreter/test-bytecode-generator.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/interpreter/bytecode-generator.cc
diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc
index 1d8738ff6ae27cdb6ce9a46722805d26ce5f0e5c..9b46e7ff21629e36d358fa56f2de546a3f3eefb1 100644
--- a/src/interpreter/bytecode-generator.cc
+++ b/src/interpreter/bytecode-generator.cc
@@ -1615,6 +1615,7 @@ void BytecodeGenerator::VisitCall(Call* expr) {
execution_result()->PrepareForConsecutiveAllocations(args->length() + 1);
Register receiver = execution_result()->NextConsecutiveRegister();
+ bool possibly_eval = false;
switch (call_type) {
case Call::NAMED_PROPERTY_CALL:
case Call::KEYED_PROPERTY_CALL: {
@@ -1635,6 +1636,31 @@ void BytecodeGenerator::VisitCall(Call* expr) {
builder()->StoreAccumulatorInRegister(callee);
break;
}
+ case Call::POSSIBLY_EVAL_CALL: {
+ possibly_eval = true;
+ if (callee_expr->AsVariableProxy()->var()->IsLookupSlot()) {
+ TemporaryRegisterScope temporary_register_scope(builder());
+ temporary_register_scope.PrepareForConsecutiveAllocations(2);
+ Register context = temporary_register_scope.NextConsecutiveRegister();
+ Register name = temporary_register_scope.NextConsecutiveRegister();
+
+ Variable* variable = callee_expr->AsVariableProxy()->var();
+ builder()
+ ->MoveRegister(Register::function_context(), context)
+ .LoadLiteral(variable->name())
+ .StoreAccumulatorInRegister(name);
+
+ // Call LoadLookupSlot to get the callee and receiver. Reuse the context
+ // and name arguments as the return registers (since these are
+ // consecutive), and them move into callee and receiver registers.
+ builder()
+ ->CallRuntimeForPair(Runtime::kLoadLookupSlot, context, 2, context)
+ .MoveRegister(context, callee)
+ .MoveRegister(name, receiver);
+ break;
+ }
+ // Fall through.
+ }
case Call::OTHER_CALL: {
builder()->LoadUndefined().StoreAccumulatorInRegister(receiver);
VisitForAccumulatorValue(callee_expr);
@@ -1645,7 +1671,6 @@ void BytecodeGenerator::VisitCall(Call* expr) {
case Call::KEYED_SUPER_PROPERTY_CALL:
case Call::LOOKUP_SLOT_CALL:
case Call::SUPER_CALL:
- case Call::POSSIBLY_EVAL_CALL:
UNIMPLEMENTED();
}
@@ -1654,7 +1679,37 @@ void BytecodeGenerator::VisitCall(Call* expr) {
Register arg = VisitArguments(args);
CHECK(args->length() == 0 || arg.index() == receiver.index() + 1);
- // TODO(rmcilroy): Deal with possible direct eval here?
+ // Resolve callee for a potential direct eval call. This block will mutate the
+ // callee value.
+ if (possibly_eval && args->length() > 0) {
+ TemporaryRegisterScope temporary_register_scope(builder());
+ temporary_register_scope.PrepareForConsecutiveAllocations(5);
+ Register callee_for_eval =
+ temporary_register_scope.NextConsecutiveRegister();
+ Register source = temporary_register_scope.NextConsecutiveRegister();
+ Register function = temporary_register_scope.NextConsecutiveRegister();
+ Register language = temporary_register_scope.NextConsecutiveRegister();
+ Register position = temporary_register_scope.NextConsecutiveRegister();
+
+ // Set up arguments for ResolvePossiblyDirectEval by copying callee, source
+ // strings and function closure, and loading language and
+ // position.
+ builder()
+ ->MoveRegister(callee, callee_for_eval)
+ .MoveRegister(arg, source)
+ .MoveRegister(Register::function_closure(), function)
+ .LoadLiteral(Smi::FromInt(language_mode()))
+ .StoreAccumulatorInRegister(language)
+ .LoadLiteral(
+ Smi::FromInt(execution_context()->scope()->start_position()))
+ .StoreAccumulatorInRegister(position);
+
+ // Call ResolvePossiblyDirectEval and modify the callee.
+ builder()
+ ->CallRuntime(Runtime::kResolvePossiblyDirectEval, callee_for_eval, 5)
+ .StoreAccumulatorInRegister(callee);
+ }
+
// TODO(rmcilroy): Use CallIC to allow call type feedback.
builder()->Call(callee, receiver, args->length(),
feedback_index(expr->CallFeedbackICSlot()));
@@ -2052,7 +2107,12 @@ void BytecodeGenerator::VisitBuildLocalActivationContext() {
Scope* scope = this->scope();
if (scope->has_this_declaration() && scope->receiver()->IsContextSlot()) {
- UNIMPLEMENTED();
+ Variable* variable = scope->receiver();
+ Register receiver(builder()->Parameter(0));
+ // Context variable (at bottom of the context chain).
+ DCHECK_EQ(0, scope->ContextChainLength(variable->scope()));
+ builder()->LoadAccumulatorWithRegister(receiver).StoreContextSlot(
+ execution_context()->reg(), variable->index());
}
// Copy parameters into context if necessary.
« no previous file with comments | « src/compiler/ast-graph-builder.cc ('k') | test/cctest/interpreter/test-bytecode-generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698