| Index: vm/code_generator_ia32.cc
|
| ===================================================================
|
| --- vm/code_generator_ia32.cc (revision 9042)
|
| +++ vm/code_generator_ia32.cc (working copy)
|
| @@ -323,7 +323,7 @@
|
|
|
| void CodeGenerator::GenerateInstanceCall(
|
| intptr_t node_id,
|
| - intptr_t token_index,
|
| + intptr_t token_pos,
|
| const String& function_name,
|
| int num_arguments,
|
| const Array& optional_arguments_names,
|
| @@ -360,7 +360,7 @@
|
| __ call(&target_label);
|
| AddCurrentDescriptor(PcDescriptors::kIcCall,
|
| node_id,
|
| - token_index);
|
| + token_pos);
|
| __ addl(ESP, Immediate(num_arguments * kWordSize));
|
| }
|
|
|
| @@ -707,7 +707,7 @@
|
| __ nop(1);
|
| AddCurrentDescriptor(PcDescriptors::kReturn,
|
| node->id(),
|
| - node->token_index());
|
| + node->token_pos());
|
|
|
| #ifdef DEBUG
|
| __ Bind(&wrong_stack);
|
| @@ -756,7 +756,7 @@
|
| if (is_static || !is_implicit_getter) {
|
| GenerateAssertAssignable(
|
| node->id(),
|
| - node->value()->token_index(),
|
| + node->value()->token_pos(),
|
| node->value(),
|
| AbstractType::ZoneHandle(parsed_function().function().result_type()),
|
| String::ZoneHandle(String::NewSymbol("function result")));
|
| @@ -783,7 +783,7 @@
|
| node->expr()->Visit(this);
|
| __ popl(EAX);
|
| GenerateAssertAssignable(node->id(),
|
| - node->token_index(),
|
| + node->token_pos(),
|
| node->expr(),
|
| node->type(),
|
| node->dst_name());
|
| @@ -823,14 +823,14 @@
|
| if (requires_type_arguments) {
|
| ASSERT(!function.IsImplicitStaticClosureFunction());
|
| const bool kPushInstantiator = false;
|
| - GenerateInstantiatorTypeArguments(node->token_index(), kPushInstantiator);
|
| + GenerateInstantiatorTypeArguments(node->token_pos(), kPushInstantiator);
|
| } else {
|
| __ pushl(raw_null); // No type arguments.
|
| }
|
| const Code& stub = Code::Handle(
|
| StubCode::GetAllocationStubForClosure(function));
|
| const ExternalLabel label(function.ToCString(), stub.EntryPoint());
|
| - GenerateCall(node->token_index(), &label, PcDescriptors::kOther);
|
| + GenerateCall(node->token_pos(), &label, PcDescriptors::kOther);
|
| __ popl(ECX); // Pop type arguments.
|
| __ popl(ECX); // Pop receiver.
|
| if (IsResultNeeded(node)) {
|
| @@ -849,7 +849,7 @@
|
| __ PushObject(Object::ZoneHandle()); // Make room for the result.
|
| __ pushl(CTX);
|
| GenerateCallRuntime(node->id(),
|
| - node->token_index(), kCloneContextRuntimeEntry);
|
| + node->token_pos(), kCloneContextRuntimeEntry);
|
| __ popl(EAX);
|
| __ popl(CTX); // result: cloned context. Set as current context.
|
| }
|
| @@ -867,7 +867,7 @@
|
| __ movl(EDX, Immediate(num_context_variables));
|
| const ExternalLabel label("alloc_context",
|
| StubCode::AllocateContextEntryPoint());
|
| - GenerateCall(node_sequence->token_index(), &label, PcDescriptors::kOther);
|
| + GenerateCall(node_sequence->token_pos(), &label, PcDescriptors::kOther);
|
|
|
| // If this node_sequence is the body of the function being compiled, and if
|
| // this function is not a closure, do not link the current context as the
|
| @@ -965,7 +965,7 @@
|
| const AbstractTypeArguments& element_type = node->type_arguments();
|
| const bool instantiate_type_arguments = true;
|
| GenerateTypeArguments(node->id(),
|
| - node->token_index(),
|
| + node->token_pos(),
|
| element_type,
|
| instantiate_type_arguments);
|
| __ popl(ECX);
|
| @@ -974,7 +974,7 @@
|
| // Allocate the array.
|
| // EDX : Array length as Smi.
|
| // ECX : element type for the array.
|
| - GenerateCall(node->token_index(),
|
| + GenerateCall(node->token_pos(),
|
| &StubCode::AllocateArrayLabel(),
|
| PcDescriptors::kOther);
|
|
|
| @@ -1007,7 +1007,7 @@
|
| __ popl(EAX);
|
| if (FLAG_enable_type_checks) {
|
| GenerateAssertAssignable(node->id(),
|
| - node->value()->token_index(),
|
| + node->value()->token_pos(),
|
| node->value(),
|
| node->local().type(),
|
| node->local().name());
|
| @@ -1021,7 +1021,7 @@
|
|
|
| void CodeGenerator::VisitLoadInstanceFieldNode(LoadInstanceFieldNode* node) {
|
| node->instance()->Visit(this);
|
| - MarkDeoptPoint(node->id(), node->token_index());
|
| + MarkDeoptPoint(node->id(), node->token_pos());
|
| __ popl(EAX); // Instance.
|
| __ movl(EAX, FieldAddress(EAX, node->field().Offset()));
|
| if (IsResultNeeded(node)) {
|
| @@ -1033,11 +1033,11 @@
|
| void CodeGenerator::VisitStoreInstanceFieldNode(StoreInstanceFieldNode* node) {
|
| node->instance()->Visit(this);
|
| node->value()->Visit(this);
|
| - MarkDeoptPoint(node->id(), node->token_index());
|
| + MarkDeoptPoint(node->id(), node->token_pos());
|
| __ popl(EAX); // Value.
|
| if (FLAG_enable_type_checks) {
|
| GenerateAssertAssignable(node->id(),
|
| - node->value()->token_index(),
|
| + node->value()->token_pos(),
|
| node->value(),
|
| AbstractType::ZoneHandle(node->field().type()),
|
| String::ZoneHandle(node->field().name()));
|
| @@ -1050,7 +1050,7 @@
|
|
|
| // Expects array and index on stack and returns result in EAX.
|
| void CodeGenerator::GenerateLoadIndexed(intptr_t node_id,
|
| - intptr_t token_index) {
|
| + intptr_t token_pos) {
|
| // Invoke the [] operator on the receiver object with the index as argument.
|
| const String& operator_name =
|
| String::ZoneHandle(String::NewSymbol(Token::Str(Token::kINDEX)));
|
| @@ -1058,7 +1058,7 @@
|
| const Array& kNoArgumentNames = Array::Handle();
|
| const int kNumArgumentsChecked = 1;
|
| GenerateInstanceCall(node_id,
|
| - token_index,
|
| + token_pos,
|
| operator_name,
|
| kNumArguments,
|
| kNoArgumentNames,
|
| @@ -1070,8 +1070,8 @@
|
| node->array()->Visit(this);
|
| // Now compute the index.
|
| node->index_expr()->Visit(this);
|
| - MarkDeoptPoint(node->id(), node->token_index());
|
| - GenerateLoadIndexed(node->id(), node->token_index());
|
| + MarkDeoptPoint(node->id(), node->token_pos());
|
| + GenerateLoadIndexed(node->id(), node->token_pos());
|
| // Result is in EAX.
|
| if (IsResultNeeded(node)) {
|
| __ pushl(EAX);
|
| @@ -1084,7 +1084,7 @@
|
| // TOS(1): index.
|
| // TOS(2): array.
|
| void CodeGenerator::GenerateStoreIndexed(intptr_t node_id,
|
| - intptr_t token_index,
|
| + intptr_t token_pos,
|
| bool preserve_value) {
|
| // It is not necessary to generate a type test of the assigned value here,
|
| // because the []= operator will check the type of its incoming arguments.
|
| @@ -1105,7 +1105,7 @@
|
| const Array& kNoArgumentNames = Array::Handle();
|
| const int kNumArgumentsChecked = 1;
|
| GenerateInstanceCall(node_id,
|
| - token_index,
|
| + token_pos,
|
| operator_name,
|
| kNumArguments,
|
| kNoArgumentNames,
|
| @@ -1120,13 +1120,13 @@
|
| node->index_expr()->Visit(this);
|
| // Finally compute the value to assign.
|
| node->value()->Visit(this);
|
| - MarkDeoptPoint(node->id(), node->token_index());
|
| - GenerateStoreIndexed(node->id(), node->token_index(), IsResultNeeded(node));
|
| + MarkDeoptPoint(node->id(), node->token_pos());
|
| + GenerateStoreIndexed(node->id(), node->token_pos(), IsResultNeeded(node));
|
| }
|
|
|
|
|
| void CodeGenerator::VisitLoadStaticFieldNode(LoadStaticFieldNode* node) {
|
| - MarkDeoptPoint(node->id(), node->token_index());
|
| + MarkDeoptPoint(node->id(), node->token_pos());
|
| __ LoadObject(EDX, node->field());
|
| __ movl(EAX, FieldAddress(EDX, Field::value_offset()));
|
| if (IsResultNeeded(node)) {
|
| @@ -1137,11 +1137,11 @@
|
|
|
| void CodeGenerator::VisitStoreStaticFieldNode(StoreStaticFieldNode* node) {
|
| node->value()->Visit(this);
|
| - MarkDeoptPoint(node->id(), node->token_index());
|
| + MarkDeoptPoint(node->id(), node->token_pos());
|
| __ popl(EAX); // Value.
|
| if (FLAG_enable_type_checks) {
|
| GenerateAssertAssignable(node->id(),
|
| - node->value()->token_index(),
|
| + node->value()->token_pos(),
|
| node->value(),
|
| AbstractType::ZoneHandle(node->field().type()),
|
| String::ZoneHandle(node->field().name()));
|
| @@ -1160,9 +1160,9 @@
|
| const Bool& bool_true = Bool::ZoneHandle(Bool::True());
|
| const Bool& bool_false = Bool::ZoneHandle(Bool::False());
|
| node->operand()->Visit(this);
|
| - MarkDeoptPoint(node->id(), node->token_index());
|
| + MarkDeoptPoint(node->id(), node->token_pos());
|
| Label done;
|
| - GenerateConditionTypeCheck(node->id(), node->operand()->token_index());
|
| + GenerateConditionTypeCheck(node->id(), node->operand()->token_pos());
|
| __ popl(EDX);
|
| __ LoadObject(EAX, bool_true);
|
| __ cmpl(EAX, EDX);
|
| @@ -1190,7 +1190,7 @@
|
| }
|
| return;
|
| }
|
| - MarkDeoptPoint(node->id(), node->token_index());
|
| + MarkDeoptPoint(node->id(), node->token_pos());
|
| String& operator_name = String::ZoneHandle();
|
| if (node->kind() == Token::kSUB) {
|
| operator_name = String::NewSymbol(Token::Str(Token::kNEGATE));
|
| @@ -1201,7 +1201,7 @@
|
| const Array& kNoArgumentNames = Array::Handle();
|
| const int kNumArgumentsChecked = 1;
|
| GenerateInstanceCall(node->id(),
|
| - node->token_index(),
|
| + node->token_pos(),
|
| operator_name,
|
| kNumberOfArguments,
|
| kNoArgumentNames,
|
| @@ -1220,7 +1220,7 @@
|
| // code (type-feedback).
|
| RawSubtypeTestCache* CodeGenerator::GenerateSubtype1TestCacheLookup(
|
| intptr_t node_id,
|
| - intptr_t token_index,
|
| + intptr_t token_pos,
|
| const Class& type_class,
|
| Label* is_instance_lbl,
|
| Label* is_not_instance_lbl) {
|
| @@ -1268,7 +1268,7 @@
|
| // Clobbers many registers.
|
| RawSubtypeTestCache* CodeGenerator::GenerateInlineInstanceof(
|
| intptr_t node_id,
|
| - intptr_t token_index,
|
| + intptr_t token_pos,
|
| const AbstractType& type,
|
| Label* is_instance_lbl,
|
| Label* is_not_instance_lbl) {
|
| @@ -1279,27 +1279,27 @@
|
| // non-parameterized class or with a raw dst type of a parameterized class.
|
| if (type_class.HasTypeArguments()) {
|
| return GenerateInstantiatedTypeWithArgumentsTest(node_id,
|
| - token_index,
|
| + token_pos,
|
| type,
|
| is_instance_lbl,
|
| is_not_instance_lbl);
|
| // Fall through to runtime call.
|
| } else {
|
| GenerateInstantiatedTypeNoArgumentsTest(node_id,
|
| - token_index,
|
| + token_pos,
|
| type,
|
| is_instance_lbl,
|
| is_not_instance_lbl);
|
| // If test non-conclusive so far, try the inlined type-test cache.
|
| // 'type' is known at compile time.
|
| return GenerateSubtype1TestCacheLookup(
|
| - node_id, token_index, type_class,
|
| + node_id, token_pos, type_class,
|
| is_instance_lbl, is_not_instance_lbl);
|
| }
|
| } else {
|
| return GenerateUninstantiatedTypeTest(type,
|
| node_id,
|
| - token_index,
|
| + token_pos,
|
| is_instance_lbl,
|
| is_not_instance_lbl);
|
| }
|
| @@ -1318,7 +1318,7 @@
|
| // Returns:
|
| // - true or false on stack.
|
| void CodeGenerator::GenerateInstanceOf(intptr_t node_id,
|
| - intptr_t token_index,
|
| + intptr_t token_pos,
|
| AstNode* value,
|
| const AbstractType& type,
|
| bool negate_result) {
|
| @@ -1385,11 +1385,11 @@
|
| __ Bind(&non_null);
|
| }
|
| SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle();
|
| - test_cache = GenerateInlineInstanceof(node_id, token_index, type,
|
| + test_cache = GenerateInlineInstanceof(node_id, token_pos, type,
|
| &is_instance_of, &is_not_instance_of);
|
|
|
| __ PushObject(Object::ZoneHandle()); // Make room for the result.
|
| - const Immediate location = Immediate(Smi::RawValue(token_index));
|
| + const Immediate location = Immediate(Smi::RawValue(token_pos));
|
| const Immediate node_id_as_smi = Immediate(Smi::RawValue(node_id));
|
| __ pushl(location); // Push the source location.
|
| __ pushl(node_id_as_smi); // node-id.
|
| @@ -1400,11 +1400,11 @@
|
| __ pushl(raw_null); // Null instantiator.
|
| } else {
|
| const bool kPushInstantiator = true;
|
| - GenerateInstantiatorTypeArguments(token_index, kPushInstantiator);
|
| + GenerateInstantiatorTypeArguments(token_pos, kPushInstantiator);
|
| }
|
| __ LoadObject(EAX, test_cache);
|
| __ pushl(EAX);
|
| - GenerateCallRuntime(node_id, token_index, kInstanceofRuntimeEntry);
|
| + GenerateCallRuntime(node_id, token_pos, kInstanceofRuntimeEntry);
|
| // Pop the two parameters supplied to the runtime entry. The result of the
|
| // instanceof runtime call will be left as the result of the operation.
|
| __ addl(ESP, Immediate(7 * kWordSize));
|
| @@ -1433,7 +1433,7 @@
|
| // be completed.
|
| RawSubtypeTestCache* CodeGenerator::GenerateInstantiatedTypeWithArgumentsTest(
|
| intptr_t node_id,
|
| - intptr_t token_index,
|
| + intptr_t token_pos,
|
| const AbstractType& type,
|
| Label* is_instance_lbl,
|
| Label* is_not_instance_lbl) {
|
| @@ -1464,7 +1464,7 @@
|
| __ j(EQUAL, is_instance_lbl);
|
| }
|
| return
|
| - GenerateSubtype1TestCacheLookup(node_id, token_index, type_class,
|
| + GenerateSubtype1TestCacheLookup(node_id, token_pos, type_class,
|
| is_instance_lbl, is_not_instance_lbl);
|
| }
|
| // If one type argument only, quick check.
|
| @@ -1482,7 +1482,7 @@
|
| // Instance class test only necessary.
|
| return GenerateSubtype1TestCacheLookup(
|
| node_id,
|
| - token_index,
|
| + token_pos,
|
| type_class,
|
| is_instance_lbl,
|
| is_not_instance_lbl);
|
| @@ -1519,7 +1519,7 @@
|
| // Clobbers: EBX, ECX, EDX.
|
| void CodeGenerator::GenerateInstantiatedTypeNoArgumentsTest(
|
| intptr_t node_id,
|
| - intptr_t token_index,
|
| + intptr_t token_pos,
|
| const AbstractType& type,
|
| Label* is_instance_lbl,
|
| Label* is_not_instance_lbl) {
|
| @@ -1606,7 +1606,7 @@
|
| RawSubtypeTestCache* CodeGenerator::GenerateUninstantiatedTypeTest(
|
| const AbstractType& type,
|
| intptr_t node_id,
|
| - intptr_t token_index,
|
| + intptr_t token_pos,
|
| Label* is_instance_lbl,
|
| Label* is_not_instance_lbl) {
|
| ASSERT(!type.IsInstantiated());
|
| @@ -1617,7 +1617,7 @@
|
| // EAX must be preserved!
|
| Label fall_through;
|
| const bool kPushInstantiator = false;
|
| - GenerateInstantiatorTypeArguments(token_index, kPushInstantiator);
|
| + GenerateInstantiatorTypeArguments(token_pos, kPushInstantiator);
|
| // Type arguments are on stack.
|
| __ popl(EBX);
|
| // Check if type argument is dynamic.
|
| @@ -1687,7 +1687,7 @@
|
| __ pushl(EDX); // Subtype test cache.
|
| __ pushl(EAX); // Instance.
|
| const bool kPushInstantiator = false;
|
| - GenerateInstantiatorTypeArguments(token_index, kPushInstantiator);
|
| + GenerateInstantiatorTypeArguments(token_pos, kPushInstantiator);
|
| __ call(&StubCode::Subtype3TestCacheLabel());
|
| __ popl(EDX); // Discard type arguments.
|
| __ popl(EAX); // Restore receiver.
|
| @@ -1719,12 +1719,12 @@
|
| // Performance notes: positive checks must be quick, negative checks can be slow
|
| // as they throw an exception.
|
| void CodeGenerator::GenerateAssertAssignable(intptr_t node_id,
|
| - intptr_t token_index,
|
| + intptr_t token_pos,
|
| AstNode* value,
|
| const AbstractType& dst_type,
|
| const String& dst_name) {
|
| ASSERT(FLAG_enable_type_checks);
|
| - ASSERT(token_index >= 0);
|
| + ASSERT(token_pos >= 0);
|
| ASSERT(!dst_type.IsNull());
|
| ASSERT(dst_type.IsFinalized());
|
|
|
| @@ -1777,11 +1777,11 @@
|
| const String& error_message = String::ZoneHandle(
|
| String::NewSymbol(error.ToErrorCString()));
|
| __ PushObject(Object::ZoneHandle()); // Make room for the result.
|
| - __ pushl(Immediate(Smi::RawValue(token_index))); // Source location.
|
| + __ pushl(Immediate(Smi::RawValue(token_pos))); // Source location.
|
| __ pushl(EAX); // Push the source object.
|
| __ PushObject(dst_name); // Push the name of the destination.
|
| __ PushObject(error_message);
|
| - GenerateCallRuntime(node_id, token_index, kMalformedTypeErrorRuntimeEntry);
|
| + GenerateCallRuntime(node_id, token_pos, kMalformedTypeErrorRuntimeEntry);
|
| // We should never return here.
|
| __ int3();
|
|
|
| @@ -1790,12 +1790,12 @@
|
| }
|
|
|
| SubtypeTestCache& test_cache = SubtypeTestCache::ZoneHandle();
|
| - test_cache = GenerateInlineInstanceof(node_id, token_index, dst_type,
|
| + test_cache = GenerateInlineInstanceof(node_id, token_pos, dst_type,
|
| &done, &runtime_call);
|
|
|
| __ Bind(&runtime_call);
|
| __ PushObject(Object::ZoneHandle()); // Make room for the result.
|
| - __ pushl(Immediate(Smi::RawValue(token_index))); // Source location.
|
| + __ pushl(Immediate(Smi::RawValue(token_pos))); // Source location.
|
| __ pushl(Immediate(Smi::RawValue(node_id))); // node-id.
|
| __ pushl(EAX); // Push the source object.
|
| __ PushObject(dst_type); // Push the type of the destination.
|
| @@ -1804,12 +1804,12 @@
|
| __ pushl(raw_null); // Null instantiator type argument.
|
| } else {
|
| const bool kPushInstantiator = true;
|
| - GenerateInstantiatorTypeArguments(token_index, kPushInstantiator);
|
| + GenerateInstantiatorTypeArguments(token_pos, kPushInstantiator);
|
| }
|
| __ PushObject(dst_name); // Push the name of the destination.
|
| __ LoadObject(EAX, test_cache);
|
| __ pushl(EAX);
|
| - GenerateCallRuntime(node_id, token_index, kTypeCheckRuntimeEntry);
|
| + GenerateCallRuntime(node_id, token_pos, kTypeCheckRuntimeEntry);
|
| // Pop the parameters supplied to the runtime entry. The result of the
|
| // type check runtime call is the checked value.
|
| __ addl(ESP, Immediate(8 * kWordSize));
|
| @@ -1831,7 +1831,7 @@
|
| LocalVariable* parameter = scope->VariableAt(i);
|
| GenerateLoadVariable(EAX, *parameter);
|
| GenerateAssertAssignable(sequence_node.ParameterIdAt(i),
|
| - parameter->token_index(),
|
| + parameter->token_pos(),
|
| NULL,
|
| parameter->type(),
|
| parameter->name());
|
| @@ -1840,7 +1840,7 @@
|
|
|
|
|
| void CodeGenerator::GenerateConditionTypeCheck(intptr_t node_id,
|
| - intptr_t token_index) {
|
| + intptr_t token_pos) {
|
| if (!FLAG_enable_type_checks) {
|
| return;
|
| }
|
| @@ -1863,9 +1863,9 @@
|
| __ j(EQUAL, &done, Assembler::kNearJump);
|
|
|
| __ Bind(&runtime_call);
|
| - __ pushl(Immediate(Smi::RawValue(token_index))); // Source location.
|
| + __ pushl(Immediate(Smi::RawValue(token_pos))); // Source location.
|
| __ pushl(EAX); // Push the source object.
|
| - GenerateCallRuntime(node_id, token_index, kConditionTypeErrorRuntimeEntry);
|
| + GenerateCallRuntime(node_id, token_pos, kConditionTypeErrorRuntimeEntry);
|
| // We should never return here.
|
| __ int3();
|
|
|
| @@ -1883,7 +1883,7 @@
|
| __ popl(EAX); // Left operand.
|
| ASSERT(node->right()->IsTypeNode());
|
| GenerateInstanceOf(node->id(),
|
| - node->token_index(),
|
| + node->token_pos(),
|
| node->left(),
|
| node->right()->AsTypeNode()->type(),
|
| (node->kind() == Token::kISNOT));
|
| @@ -1921,7 +1921,7 @@
|
| return;
|
| }
|
|
|
| - MarkDeoptPoint(node->id(), node->token_index());
|
| + MarkDeoptPoint(node->id(), node->token_pos());
|
|
|
| // '!=' not overloadable, always implements negation of '=='.
|
| // Call operator for '=='.
|
| @@ -1960,7 +1960,7 @@
|
| const Array& kNoArgumentNames = Array::Handle();
|
| const int kNumArgumentsChecked = 1;
|
| GenerateInstanceCall(node->id(),
|
| - node->token_index(),
|
| + node->token_pos(),
|
| operator_name,
|
| kNumberOfArguments,
|
| kNoArgumentNames,
|
| @@ -1988,7 +1988,7 @@
|
| }
|
|
|
| // Call operator.
|
| - GenerateBinaryOperatorCall(node->id(), node->token_index(), node->Name());
|
| + GenerateBinaryOperatorCall(node->id(), node->token_pos(), node->Name());
|
| // Result is in EAX.
|
| if (IsResultNeeded(node)) {
|
| __ pushl(EAX);
|
| @@ -1997,7 +1997,7 @@
|
|
|
|
|
| void CodeGenerator::HandleBackwardBranch(
|
| - intptr_t loop_id, intptr_t token_index) {
|
| + intptr_t loop_id, intptr_t token_pos) {
|
| // Use stack overflow check to eventually stop execution of loops.
|
| // This is necessary only if a loop does not have calls.
|
| __ cmpl(ESP,
|
| @@ -2005,7 +2005,7 @@
|
| Label no_stack_overflow;
|
| __ j(ABOVE, &no_stack_overflow);
|
| GenerateCallRuntime(loop_id,
|
| - token_index,
|
| + token_pos,
|
| kStackOverflowRuntimeEntry);
|
| __ Bind(&no_stack_overflow);
|
| }
|
| @@ -2016,13 +2016,13 @@
|
| SourceLabel* label = node->label();
|
| __ Bind(label->continue_label());
|
| node->condition()->Visit(this);
|
| - GenerateConditionTypeCheck(node->id(), node->condition()->token_index());
|
| + GenerateConditionTypeCheck(node->id(), node->condition()->token_pos());
|
| __ popl(EAX);
|
| __ LoadObject(EDX, bool_true);
|
| __ cmpl(EAX, EDX);
|
| __ j(NOT_EQUAL, label->break_label());
|
| node->body()->Visit(this);
|
| - HandleBackwardBranch(node->id(), node->token_index());
|
| + HandleBackwardBranch(node->id(), node->token_pos());
|
| __ jmp(label->continue_label());
|
| __ Bind(label->break_label());
|
| }
|
| @@ -2034,10 +2034,10 @@
|
| Label loop;
|
| __ Bind(&loop);
|
| node->body()->Visit(this);
|
| - HandleBackwardBranch(node->id(), node->token_index());
|
| + HandleBackwardBranch(node->id(), node->token_pos());
|
| __ Bind(label->continue_label());
|
| node->condition()->Visit(this);
|
| - GenerateConditionTypeCheck(node->id(), node->condition()->token_index());
|
| + GenerateConditionTypeCheck(node->id(), node->condition()->token_pos());
|
| __ popl(EAX);
|
| __ LoadObject(EDX, bool_true);
|
| __ cmpl(EAX, EDX);
|
| @@ -2054,14 +2054,14 @@
|
| __ Bind(&loop);
|
| if (node->condition() != NULL) {
|
| node->condition()->Visit(this);
|
| - GenerateConditionTypeCheck(node->id(), node->condition()->token_index());
|
| + GenerateConditionTypeCheck(node->id(), node->condition()->token_pos());
|
| __ popl(EAX);
|
| __ LoadObject(EDX, bool_true);
|
| __ cmpl(EAX, EDX);
|
| __ j(NOT_EQUAL, label->break_label());
|
| }
|
| node->body()->Visit(this);
|
| - HandleBackwardBranch(node->id(), node->token_index());
|
| + HandleBackwardBranch(node->id(), node->token_pos());
|
| __ Bind(label->continue_label());
|
| node->increment()->Visit(this);
|
| __ jmp(&loop);
|
| @@ -2117,7 +2117,7 @@
|
| const Bool& bool_true = Bool::ZoneHandle(Bool::True());
|
| Label false_label, done;
|
| node->condition()->Visit(this);
|
| - GenerateConditionTypeCheck(node->id(), node->condition()->token_index());
|
| + GenerateConditionTypeCheck(node->id(), node->condition()->token_pos());
|
| __ popl(EAX);
|
| __ LoadObject(EDX, bool_true);
|
| __ cmpl(EAX, EDX);
|
| @@ -2177,7 +2177,7 @@
|
| const Bool& bool_true = Bool::ZoneHandle(Bool::True());
|
| Label false_label;
|
| node->condition()->Visit(this);
|
| - GenerateConditionTypeCheck(node->id(), node->condition()->token_index());
|
| + GenerateConditionTypeCheck(node->id(), node->condition()->token_pos());
|
| __ popl(EAX);
|
| __ LoadObject(EDX, bool_true);
|
| __ cmpl(EAX, EDX);
|
| @@ -2203,7 +2203,7 @@
|
| const Bool& bool_false = Bool::ZoneHandle(Bool::False());
|
| Label load_false, done;
|
| node->left()->Visit(this);
|
| - GenerateConditionTypeCheck(node->id(), node->left()->token_index());
|
| + GenerateConditionTypeCheck(node->id(), node->left()->token_pos());
|
| __ popl(EAX);
|
| __ LoadObject(EDX, bool_true);
|
| __ cmpl(EAX, EDX);
|
| @@ -2214,7 +2214,7 @@
|
| __ j(EQUAL, &done);
|
| }
|
| node->right()->Visit(this);
|
| - GenerateConditionTypeCheck(node->id(), node->right()->token_index());
|
| + GenerateConditionTypeCheck(node->id(), node->right()->token_pos());
|
| __ popl(EAX);
|
| __ LoadObject(EDX, bool_true);
|
| __ cmpl(EAX, EDX);
|
| @@ -2231,14 +2231,14 @@
|
| // Expect receiver(left operand) and right operand on stack.
|
| // Return result in EAX.
|
| void CodeGenerator::GenerateBinaryOperatorCall(intptr_t node_id,
|
| - intptr_t token_index,
|
| + intptr_t token_pos,
|
| const char* name) {
|
| const String& operator_name = String::ZoneHandle(String::NewSymbol(name));
|
| const int kNumberOfArguments = 2;
|
| const Array& kNoArgumentNames = Array::Handle();
|
| const int kNumArgumentsChecked = 2;
|
| GenerateInstanceCall(node_id,
|
| - token_index,
|
| + token_pos,
|
| operator_name,
|
| kNumberOfArguments,
|
| kNoArgumentNames,
|
| @@ -2255,8 +2255,8 @@
|
| }
|
| node->left()->Visit(this);
|
| node->right()->Visit(this);
|
| - MarkDeoptPoint(node->id(), node->token_index());
|
| - GenerateBinaryOperatorCall(node->id(), node->token_index(), node->Name());
|
| + MarkDeoptPoint(node->id(), node->token_pos());
|
| + GenerateBinaryOperatorCall(node->id(), node->token_pos(), node->Name());
|
| if (IsResultNeeded(node)) {
|
| __ pushl(EAX);
|
| }
|
| @@ -2306,7 +2306,7 @@
|
| if (concatenated.IsUnhandledException()) {
|
| // TODO(hausner): Shouldn't we generate a throw?
|
| // Then remove unused CodeGenerator::ErrorMsg().
|
| - ErrorMsg(node->token_index(),
|
| + ErrorMsg(node->token_pos(),
|
| "Exception thrown in CodeGenerator::VisitStringConcatNode");
|
| }
|
| ASSERT(!concatenated.IsNull());
|
| @@ -2319,13 +2319,13 @@
|
|
|
| // Could not concatenate at compile time, generate a call to
|
| // interpolation function.
|
| - ArgumentListNode* interpol_arg = new ArgumentListNode(node->token_index());
|
| + ArgumentListNode* interpol_arg = new ArgumentListNode(node->token_pos());
|
| interpol_arg->Add(node->values());
|
| node->values()->Visit(this);
|
| __ LoadObject(ECX, interpol_func);
|
| __ LoadObject(EDX, ArgumentsDescriptor(interpol_arg->length(),
|
| interpol_arg->names()));
|
| - GenerateCall(node->token_index(),
|
| + GenerateCall(node->token_pos(),
|
| &StubCode::CallStaticFunctionLabel(),
|
| PcDescriptors::kFuncCall);
|
| __ addl(ESP, Immediate(interpol_arg->length() * kWordSize));
|
| @@ -2344,10 +2344,10 @@
|
| node->arguments()->Visit(this);
|
| // Some method may be inlined using type feedback, therefore this may be a
|
| // deoptimization point.
|
| - MarkDeoptPoint(node->id(), node->token_index());
|
| + MarkDeoptPoint(node->id(), node->token_pos());
|
| const int kNumArgumentsChecked = 1;
|
| GenerateInstanceCall(node->id(),
|
| - node->token_index(),
|
| + node->token_pos(),
|
| node->function_name(),
|
| number_of_arguments,
|
| node->arguments()->names(),
|
| @@ -2364,7 +2364,7 @@
|
| __ LoadObject(ECX, node->function());
|
| __ LoadObject(EDX, ArgumentsDescriptor(node->arguments()->length(),
|
| node->arguments()->names()));
|
| - GenerateCall(node->token_index(),
|
| + GenerateCall(node->token_pos(),
|
| &StubCode::CallStaticFunctionLabel(),
|
| PcDescriptors::kFuncCall);
|
| __ addl(ESP, Immediate(node->arguments()->length() * kWordSize));
|
| @@ -2391,7 +2391,7 @@
|
| // NOTE: The stub accesses the closure before the parameter list.
|
| __ LoadObject(EDX, ArgumentsDescriptor(node->arguments()->length(),
|
| node->arguments()->names()));
|
| - GenerateCall(node->token_index(),
|
| + GenerateCall(node->token_pos(),
|
| &StubCode::CallClosureFunctionLabel(),
|
| PcDescriptors::kOther);
|
| __ addl(ESP, Immediate((node->arguments()->length() + 1) * kWordSize));
|
| @@ -2407,7 +2407,7 @@
|
| // Pushes either the instantiator or null.
|
| // Pushes the type arguments of the instantiator on the stack.
|
| // Destroys EBX, ECX.
|
| -void CodeGenerator::GenerateInstantiatorTypeArguments(intptr_t token_index,
|
| +void CodeGenerator::GenerateInstantiatorTypeArguments(intptr_t token_pos,
|
| bool push_instantiator) {
|
| if (push_instantiator) {
|
| const Immediate raw_null =
|
| @@ -2421,7 +2421,7 @@
|
| AbstractTypeArguments& type_arguments = AbstractTypeArguments::ZoneHandle();
|
| // TODO(regis): Temporary type should be allocated in new gen heap.
|
| Type& type = Type::Handle(
|
| - Type::New(instantiator_class, type_arguments, token_index));
|
| + Type::New(instantiator_class, type_arguments, token_pos));
|
| type ^= ClassFinalizer::FinalizeType(
|
| instantiator_class, type, ClassFinalizer::kFinalizeWellFormed);
|
| type_arguments = type.arguments();
|
| @@ -2466,7 +2466,7 @@
|
| // arguments are instantiated).
|
| void CodeGenerator::GenerateTypeArguments(
|
| intptr_t node_id,
|
| - intptr_t token_index,
|
| + intptr_t token_pos,
|
| const AbstractTypeArguments& type_arguments,
|
| bool instantiate_type_arguments) {
|
| const Immediate raw_null =
|
| @@ -2482,7 +2482,7 @@
|
| } else {
|
| // The type arguments are uninstantiated.
|
| const bool kPushInstantiator = false;
|
| - GenerateInstantiatorTypeArguments(token_index, kPushInstantiator);
|
| + GenerateInstantiatorTypeArguments(token_pos, kPushInstantiator);
|
| __ popl(EAX); // Pop instantiator.
|
| // EAX is the instantiator AbstractTypeArguments object (or null).
|
| // If the instantiator is null and if the type argument vector
|
| @@ -2514,7 +2514,7 @@
|
| __ PushObject(type_arguments);
|
| __ pushl(EAX); // Push instantiator type arguments.
|
| GenerateCallRuntime(node_id,
|
| - token_index,
|
| + token_pos,
|
| kInstantiateTypeArgumentsRuntimeEntry);
|
| __ popl(EAX); // Pop instantiator type arguments.
|
| __ popl(EAX); // Pop uninstantiated type arguments.
|
| @@ -2541,7 +2541,7 @@
|
| if (node->constructor().IsFactory()) {
|
| const bool instantiate_type_arguments = true; // First argument to factory.
|
| GenerateTypeArguments(node->id(),
|
| - node->token_index(),
|
| + node->token_pos(),
|
| node->type_arguments(),
|
| instantiate_type_arguments);
|
| // The top of stack is an instantiated AbstractTypeArguments object
|
| @@ -2552,7 +2552,7 @@
|
| __ LoadObject(ECX, node->constructor());
|
| __ LoadObject(EDX, ArgumentsDescriptor(num_args,
|
| node->arguments()->names()));
|
| - GenerateCall(node->token_index(),
|
| + GenerateCall(node->token_pos(),
|
| &StubCode::CallStaticFunctionLabel(),
|
| PcDescriptors::kFuncCall);
|
| // Factory constructor returns object in EAX.
|
| @@ -2568,7 +2568,7 @@
|
| const bool instantiate_type_arguments = false; // Done in stub or runtime.
|
| if (requires_type_arguments) {
|
| GenerateTypeArguments(node->id(),
|
| - node->token_index(),
|
| + node->token_pos(),
|
| node->type_arguments(),
|
| instantiate_type_arguments);
|
| }
|
| @@ -2595,12 +2595,12 @@
|
|
|
| // Push the result place holder initialized to NULL.
|
| __ PushObject(Object::ZoneHandle());
|
| - __ pushl(Immediate(Smi::RawValue(node->token_index())));
|
| + __ pushl(Immediate(Smi::RawValue(node->token_pos())));
|
| __ PushObject(cls);
|
| __ pushl(EAX); // Push type arguments.
|
| __ pushl(ECX); // Push instantiator type arguments.
|
| GenerateCallRuntime(node->id(),
|
| - node->token_index(),
|
| + node->token_pos(),
|
| kAllocateObjectWithBoundsCheckRuntimeEntry);
|
| __ popl(ECX); // Pop instantiator type arguments.
|
| __ popl(ECX); // Pop type arguments.
|
| @@ -2610,7 +2610,7 @@
|
| } else {
|
| const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls));
|
| const ExternalLabel label(cls.ToCString(), stub.EntryPoint());
|
| - GenerateCall(node->token_index(), &label, PcDescriptors::kOther);
|
| + GenerateCall(node->token_pos(), &label, PcDescriptors::kOther);
|
| if (requires_type_arguments) {
|
| __ popl(ECX); // Pop instantiator type arguments.
|
| __ popl(ECX); // Pop type arguments.
|
| @@ -2635,7 +2635,7 @@
|
| int num_args = node->arguments()->length() + 2;
|
| __ LoadObject(ECX, node->constructor());
|
| __ LoadObject(EDX, ArgumentsDescriptor(num_args, node->arguments()->names()));
|
| - GenerateCall(node->token_index(),
|
| + GenerateCall(node->token_pos(),
|
| &StubCode::CallStaticFunctionLabel(),
|
| PcDescriptors::kFuncCall);
|
| // Constructors do not return any value.
|
| @@ -2647,7 +2647,7 @@
|
|
|
| // Expects receiver on stack, returns result in EAX..
|
| void CodeGenerator::GenerateInstanceGetterCall(intptr_t node_id,
|
| - intptr_t token_index,
|
| + intptr_t token_pos,
|
| const String& field_name) {
|
| const String& getter_name =
|
| String::ZoneHandle(Field::GetterSymbol(field_name));
|
| @@ -2655,7 +2655,7 @@
|
| const Array& kNoArgumentNames = Array::Handle();
|
| const int kNumArgumentsChecked = 1;
|
| GenerateInstanceCall(node_id,
|
| - token_index,
|
| + token_pos,
|
| getter_name,
|
| kNumberOfArguments,
|
| kNoArgumentNames,
|
| @@ -2666,9 +2666,9 @@
|
| // Call to the instance getter.
|
| void CodeGenerator::VisitInstanceGetterNode(InstanceGetterNode* node) {
|
| node->receiver()->Visit(this);
|
| - MarkDeoptPoint(node->id(), node->token_index());
|
| + MarkDeoptPoint(node->id(), node->token_pos());
|
| GenerateInstanceGetterCall(node->id(),
|
| - node->token_index(),
|
| + node->token_pos(),
|
| node->field_name());
|
| if (IsResultNeeded(node)) {
|
| __ pushl(EAX);
|
| @@ -2678,7 +2678,7 @@
|
|
|
| // Expects receiver and value on stack.
|
| void CodeGenerator::GenerateInstanceSetterCall(intptr_t node_id,
|
| - intptr_t token_index,
|
| + intptr_t token_pos,
|
| const String& field_name) {
|
| const String& setter_name =
|
| String::ZoneHandle(Field::SetterSymbol(field_name));
|
| @@ -2686,7 +2686,7 @@
|
| const Array& kNoArgumentNames = Array::Handle();
|
| const int kNumArgumentsChecked = 1;
|
| GenerateInstanceCall(node_id,
|
| - token_index,
|
| + token_pos,
|
| setter_name,
|
| kNumberOfArguments,
|
| kNoArgumentNames,
|
| @@ -2700,7 +2700,7 @@
|
| // Compute the receiver object and pass it as first argument to call.
|
| node->receiver()->Visit(this);
|
| node->value()->Visit(this);
|
| - MarkDeoptPoint(node->id(), node->token_index());
|
| + MarkDeoptPoint(node->id(), node->token_pos());
|
| if (IsResultNeeded(node)) {
|
| __ popl(EAX); // value.
|
| __ popl(EDX); // receiver.
|
| @@ -2711,13 +2711,13 @@
|
| // It is not necessary to generate a type test of the assigned value here,
|
| // because the setter will check the type of its incoming arguments.
|
| GenerateInstanceSetterCall(node->id(),
|
| - node->token_index(),
|
| + node->token_pos(),
|
| node->field_name());
|
| }
|
|
|
|
|
| // Return result in EAX.
|
| -void CodeGenerator::GenerateStaticGetterCall(intptr_t token_index,
|
| +void CodeGenerator::GenerateStaticGetterCall(intptr_t token_pos,
|
| const Class& field_class,
|
| const String& field_name) {
|
| const String& getter_name = String::Handle(Field::GetterName(field_name));
|
| @@ -2728,7 +2728,7 @@
|
| const int kNumberOfArguments = 0;
|
| const Array& kNoArgumentNames = Array::Handle();
|
| __ LoadObject(EDX, ArgumentsDescriptor(kNumberOfArguments, kNoArgumentNames));
|
| - GenerateCall(token_index,
|
| + GenerateCall(token_pos,
|
| &StubCode::CallStaticFunctionLabel(),
|
| PcDescriptors::kFuncCall);
|
| // No arguments were pushed, hence nothing to pop.
|
| @@ -2737,7 +2737,7 @@
|
|
|
| // Call to static getter.
|
| void CodeGenerator::VisitStaticGetterNode(StaticGetterNode* node) {
|
| - GenerateStaticGetterCall(node->token_index(),
|
| + GenerateStaticGetterCall(node->token_pos(),
|
| node->cls(),
|
| node->field_name());
|
| // Result is in EAX.
|
| @@ -2748,7 +2748,7 @@
|
|
|
|
|
| // Expects value on stack.
|
| -void CodeGenerator::GenerateStaticSetterCall(intptr_t token_index,
|
| +void CodeGenerator::GenerateStaticSetterCall(intptr_t token_pos,
|
| const Class& field_class,
|
| const String& field_name) {
|
| const String& setter_name = String::Handle(Field::SetterName(field_name));
|
| @@ -2759,7 +2759,7 @@
|
| const int kNumberOfArguments = 1; // value.
|
| const Array& kNoArgumentNames = Array::Handle();
|
| __ LoadObject(EDX, ArgumentsDescriptor(kNumberOfArguments, kNoArgumentNames));
|
| - GenerateCall(token_index,
|
| + GenerateCall(token_pos,
|
| &StubCode::CallStaticFunctionLabel(),
|
| PcDescriptors::kFuncCall);
|
| __ addl(ESP, Immediate(kNumberOfArguments * kWordSize));
|
| @@ -2777,7 +2777,7 @@
|
| }
|
| // It is not necessary to generate a type test of the assigned value here,
|
| // because the setter will check the type of its incoming arguments.
|
| - GenerateStaticSetterCall(node->token_index(),
|
| + GenerateStaticSetterCall(node->token_pos(),
|
| node->cls(),
|
| node->field_name());
|
| }
|
| @@ -2800,7 +2800,7 @@
|
| }
|
| __ movl(ECX, Immediate(reinterpret_cast<uword>(node->native_c_function())));
|
| __ movl(EDX, Immediate(argument_count));
|
| - GenerateCall(node->token_index(),
|
| + GenerateCall(node->token_pos(),
|
| &StubCode::CallNativeCFunctionLabel(),
|
| PcDescriptors::kOther);
|
| // Result is on the stack.
|
| @@ -2893,9 +2893,9 @@
|
| // Exception object is on TOS.
|
| if (node->stacktrace() != NULL) {
|
| node->stacktrace()->Visit(this);
|
| - GenerateCallRuntime(node->id(), node->token_index(), kReThrowRuntimeEntry);
|
| + GenerateCallRuntime(node->id(), node->token_pos(), kReThrowRuntimeEntry);
|
| } else {
|
| - GenerateCallRuntime(node->id(), node->token_index(), kThrowRuntimeEntry);
|
| + GenerateCallRuntime(node->id(), node->token_pos(), kThrowRuntimeEntry);
|
| }
|
| // We should never return here.
|
| __ int3();
|
| @@ -2922,48 +2922,48 @@
|
| }
|
|
|
|
|
| -void CodeGenerator::GenerateCall(intptr_t token_index,
|
| +void CodeGenerator::GenerateCall(intptr_t token_pos,
|
| const ExternalLabel* ext_label,
|
| PcDescriptors::Kind desc_kind) {
|
| __ call(ext_label);
|
| - AddCurrentDescriptor(desc_kind, AstNode::kNoId, token_index);
|
| + AddCurrentDescriptor(desc_kind, AstNode::kNoId, token_pos);
|
| }
|
|
|
|
|
| void CodeGenerator::GenerateCallRuntime(intptr_t node_id,
|
| - intptr_t token_index,
|
| + intptr_t token_pos,
|
| const RuntimeEntry& entry) {
|
| __ CallRuntime(entry);
|
| - AddCurrentDescriptor(PcDescriptors::kOther, node_id, token_index);
|
| + AddCurrentDescriptor(PcDescriptors::kOther, node_id, token_pos);
|
| }
|
|
|
|
|
| void CodeGenerator::MarkDeoptPoint(intptr_t node_id,
|
| - intptr_t token_index) {
|
| + intptr_t token_pos) {
|
| ASSERT(node_id != AstNode::kNoId);
|
| - AddCurrentDescriptor(PcDescriptors::kDeopt, node_id, token_index);
|
| + AddCurrentDescriptor(PcDescriptors::kDeopt, node_id, token_pos);
|
| }
|
|
|
|
|
| // Uses current pc position and try-index.
|
| void CodeGenerator::AddCurrentDescriptor(PcDescriptors::Kind kind,
|
| intptr_t node_id,
|
| - intptr_t token_index) {
|
| + intptr_t token_pos) {
|
| pc_descriptors_list_->AddDescriptor(kind,
|
| assembler_->CodeSize(),
|
| node_id,
|
| - token_index,
|
| + token_pos,
|
| state()->try_index());
|
| }
|
|
|
|
|
| -void CodeGenerator::ErrorMsg(intptr_t token_index, const char* format, ...) {
|
| +void CodeGenerator::ErrorMsg(intptr_t token_pos, const char* format, ...) {
|
| va_list args;
|
| va_start(args, format);
|
| const Class& cls = Class::Handle(parsed_function_.function().owner());
|
| const Script& script = Script::Handle(cls.script());
|
| const Error& error = Error::Handle(
|
| - Parser::FormatError(script, token_index, "Error", format, args));
|
| + Parser::FormatError(script, token_pos, "Error", format, args));
|
| va_end(args);
|
| Isolate::Current()->long_jump_base()->Jump(1, error);
|
| UNREACHABLE();
|
|
|