| 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_PARSER_H_ | 5 #ifndef VM_PARSER_H_ |
| 6 #define VM_PARSER_H_ | 6 #define VM_PARSER_H_ |
| 7 | 7 |
| 8 #include "include/dart_api.h" | 8 #include "include/dart_api.h" |
| 9 | 9 |
| 10 #include "platform/assert.h" | 10 #include "platform/assert.h" |
| 11 #include "platform/globals.h" | 11 #include "platform/globals.h" |
| 12 #include "lib/invocation_mirror.h" | 12 #include "lib/invocation_mirror.h" |
| 13 #include "vm/allocation.h" | 13 #include "vm/allocation.h" |
| 14 #include "vm/ast.h" | 14 #include "vm/ast.h" |
| 15 #include "vm/class_finalizer.h" | 15 #include "vm/class_finalizer.h" |
| 16 #include "vm/compiler_stats.h" | 16 #include "vm/compiler_stats.h" |
| 17 #include "vm/hash_table.h" |
| 17 #include "vm/object.h" | 18 #include "vm/object.h" |
| 18 #include "vm/raw_object.h" | 19 #include "vm/raw_object.h" |
| 19 #include "vm/token.h" | 20 #include "vm/token.h" |
| 20 | 21 |
| 21 namespace dart { | 22 namespace dart { |
| 22 | 23 |
| 23 // Forward declarations. | 24 // Forward declarations. |
| 24 class ArgumentsDescriptor; | 25 class ArgumentsDescriptor; |
| 25 class Isolate; | 26 class Isolate; |
| 26 class LocalScope; | 27 class LocalScope; |
| 27 class LocalVariable; | 28 class LocalVariable; |
| 28 struct RegExpCompileData; | 29 struct RegExpCompileData; |
| 29 class SourceLabel; | 30 class SourceLabel; |
| 30 template <typename T> class GrowableArray; | 31 template <typename T> class GrowableArray; |
| 31 class Parser; | 32 class Parser; |
| 32 | 33 |
| 33 struct CatchParamDesc; | 34 struct CatchParamDesc; |
| 34 class ClassDesc; | 35 class ClassDesc; |
| 35 struct MemberDesc; | 36 struct MemberDesc; |
| 36 struct ParamList; | 37 struct ParamList; |
| 37 struct QualIdent; | 38 struct QualIdent; |
| 38 class TopLevel; | 39 class TopLevel; |
| 39 class RecursionChecker; | 40 class RecursionChecker; |
| 40 | 41 |
| 42 // We cache computed compile-time constants in a map so we can look them |
| 43 // up when the same code gets compiled again. The map key is a pair |
| 44 // (script url, token position) which is encoded in an array with 2 |
| 45 // elements: |
| 46 // - key[0] contains the canonicalized url of the script. |
| 47 // - key[1] contains the token position of the constant in the script. |
| 48 |
| 49 // ConstantPosKey allows us to look up a constant in the map without |
| 50 // allocating a key pair (array). |
| 51 struct ConstantPosKey : ValueObject { |
| 52 ConstantPosKey(const String& url, TokenPosition pos) |
| 53 : script_url(url), token_pos(pos) { } |
| 54 const String& script_url; |
| 55 TokenPosition token_pos; |
| 56 }; |
| 57 |
| 58 |
| 59 class ConstMapKeyEqualsTraits { |
| 60 public: |
| 61 static const char* Name() { return "ConstMapKeyEqualsTraits"; } |
| 62 static bool ReportStats() { return false; } |
| 63 |
| 64 static bool IsMatch(const Object& a, const Object& b) { |
| 65 const Array& key1 = Array::Cast(a); |
| 66 const Array& key2 = Array::Cast(b); |
| 67 // Compare raw strings of script url symbol and raw smi of token positon. |
| 68 return (key1.At(0) == key2.At(0)) && (key1.At(1) == key2.At(1)); |
| 69 } |
| 70 static bool IsMatch(const ConstantPosKey& key1, const Object& b) { |
| 71 const Array& key2 = Array::Cast(b); |
| 72 // Compare raw strings of script url symbol and token positon. |
| 73 return (key1.script_url.raw() == key2.At(0)) |
| 74 && (key1.token_pos.value() == Smi::Value(Smi::RawCast(key2.At(1)))); |
| 75 } |
| 76 static uword Hash(const Object& obj) { |
| 77 const Array& key = Array::Cast(obj); |
| 78 intptr_t url_hash = String::HashRawSymbol(String::RawCast(key.At(0))); |
| 79 intptr_t pos = Smi::Value(Smi::RawCast(key.At(1))); |
| 80 return HashValue(url_hash, pos); |
| 81 } |
| 82 static uword Hash(const ConstantPosKey& key) { |
| 83 return HashValue(String::HashRawSymbol(key.script_url.raw()), |
| 84 key.token_pos.value()); |
| 85 } |
| 86 // Used by CachConstantValue if a new constant is added to the map. |
| 87 static RawObject* NewKey(const ConstantPosKey& key) { |
| 88 const Array& key_obj = Array::Handle(Array::New(2)); |
| 89 key_obj.SetAt(0, key.script_url); |
| 90 key_obj.SetAt(1, Smi::Handle(Smi::New(key.token_pos.value()))); |
| 91 return key_obj.raw();; |
| 92 } |
| 93 |
| 94 private: |
| 95 static uword HashValue(intptr_t url_hash, intptr_t pos) { |
| 96 return url_hash * pos % (Smi::kMaxValue - 13); |
| 97 } |
| 98 }; |
| 99 typedef UnorderedHashMap<ConstMapKeyEqualsTraits> ConstantsMap; |
| 100 |
| 41 // The class ParsedFunction holds the result of parsing a function. | 101 // The class ParsedFunction holds the result of parsing a function. |
| 42 class ParsedFunction : public ZoneAllocated { | 102 class ParsedFunction : public ZoneAllocated { |
| 43 public: | 103 public: |
| 44 ParsedFunction(Thread* thread, const Function& function) | 104 ParsedFunction(Thread* thread, const Function& function) |
| 45 : thread_(thread), | 105 : thread_(thread), |
| 46 function_(function), | 106 function_(function), |
| 47 code_(Code::Handle(zone(), function.unoptimized_code())), | 107 code_(Code::Handle(zone(), function.unoptimized_code())), |
| 48 node_sequence_(NULL), | 108 node_sequence_(NULL), |
| 49 regexp_compile_data_(NULL), | 109 regexp_compile_data_(NULL), |
| 50 instantiator_(NULL), | 110 instantiator_(NULL), |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 | 269 |
| 210 // Parse and evaluate the metadata expressions at token_pos in the | 270 // Parse and evaluate the metadata expressions at token_pos in the |
| 211 // class namespace of class cls (which can be the implicit toplevel | 271 // class namespace of class cls (which can be the implicit toplevel |
| 212 // class if the metadata is at the top-level). | 272 // class if the metadata is at the top-level). |
| 213 static RawObject* ParseMetadata(const Field& meta_data); | 273 static RawObject* ParseMetadata(const Field& meta_data); |
| 214 | 274 |
| 215 // Build a function containing the initializer expression of the | 275 // Build a function containing the initializer expression of the |
| 216 // given static field. | 276 // given static field. |
| 217 static ParsedFunction* ParseStaticFieldInitializer(const Field& field); | 277 static ParsedFunction* ParseStaticFieldInitializer(const Field& field); |
| 218 | 278 |
| 279 static void InsertCachedConstantValue(const String& url, |
| 280 TokenPosition token_pos, |
| 281 const Instance& value); |
| 282 |
| 219 // Parse a function to retrieve parameter information that is not retained in | 283 // Parse a function to retrieve parameter information that is not retained in |
| 220 // the dart::Function object. Returns either an error if the parse fails | 284 // the dart::Function object. Returns either an error if the parse fails |
| 221 // (which could be the case for local functions), or a flat array of entries | 285 // (which could be the case for local functions), or a flat array of entries |
| 222 // for each parameter. Each parameter entry contains: | 286 // for each parameter. Each parameter entry contains: |
| 223 // * a Dart bool indicating whether the parameter was declared final | 287 // * a Dart bool indicating whether the parameter was declared final |
| 224 // * its default value (or null if none was declared) | 288 // * its default value (or null if none was declared) |
| 225 // * an array of metadata (or null if no metadata was declared). | 289 // * an array of metadata (or null if no metadata was declared). |
| 226 enum { | 290 enum { |
| 227 kParameterIsFinalOffset, | 291 kParameterIsFinalOffset, |
| 228 kParameterDefaultValueOffset, | 292 kParameterDefaultValueOffset, |
| (...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 915 | 979 |
| 916 intptr_t recursion_counter_; | 980 intptr_t recursion_counter_; |
| 917 friend class RecursionChecker; | 981 friend class RecursionChecker; |
| 918 | 982 |
| 919 DISALLOW_COPY_AND_ASSIGN(Parser); | 983 DISALLOW_COPY_AND_ASSIGN(Parser); |
| 920 }; | 984 }; |
| 921 | 985 |
| 922 } // namespace dart | 986 } // namespace dart |
| 923 | 987 |
| 924 #endif // VM_PARSER_H_ | 988 #endif // VM_PARSER_H_ |
| OLD | NEW |