| Index: src/objects.h
|
| diff --git a/src/objects.h b/src/objects.h
|
| index a04ae66bb61649a19b6499083108f8729acd387e..4fe42cdc81c6c0aa30317c96daf47d843bc54faa 100644
|
| --- a/src/objects.h
|
| +++ b/src/objects.h
|
| @@ -391,6 +391,7 @@ const int kStubMinorKeyBits = kSmiValueSize - kStubMajorKeyBits - 1;
|
| V(ALIASED_ARGUMENTS_ENTRY_TYPE) \
|
| V(BOX_TYPE) \
|
| V(PROTOTYPE_INFO_TYPE) \
|
| + V(SLOPPY_BLOCK_WITH_EVAL_CONTEXT_EXTENSION_TYPE) \
|
| \
|
| V(FIXED_ARRAY_TYPE) \
|
| V(FIXED_DOUBLE_ARRAY_TYPE) \
|
| @@ -507,7 +508,10 @@ const int kStubMinorKeyBits = kSmiValueSize - kStubMajorKeyBits - 1;
|
| V(ALIASED_ARGUMENTS_ENTRY, AliasedArgumentsEntry, aliased_arguments_entry) \
|
| V(DEBUG_INFO, DebugInfo, debug_info) \
|
| V(BREAK_POINT_INFO, BreakPointInfo, break_point_info) \
|
| - V(PROTOTYPE_INFO, PrototypeInfo, prototype_info)
|
| + V(PROTOTYPE_INFO, PrototypeInfo, prototype_info) \
|
| + V(SLOPPY_BLOCK_WITH_EVAL_CONTEXT_EXTENSION, \
|
| + SloppyBlockWithEvalContextExtension, \
|
| + sloppy_block_with_eval_context_extension)
|
|
|
| // We use the full 8 bits of the instance_type field to encode heap object
|
| // instance types. The high-order bit (bit 7) is set if the object is not a
|
| @@ -685,6 +689,7 @@ enum InstanceType {
|
| WEAK_CELL_TYPE,
|
| PROPERTY_CELL_TYPE,
|
| PROTOTYPE_INFO_TYPE,
|
| + SLOPPY_BLOCK_WITH_EVAL_CONTEXT_EXTENSION_TYPE,
|
|
|
| // All the following types are subtypes of JSReceiver, which corresponds to
|
| // objects in the JS sense. The first and the last type in this range are
|
| @@ -3748,6 +3753,9 @@ class ScopeInfo : public FixedArray {
|
| // Return the language mode of this scope.
|
| LanguageMode language_mode();
|
|
|
| + // True if this scope is a (var) declaration scope.
|
| + bool is_declaration_scope();
|
| +
|
| // Does this scope make a sloppy eval call?
|
| bool CallsSloppyEval() { return CallsEval() && is_sloppy(language_mode()); }
|
|
|
| @@ -3971,8 +3979,11 @@ class ScopeInfo : public FixedArray {
|
| STATIC_ASSERT(LANGUAGE_END == 3);
|
| class LanguageModeField
|
| : public BitField<LanguageMode, CallsEvalField::kNext, 2> {};
|
| + class DeclarationScopeField
|
| + : public BitField<bool, LanguageModeField::kNext, 1> {};
|
| class ReceiverVariableField
|
| - : public BitField<VariableAllocationInfo, LanguageModeField::kNext, 2> {};
|
| + : public BitField<VariableAllocationInfo, DeclarationScopeField::kNext,
|
| + 2> {};
|
| class FunctionVariableField
|
| : public BitField<VariableAllocationInfo, ReceiverVariableField::kNext,
|
| 2> {};
|
| @@ -5835,6 +5846,32 @@ class PrototypeInfo : public Struct {
|
| };
|
|
|
|
|
| +// Pair used to store both a ScopeInfo and an extension object in the extension
|
| +// slot of a block context. Needed in the rare case where a declaration block
|
| +// scope (a "varblock" as used to desugar parameter destructuring) also contains
|
| +// a sloppy direct eval. (In no other case both are needed at the same time.)
|
| +class SloppyBlockWithEvalContextExtension : public Struct {
|
| + public:
|
| + // [scope_info]: Scope info.
|
| + DECL_ACCESSORS(scope_info, ScopeInfo)
|
| + // [extension]: Extension object.
|
| + DECL_ACCESSORS(extension, JSObject)
|
| +
|
| + DECLARE_CAST(SloppyBlockWithEvalContextExtension)
|
| +
|
| + // Dispatched behavior.
|
| + DECLARE_PRINTER(SloppyBlockWithEvalContextExtension)
|
| + DECLARE_VERIFIER(SloppyBlockWithEvalContextExtension)
|
| +
|
| + static const int kScopeInfoOffset = HeapObject::kHeaderSize;
|
| + static const int kExtensionOffset = kScopeInfoOffset + kPointerSize;
|
| + static const int kSize = kExtensionOffset + kPointerSize;
|
| +
|
| + private:
|
| + DISALLOW_IMPLICIT_CONSTRUCTORS(SloppyBlockWithEvalContextExtension);
|
| +};
|
| +
|
| +
|
| // Script describes a script which has been added to the VM.
|
| class Script: public Struct {
|
| public:
|
|
|