| Index: src/objects-inl.h | 
| diff --git a/src/objects-inl.h b/src/objects-inl.h | 
| index f853c3a43726404212102d9aa62c73387fd3cff9..96a54b173ae41ce722beb21c805f46061a1271e8 100644 | 
| --- a/src/objects-inl.h | 
| +++ b/src/objects-inl.h | 
| @@ -187,13 +187,6 @@ | 
| } | 
|  | 
|  | 
| -bool Object::IsFunction() const { | 
| -  STATIC_ASSERT(LAST_FUNCTION_TYPE == LAST_TYPE); | 
| -  return Object::IsHeapObject() && | 
| -         HeapObject::cast(this)->map()->instance_type() >= FIRST_FUNCTION_TYPE; | 
| -} | 
| - | 
| - | 
| bool Object::IsCallable() const { | 
| return Object::IsHeapObject() && HeapObject::cast(this)->map()->is_callable(); | 
| } | 
| @@ -748,6 +741,7 @@ | 
|  | 
|  | 
| bool Object::IsLiteralsArray() const { return IsFixedArray(); } | 
| +bool Object::IsBindingsArray() const { return IsFixedArray(); } | 
|  | 
|  | 
| bool Object::IsDeoptimizationInputData() const { | 
| @@ -828,7 +822,6 @@ | 
| } | 
|  | 
|  | 
| -TYPE_CHECKER(JSBoundFunction, JS_BOUND_FUNCTION_TYPE) | 
| TYPE_CHECKER(JSFunction, JS_FUNCTION_TYPE) | 
|  | 
|  | 
| @@ -2091,8 +2084,6 @@ | 
| return JSGlobalProxy::kSize; | 
| case JS_GLOBAL_OBJECT_TYPE: | 
| return JSGlobalObject::kSize; | 
| -    case JS_BOUND_FUNCTION_TYPE: | 
| -      return JSBoundFunction::kSize; | 
| case JS_FUNCTION_TYPE: | 
| return JSFunction::kSize; | 
| case JS_VALUE_TYPE: | 
| @@ -3226,7 +3217,6 @@ | 
| CAST_ACCESSOR(JSArray) | 
| CAST_ACCESSOR(JSArrayBuffer) | 
| CAST_ACCESSOR(JSArrayBufferView) | 
| -CAST_ACCESSOR(JSBoundFunction) | 
| CAST_ACCESSOR(JSDataView) | 
| CAST_ACCESSOR(JSDate) | 
| CAST_ACCESSOR(JSFunction) | 
| @@ -3430,6 +3420,75 @@ | 
| } | 
|  | 
|  | 
| +Object* BindingsArray::get(int index) const { return FixedArray::get(index); } | 
| + | 
| + | 
| +void BindingsArray::set(int index, Object* value) { | 
| +  FixedArray::set(index, value); | 
| +} | 
| + | 
| + | 
| +void BindingsArray::set(int index, Smi* value) { | 
| +  FixedArray::set(index, value); | 
| +} | 
| + | 
| + | 
| +void BindingsArray::set(int index, Object* value, WriteBarrierMode mode) { | 
| +  FixedArray::set(index, value, mode); | 
| +} | 
| + | 
| + | 
| +int BindingsArray::length() const { return FixedArray::length(); } | 
| + | 
| + | 
| +BindingsArray* BindingsArray::cast(Object* object) { | 
| +  SLOW_DCHECK(object->IsBindingsArray()); | 
| +  return reinterpret_cast<BindingsArray*>(object); | 
| +} | 
| + | 
| +void BindingsArray::set_feedback_vector(TypeFeedbackVector* vector) { | 
| +  set(kVectorIndex, vector); | 
| +} | 
| + | 
| + | 
| +TypeFeedbackVector* BindingsArray::feedback_vector() const { | 
| +  return TypeFeedbackVector::cast(get(kVectorIndex)); | 
| +} | 
| + | 
| + | 
| +JSReceiver* BindingsArray::bound_function() const { | 
| +  return JSReceiver::cast(get(kBoundFunctionIndex)); | 
| +} | 
| + | 
| + | 
| +void BindingsArray::set_bound_function(JSReceiver* function) { | 
| +  set(kBoundFunctionIndex, function); | 
| +} | 
| + | 
| + | 
| +Object* BindingsArray::bound_this() const { return get(kBoundThisIndex); } | 
| + | 
| + | 
| +void BindingsArray::set_bound_this(Object* bound_this) { | 
| +  set(kBoundThisIndex, bound_this); | 
| +} | 
| + | 
| + | 
| +Object* BindingsArray::binding(int binding_index) const { | 
| +  return get(kFirstBindingIndex + binding_index); | 
| +} | 
| + | 
| + | 
| +void BindingsArray::set_binding(int binding_index, Object* binding) { | 
| +  set(kFirstBindingIndex + binding_index, binding); | 
| +} | 
| + | 
| + | 
| +int BindingsArray::bindings_count() const { | 
| +  return length() - kFirstBindingIndex; | 
| +} | 
| + | 
| + | 
| void HandlerTable::SetRangeStart(int index, int value) { | 
| set(index * kRangeEntrySize + kRangeStartIndex, Smi::FromInt(value)); | 
| } | 
| @@ -4481,8 +4540,12 @@ | 
| } | 
|  | 
|  | 
| -void Map::set_is_constructor() { | 
| -  set_bit_field(bit_field() | (1 << kIsConstructor)); | 
| +void Map::set_is_constructor(bool value) { | 
| +  if (value) { | 
| +    set_bit_field(bit_field() | (1 << kIsConstructor)); | 
| +  } else { | 
| +    set_bit_field(bit_field() & ~(1 << kIsConstructor)); | 
| +  } | 
| } | 
|  | 
|  | 
| @@ -5468,16 +5531,8 @@ | 
| } | 
|  | 
|  | 
| -ACCESSORS(JSBoundFunction, length, Object, kLengthOffset) | 
| -ACCESSORS(JSBoundFunction, name, Object, kNameOffset) | 
| -ACCESSORS(JSBoundFunction, bound_target_function, JSReceiver, | 
| -          kBoundTargetFunctionOffset) | 
| -ACCESSORS(JSBoundFunction, bound_this, Object, kBoundThisOffset) | 
| -ACCESSORS(JSBoundFunction, bound_arguments, FixedArray, kBoundArgumentsOffset) | 
| -ACCESSORS(JSBoundFunction, creation_context, Context, kCreationContextOffset) | 
| - | 
| ACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset) | 
| -ACCESSORS(JSFunction, literals, LiteralsArray, kLiteralsOffset) | 
| +ACCESSORS(JSFunction, literals_or_bindings, FixedArray, kLiteralsOffset) | 
| ACCESSORS(JSFunction, next_function_link, Object, kNextFunctionLinkOffset) | 
|  | 
| ACCESSORS(JSGlobalObject, native_context, Context, kNativeContextOffset) | 
| @@ -5820,6 +5875,7 @@ | 
| BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, | 
| name_should_print_as_anonymous, | 
| kNameShouldPrintAsAnonymous) | 
| +BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, bound, kBoundFunction) | 
| BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, is_anonymous, kIsAnonymous) | 
| BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, is_function, kIsFunction) | 
| BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, dont_crankshaft, | 
| @@ -6264,7 +6320,36 @@ | 
| } | 
|  | 
|  | 
| +LiteralsArray* JSFunction::literals() { | 
| +  DCHECK(!shared()->bound()); | 
| +  return LiteralsArray::cast(literals_or_bindings()); | 
| +} | 
| + | 
| + | 
| +void JSFunction::set_literals(LiteralsArray* literals) { | 
| +  DCHECK(!shared()->bound()); | 
| +  set_literals_or_bindings(literals); | 
| +} | 
| + | 
| + | 
| +BindingsArray* JSFunction::function_bindings() { | 
| +  DCHECK(shared()->bound()); | 
| +  return BindingsArray::cast(literals_or_bindings()); | 
| +} | 
| + | 
| + | 
| +void JSFunction::set_function_bindings(BindingsArray* bindings) { | 
| +  DCHECK(shared()->bound()); | 
| +  // Bound function literal may be initialized to the empty fixed array | 
| +  // before the bindings are set. | 
| +  DCHECK(bindings == GetHeap()->empty_fixed_array() || | 
| +         bindings->map() == GetHeap()->fixed_array_map()); | 
| +  set_literals_or_bindings(bindings); | 
| +} | 
| + | 
| + | 
| int JSFunction::NumberOfLiterals() { | 
| +  DCHECK(!shared()->bound()); | 
| return literals()->length(); | 
| } | 
|  | 
|  |