OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_ | 5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_ |
6 #define VM_INTERMEDIATE_LANGUAGE_H_ | 6 #define VM_INTERMEDIATE_LANGUAGE_H_ |
7 | 7 |
8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
9 #include "vm/ast.h" | 9 #include "vm/ast.h" |
10 #include "vm/growable_array.h" | 10 #include "vm/growable_array.h" |
(...skipping 1589 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1600 | 1600 |
1601 static RangeBoundary OverflowedMaxSmi() { | 1601 static RangeBoundary OverflowedMaxSmi() { |
1602 return FromConstant(Smi::kMaxValue + 1); | 1602 return FromConstant(Smi::kMaxValue + 1); |
1603 } | 1603 } |
1604 | 1604 |
1605 static RangeBoundary Min(RangeBoundary a, RangeBoundary b); | 1605 static RangeBoundary Min(RangeBoundary a, RangeBoundary b); |
1606 | 1606 |
1607 static RangeBoundary Max(RangeBoundary a, RangeBoundary b); | 1607 static RangeBoundary Max(RangeBoundary a, RangeBoundary b); |
1608 | 1608 |
1609 bool Overflowed() const { | 1609 bool Overflowed() const { |
1610 return !Smi::IsValid(value()); | 1610 return IsConstant() && !Smi::IsValid(value()); |
1611 } | 1611 } |
1612 | 1612 |
1613 RangeBoundary Clamp() const { | 1613 RangeBoundary Clamp() const { |
1614 if (IsConstant()) { | 1614 if (IsConstant()) { |
1615 if (value() < Smi::kMinValue) return MinSmi(); | 1615 if (value() < Smi::kMinValue) return MinSmi(); |
1616 if (value() > Smi::kMaxValue) return MaxSmi(); | 1616 if (value() > Smi::kMaxValue) return MaxSmi(); |
1617 } | 1617 } |
1618 return *this; | 1618 return *this; |
1619 } | 1619 } |
1620 | 1620 |
(...skipping 739 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2360 class StaticCallInstr : public TemplateDefinition<0> { | 2360 class StaticCallInstr : public TemplateDefinition<0> { |
2361 public: | 2361 public: |
2362 StaticCallInstr(intptr_t token_pos, | 2362 StaticCallInstr(intptr_t token_pos, |
2363 const Function& function, | 2363 const Function& function, |
2364 const Array& argument_names, | 2364 const Array& argument_names, |
2365 ZoneGrowableArray<PushArgumentInstr*>* arguments) | 2365 ZoneGrowableArray<PushArgumentInstr*>* arguments) |
2366 : token_pos_(token_pos), | 2366 : token_pos_(token_pos), |
2367 function_(function), | 2367 function_(function), |
2368 argument_names_(argument_names), | 2368 argument_names_(argument_names), |
2369 arguments_(arguments), | 2369 arguments_(arguments), |
2370 result_cid_(kDynamicCid) { | 2370 result_cid_(kDynamicCid), |
| 2371 is_known_constructor_(false) { |
2371 ASSERT(function.IsZoneHandle()); | 2372 ASSERT(function.IsZoneHandle()); |
2372 ASSERT(argument_names.IsZoneHandle()); | 2373 ASSERT(argument_names.IsZoneHandle()); |
2373 } | 2374 } |
2374 | 2375 |
2375 DECLARE_INSTRUCTION(StaticCall) | 2376 DECLARE_INSTRUCTION(StaticCall) |
2376 virtual RawAbstractType* CompileType() const; | 2377 virtual RawAbstractType* CompileType() const; |
2377 | 2378 |
2378 // Accessors forwarded to the AST node. | 2379 // Accessors forwarded to the AST node. |
2379 const Function& function() const { return function_; } | 2380 const Function& function() const { return function_; } |
2380 const Array& argument_names() const { return argument_names_; } | 2381 const Array& argument_names() const { return argument_names_; } |
2381 intptr_t token_pos() const { return token_pos_; } | 2382 intptr_t token_pos() const { return token_pos_; } |
2382 | 2383 |
2383 virtual intptr_t ArgumentCount() const { return arguments_->length(); } | 2384 virtual intptr_t ArgumentCount() const { return arguments_->length(); } |
2384 PushArgumentInstr* ArgumentAt(intptr_t index) const { | 2385 PushArgumentInstr* ArgumentAt(intptr_t index) const { |
2385 return (*arguments_)[index]; | 2386 return (*arguments_)[index]; |
2386 } | 2387 } |
2387 | 2388 |
2388 virtual void PrintOperandsTo(BufferFormatter* f) const; | 2389 virtual void PrintOperandsTo(BufferFormatter* f) const; |
2389 | 2390 |
2390 virtual bool CanDeoptimize() const { return true; } | 2391 virtual bool CanDeoptimize() const { return true; } |
2391 | 2392 |
2392 virtual bool HasSideEffect() const { return true; } | 2393 virtual bool HasSideEffect() const { return true; } |
2393 | 2394 |
2394 virtual intptr_t ResultCid() const { return result_cid_; } | 2395 virtual intptr_t ResultCid() const { return result_cid_; } |
2395 void set_result_cid(intptr_t value) { result_cid_ = value; } | 2396 void set_result_cid(intptr_t value) { result_cid_ = value; } |
2396 | 2397 |
| 2398 bool is_known_constructor() const { return is_known_constructor_; } |
| 2399 void set_is_known_constructor(bool is_known_constructor) { |
| 2400 is_known_constructor_ = is_known_constructor; |
| 2401 } |
| 2402 |
2397 private: | 2403 private: |
2398 const intptr_t token_pos_; | 2404 const intptr_t token_pos_; |
2399 const Function& function_; | 2405 const Function& function_; |
2400 const Array& argument_names_; | 2406 const Array& argument_names_; |
2401 ZoneGrowableArray<PushArgumentInstr*>* arguments_; | 2407 ZoneGrowableArray<PushArgumentInstr*>* arguments_; |
2402 intptr_t result_cid_; // For some library functions we know the result. | 2408 intptr_t result_cid_; // For some library functions we know the result. |
2403 | 2409 |
| 2410 // Some library constructors have known semantics. |
| 2411 bool is_known_constructor_; |
| 2412 |
| 2413 |
2404 DISALLOW_COPY_AND_ASSIGN(StaticCallInstr); | 2414 DISALLOW_COPY_AND_ASSIGN(StaticCallInstr); |
2405 }; | 2415 }; |
2406 | 2416 |
2407 | 2417 |
2408 class LoadLocalInstr : public TemplateDefinition<0> { | 2418 class LoadLocalInstr : public TemplateDefinition<0> { |
2409 public: | 2419 public: |
2410 LoadLocalInstr(const LocalVariable& local, intptr_t context_level) | 2420 LoadLocalInstr(const LocalVariable& local, intptr_t context_level) |
2411 : local_(local), | 2421 : local_(local), |
2412 context_level_(context_level) { } | 2422 context_level_(context_level) { } |
2413 | 2423 |
(...skipping 1535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3949 | 3959 |
3950 virtual bool AttributesEqual(Instruction* other) const; | 3960 virtual bool AttributesEqual(Instruction* other) const; |
3951 | 3961 |
3952 virtual bool AffectedBySideEffect() const { return false; } | 3962 virtual bool AffectedBySideEffect() const { return false; } |
3953 | 3963 |
3954 Value* array() const { return inputs_[0]; } | 3964 Value* array() const { return inputs_[0]; } |
3955 Value* index() const { return inputs_[1]; } | 3965 Value* index() const { return inputs_[1]; } |
3956 | 3966 |
3957 intptr_t array_type() const { return array_type_; } | 3967 intptr_t array_type() const { return array_type_; } |
3958 | 3968 |
3959 bool IsRedundant(); | 3969 bool IsRedundant(RangeBoundary length); |
3960 | 3970 |
3961 private: | 3971 private: |
3962 intptr_t array_type_; | 3972 intptr_t array_type_; |
3963 | 3973 |
3964 DISALLOW_COPY_AND_ASSIGN(CheckArrayBoundInstr); | 3974 DISALLOW_COPY_AND_ASSIGN(CheckArrayBoundInstr); |
3965 }; | 3975 }; |
3966 | 3976 |
3967 | 3977 |
3968 #undef DECLARE_INSTRUCTION | 3978 #undef DECLARE_INSTRUCTION |
3969 | 3979 |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4172 ForwardInstructionIterator* current_iterator_; | 4182 ForwardInstructionIterator* current_iterator_; |
4173 | 4183 |
4174 private: | 4184 private: |
4175 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); | 4185 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); |
4176 }; | 4186 }; |
4177 | 4187 |
4178 | 4188 |
4179 } // namespace dart | 4189 } // namespace dart |
4180 | 4190 |
4181 #endif // VM_INTERMEDIATE_LANGUAGE_H_ | 4191 #endif // VM_INTERMEDIATE_LANGUAGE_H_ |
OLD | NEW |