| 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 #if !defined(DART_PRECOMPILED_RUNTIME) | 5 #if !defined(DART_PRECOMPILED_RUNTIME) | 
| 6 | 6 | 
| 7 #include "vm/flow_graph_builder.h" | 7 #include "vm/flow_graph_builder.h" | 
| 8 | 8 | 
| 9 #include "lib/invocation_mirror.h" | 9 #include "lib/invocation_mirror.h" | 
| 10 #include "vm/ast_printer.h" | 10 #include "vm/ast_printer.h" | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 39             true, | 39             true, | 
| 40             "Eliminate type checks when allowed by static type analysis."); | 40             "Eliminate type checks when allowed by static type analysis."); | 
| 41 DEFINE_FLAG(bool, print_ast, false, "Print abstract syntax tree."); | 41 DEFINE_FLAG(bool, print_ast, false, "Print abstract syntax tree."); | 
| 42 DEFINE_FLAG(bool, print_scopes, false, "Print scopes of local variables."); | 42 DEFINE_FLAG(bool, print_scopes, false, "Print scopes of local variables."); | 
| 43 DEFINE_FLAG(bool, | 43 DEFINE_FLAG(bool, | 
| 44             trace_type_check_elimination, | 44             trace_type_check_elimination, | 
| 45             false, | 45             false, | 
| 46             "Trace type check elimination at compile time."); | 46             "Trace type check elimination at compile time."); | 
| 47 | 47 | 
| 48 DECLARE_FLAG(bool, profile_vm); | 48 DECLARE_FLAG(bool, profile_vm); | 
| 49 DECLARE_FLAG(bool, support_externalizable_strings); |  | 
| 50 | 49 | 
| 51 // Quick access to the locally defined zone() method. | 50 // Quick access to the locally defined zone() method. | 
| 52 #define Z (zone()) | 51 #define Z (zone()) | 
| 53 | 52 | 
| 54 // Quick access to the locally defined thread() method. | 53 // Quick access to the locally defined thread() method. | 
| 55 #define T (thread()) | 54 #define T (thread()) | 
| 56 | 55 | 
| 57 // Quick synthetic token position. | 56 // Quick synthetic token position. | 
| 58 #define ST(token_pos) ((token_pos).ToSynthetic()) | 57 #define ST(token_pos) ((token_pos).ToSynthetic()) | 
| 59 | 58 | 
| (...skipping 3111 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3171         Value* other = Bind(new (Z) LoadLocalInstr(*other_var, token_pos)); | 3170         Value* other = Bind(new (Z) LoadLocalInstr(*other_var, token_pos)); | 
| 3172         // Receiver is not a number because numbers override equality. | 3171         // Receiver is not a number because numbers override equality. | 
| 3173         const bool kNoNumberCheck = false; | 3172         const bool kNoNumberCheck = false; | 
| 3174         StrictCompareInstr* compare = new (Z) | 3173         StrictCompareInstr* compare = new (Z) | 
| 3175             StrictCompareInstr(token_pos, Token::kEQ_STRICT, receiver, other, | 3174             StrictCompareInstr(token_pos, Token::kEQ_STRICT, receiver, other, | 
| 3176                                kNoNumberCheck, owner()->GetNextDeoptId()); | 3175                                kNoNumberCheck, owner()->GetNextDeoptId()); | 
| 3177         return ReturnDefinition(compare); | 3176         return ReturnDefinition(compare); | 
| 3178       } | 3177       } | 
| 3179       case MethodRecognizer::kStringBaseLength: | 3178       case MethodRecognizer::kStringBaseLength: | 
| 3180       case MethodRecognizer::kStringBaseIsEmpty: { | 3179       case MethodRecognizer::kStringBaseIsEmpty: { | 
| 3181         // Treat length loads as mutable (i.e. affected by side effects) to |  | 
| 3182         // avoid hoisting them since we can't hoist the preceding class-check. |  | 
| 3183         // This is because of externalization of strings that affects their |  | 
| 3184         // class-id. |  | 
| 3185         LoadFieldInstr* load = BuildNativeGetter( | 3180         LoadFieldInstr* load = BuildNativeGetter( | 
| 3186             node, MethodRecognizer::kStringBaseLength, String::length_offset(), | 3181             node, MethodRecognizer::kStringBaseLength, String::length_offset(), | 
| 3187             Type::ZoneHandle(Z, Type::SmiType()), kSmiCid); | 3182             Type::ZoneHandle(Z, Type::SmiType()), kSmiCid); | 
| 3188         load->set_is_immutable(!FLAG_support_externalizable_strings); | 3183         load->set_is_immutable(true); | 
| 3189         if (kind == MethodRecognizer::kStringBaseLength) { | 3184         if (kind == MethodRecognizer::kStringBaseLength) { | 
| 3190           return ReturnDefinition(load); | 3185           return ReturnDefinition(load); | 
| 3191         } | 3186         } | 
| 3192         ASSERT(kind == MethodRecognizer::kStringBaseIsEmpty); | 3187         ASSERT(kind == MethodRecognizer::kStringBaseIsEmpty); | 
| 3193         Value* zero_val = | 3188         Value* zero_val = | 
| 3194             Bind(new (Z) ConstantInstr(Smi::ZoneHandle(Z, Smi::New(0)))); | 3189             Bind(new (Z) ConstantInstr(Smi::ZoneHandle(Z, Smi::New(0)))); | 
| 3195         Value* load_val = Bind(load); | 3190         Value* load_val = Bind(load); | 
| 3196         StrictCompareInstr* compare = new (Z) StrictCompareInstr( | 3191         StrictCompareInstr* compare = new (Z) StrictCompareInstr( | 
| 3197             token_pos, Token::kEQ_STRICT, load_val, zero_val, false, | 3192             token_pos, Token::kEQ_STRICT, load_val, zero_val, false, | 
| 3198             owner()->GetNextDeoptId());  // No number check. | 3193             owner()->GetNextDeoptId());  // No number check. | 
| (...skipping 1218 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4417   // Bail if the type has any type parameters. | 4412   // Bail if the type has any type parameters. | 
| 4418   if (type_class.IsGeneric()) return false; | 4413   if (type_class.IsGeneric()) return false; | 
| 4419 | 4414 | 
| 4420   // Finally a simple class for instance of checking. | 4415   // Finally a simple class for instance of checking. | 
| 4421   return true; | 4416   return true; | 
| 4422 } | 4417 } | 
| 4423 | 4418 | 
| 4424 }  // namespace dart | 4419 }  // namespace dart | 
| 4425 | 4420 | 
| 4426 #endif  // !defined(DART_PRECOMPILED_RUNTIME) | 4421 #endif  // !defined(DART_PRECOMPILED_RUNTIME) | 
| OLD | NEW | 
|---|