| Index: src/interpreter/bytecode-generator.cc
|
| diff --git a/src/interpreter/bytecode-generator.cc b/src/interpreter/bytecode-generator.cc
|
| index 7a1a7a051154bf4c583f4a02460b1f61be3bc5fe..1c097ee0be7168c41179cf8ae41d4545e43d6520 100644
|
| --- a/src/interpreter/bytecode-generator.cc
|
| +++ b/src/interpreter/bytecode-generator.cc
|
| @@ -664,6 +664,10 @@ void BytecodeGenerator::FinalizeBytecode() {
|
| }
|
|
|
| void BytecodeGenerator::GenerateBytecode() {
|
| + DisallowHeapAllocation no_allocation;
|
| + DisallowHandleAllocation no_handles;
|
| + DisallowHandleDereference no_deref;
|
| +
|
| // Initialize the incoming context.
|
| ContextScope incoming_context(this, scope(), false);
|
|
|
| @@ -1158,7 +1162,8 @@ void BytecodeGenerator::VisitForInAssignment(Expression* expr,
|
| // Evaluate assignment starting with the value to be stored in the
|
| // accumulator.
|
| Property* property = expr->AsProperty();
|
| - LhsKind assign_type = Property::GetAssignType(property);
|
| + LhsKind assign_type = Property::GetAssignType(
|
| + property, HandleDereferenceMode::kHandleDereferenceDisallowed);
|
| switch (assign_type) {
|
| case VARIABLE: {
|
| Variable* variable = expr->AsVariableProxy()->var();
|
| @@ -1637,6 +1642,10 @@ void BytecodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
|
| case ObjectLiteral::Property::COMPUTED: {
|
| // It is safe to use [[Put]] here because the boilerplate already
|
| // contains computed properties with an uninitialized value.
|
| +
|
| + // TODO(5203): Remove this temporary exception.
|
| + AllowHandleDereference allow_deref;
|
| +
|
| if (literal_key->value()->IsInternalizedString()) {
|
| if (property->emit_store()) {
|
| VisitForAccumulatorValue(property->value());
|
| @@ -2145,7 +2154,8 @@ void BytecodeGenerator::VisitAssignment(Assignment* expr) {
|
|
|
| // Left-hand side can only be a property, a global or a variable slot.
|
| Property* property = expr->target()->AsProperty();
|
| - LhsKind assign_type = Property::GetAssignType(property);
|
| + LhsKind assign_type = Property::GetAssignType(
|
| + property, HandleDereferenceMode::kHandleDereferenceDisallowed);
|
|
|
| // Evaluate LHS expression.
|
| switch (assign_type) {
|
| @@ -2372,7 +2382,8 @@ void BytecodeGenerator::VisitThrow(Throw* expr) {
|
| }
|
|
|
| void BytecodeGenerator::VisitPropertyLoad(Register obj, Property* expr) {
|
| - LhsKind property_kind = Property::GetAssignType(expr);
|
| + LhsKind property_kind = Property::GetAssignType(
|
| + expr, HandleDereferenceMode::kHandleDereferenceDisallowed);
|
| FeedbackVectorSlot slot = expr->PropertyFeedbackSlot();
|
| builder()->SetExpressionPosition(expr);
|
| switch (property_kind) {
|
| @@ -2450,7 +2461,8 @@ void BytecodeGenerator::VisitKeyedSuperPropertyLoad(Property* property,
|
| }
|
|
|
| void BytecodeGenerator::VisitProperty(Property* expr) {
|
| - LhsKind property_kind = Property::GetAssignType(expr);
|
| + LhsKind property_kind = Property::GetAssignType(
|
| + expr, HandleDereferenceMode::kHandleDereferenceDisallowed);
|
| if (property_kind != NAMED_SUPER_PROPERTY &&
|
| property_kind != KEYED_SUPER_PROPERTY) {
|
| Register obj = VisitForRegisterValue(expr->obj());
|
| @@ -2494,7 +2506,8 @@ Register BytecodeGenerator::VisitArguments(ZoneList<Expression*>* args) {
|
|
|
| void BytecodeGenerator::VisitCall(Call* expr) {
|
| Expression* callee_expr = expr->expression();
|
| - Call::CallType call_type = expr->GetCallType(isolate());
|
| + Call::CallType call_type = expr->GetCallType(
|
| + isolate(), HandleDereferenceMode::kHandleDereferenceDisallowed);
|
|
|
| if (call_type == Call::SUPER_CALL) {
|
| return VisitCallSuper(expr);
|
| @@ -2759,7 +2772,9 @@ void BytecodeGenerator::VisitDelete(UnaryOperation* expr) {
|
| // not allowed in strict mode. Deleting 'this' is allowed in both modes.
|
| VariableProxy* proxy = expr->expression()->AsVariableProxy();
|
| Variable* variable = proxy->var();
|
| - DCHECK(is_sloppy(language_mode()) || variable->HasThisName(isolate()));
|
| + DCHECK(is_sloppy(language_mode()) ||
|
| + variable->HasThisName(
|
| + isolate(), HandleDereferenceMode::kHandleDereferenceDisallowed));
|
| switch (variable->location()) {
|
| case VariableLocation::GLOBAL:
|
| case VariableLocation::UNALLOCATED: {
|
| @@ -2781,7 +2796,9 @@ void BytecodeGenerator::VisitDelete(UnaryOperation* expr) {
|
| case VariableLocation::CONTEXT: {
|
| // Deleting local var/let/const, context variables, and arguments
|
| // does not have any effect.
|
| - if (variable->HasThisName(isolate())) {
|
| + if (variable->HasThisName(
|
| + isolate(),
|
| + HandleDereferenceMode::kHandleDereferenceDisallowed)) {
|
| builder()->LoadTrue();
|
| } else {
|
| builder()->LoadFalse();
|
| @@ -2812,7 +2829,8 @@ void BytecodeGenerator::VisitCountOperation(CountOperation* expr) {
|
|
|
| // Left-hand side can only be a property, a global or a variable slot.
|
| Property* property = expr->expression()->AsProperty();
|
| - LhsKind assign_type = Property::GetAssignType(property);
|
| + LhsKind assign_type = Property::GetAssignType(
|
| + property, HandleDereferenceMode::kHandleDereferenceDisallowed);
|
|
|
| bool is_postfix = expr->is_postfix() && !execution_result()->IsEffect();
|
|
|
| @@ -3033,6 +3051,11 @@ void BytecodeGenerator::VisitNewLocalFunctionContext() {
|
|
|
| // Allocate a new local context.
|
| if (scope->is_script_scope()) {
|
| + // TODO(5203): Remove this temporary exception.
|
| + AllowHeapAllocation allow_allocation;
|
| + AllowHandleAllocation allow_handles;
|
| + AllowHandleDereference allow_deref;
|
| +
|
| RegisterAllocationScope register_scope(this);
|
| Register closure = register_allocator()->NewRegister();
|
| Register scope_info = register_allocator()->NewRegister();
|
| @@ -3079,6 +3102,11 @@ void BytecodeGenerator::VisitBuildLocalActivationContext() {
|
| }
|
|
|
| void BytecodeGenerator::VisitNewLocalBlockContext(Scope* scope) {
|
| + // TODO(5203): Remove this temporary exception.
|
| + AllowHeapAllocation allow_allocation;
|
| + AllowHandleAllocation allow_handles;
|
| + AllowHandleDereference allow_deref;
|
| +
|
| AccumulatorResultScope accumulator_execution_result(this);
|
| DCHECK(scope->is_block_scope());
|
|
|
|
|