Index: src/runtime/runtime-scopes.cc |
diff --git a/src/runtime/runtime-scopes.cc b/src/runtime/runtime-scopes.cc |
index 6e0f6fe21370bb3e17a39d0a456246ab01d390ed..50f5704f3275a5566eb9ef087fdbce8671716c97 100644 |
--- a/src/runtime/runtime-scopes.cc |
+++ b/src/runtime/runtime-scopes.cc |
@@ -139,6 +139,7 @@ Object* DeclareGlobals(Isolate* isolate, Handle<FixedArray> declarations, |
FOR_WITH_HANDLE_SCOPE(isolate, int, i = 0, i, i < length, i += 4, { |
Handle<String> name(String::cast(declarations->get(i)), isolate); |
FeedbackVectorSlot slot(Smi::cast(declarations->get(i + 1))->value()); |
+ Handle<Object> possibly_literal_slot(declarations->get(i + 2), isolate); |
Handle<Object> initial_value(declarations->get(i + 3), isolate); |
bool is_var = initial_value->IsUndefined(isolate); |
@@ -147,12 +148,17 @@ Object* DeclareGlobals(Isolate* isolate, Handle<FixedArray> declarations, |
Handle<Object> value; |
if (is_function) { |
+ DCHECK(possibly_literal_slot->IsSmi()); |
// Copy the function and update its context. Use it as value. |
Handle<SharedFunctionInfo> shared = |
Handle<SharedFunctionInfo>::cast(initial_value); |
+ FeedbackVectorSlot literals_slot( |
+ Smi::cast(*possibly_literal_slot)->value()); |
+ Handle<Cell> literals(Cell::cast(feedback_vector->Get(literals_slot)), |
+ isolate); |
Handle<JSFunction> function = |
- isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, context, |
- TENURED); |
+ isolate->factory()->NewFunctionFromSharedFunctionInfo( |
+ shared, context, literals, TENURED); |
value = function; |
} else { |
value = isolate->factory()->undefined_value(); |
@@ -612,10 +618,14 @@ RUNTIME_FUNCTION(Runtime_NewClosure) { |
HandleScope scope(isolate); |
DCHECK_EQ(3, args.length()); |
CONVERT_ARG_HANDLE_CHECKED(SharedFunctionInfo, shared, 0); |
+ CONVERT_ARG_HANDLE_CHECKED(TypeFeedbackVector, vector, 1); |
+ CONVERT_SMI_ARG_CHECKED(index, 2); |
Handle<Context> context(isolate->context(), isolate); |
+ FeedbackVectorSlot slot = TypeFeedbackVector::ToSlot(index); |
+ Handle<Cell> literals(Cell::cast(vector->Get(slot)), isolate); |
Handle<JSFunction> function = |
- isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, context, |
- NOT_TENURED); |
+ isolate->factory()->NewFunctionFromSharedFunctionInfo( |
+ shared, context, literals, NOT_TENURED); |
return *function; |
} |
@@ -624,12 +634,16 @@ RUNTIME_FUNCTION(Runtime_NewClosure_Tenured) { |
HandleScope scope(isolate); |
DCHECK_EQ(3, args.length()); |
CONVERT_ARG_HANDLE_CHECKED(SharedFunctionInfo, shared, 0); |
+ CONVERT_ARG_HANDLE_CHECKED(TypeFeedbackVector, vector, 1); |
+ CONVERT_SMI_ARG_CHECKED(index, 2); |
Handle<Context> context(isolate->context(), isolate); |
+ FeedbackVectorSlot slot = TypeFeedbackVector::ToSlot(index); |
+ Handle<Cell> literals(Cell::cast(vector->Get(slot)), isolate); |
// The caller ensures that we pretenure closures that are assigned |
// directly to properties. |
Handle<JSFunction> function = |
isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, context, |
- TENURED); |
+ literals, TENURED); |
return *function; |
} |