| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 #include "platform/assert.h" | 5 #include "platform/assert.h" |
| 6 | 6 |
| 7 #include "vm/assembler.h" | 7 #include "vm/assembler.h" |
| 8 #include "vm/bootstrap_natives.h" | 8 #include "vm/bootstrap_natives.h" |
| 9 #include "vm/exceptions.h" | 9 #include "vm/exceptions.h" |
| 10 #include "vm/flags.h" | 10 #include "vm/flags.h" |
| 11 #include "vm/native_entry.h" | 11 #include "vm/native_entry.h" |
| 12 #include "vm/object.h" | 12 #include "vm/object.h" |
| 13 | 13 |
| 14 namespace dart { | 14 namespace dart { |
| 15 | 15 |
| 16 DEFINE_FLAG(bool, use_internal_hash_map, false, "Use internal hash map."); | |
| 17 | |
| 18 | |
| 19 DEFINE_NATIVE_ENTRY(LinkedHashMap_allocate, 1) { | 16 DEFINE_NATIVE_ENTRY(LinkedHashMap_allocate, 1) { |
| 20 const TypeArguments& type_arguments = | 17 const TypeArguments& type_arguments = |
| 21 TypeArguments::CheckedHandle(arguments->NativeArgAt(0)); | 18 TypeArguments::CheckedHandle(arguments->NativeArgAt(0)); |
| 22 const LinkedHashMap& map = | 19 const LinkedHashMap& map = |
| 23 LinkedHashMap::Handle(LinkedHashMap::New()); | 20 LinkedHashMap::Handle(LinkedHashMap::NewDefault()); |
| 24 map.SetTypeArguments(type_arguments); | 21 map.SetTypeArguments(type_arguments); |
| 25 return map.raw(); | 22 return map.raw(); |
| 26 } | 23 } |
| 27 | 24 |
| 28 | 25 |
| 29 DEFINE_NATIVE_ENTRY(LinkedHashMap_getLength, 1) { | 26 DEFINE_NATIVE_ENTRY(LinkedHashMap_getIndex, 1) { |
| 30 const LinkedHashMap& map = | 27 const LinkedHashMap& map = |
| 31 LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0)); | 28 LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0)); |
| 32 return Smi::New(map.Length()); | 29 return map.index(); |
| 33 } | 30 } |
| 34 | 31 |
| 35 | 32 |
| 36 DEFINE_NATIVE_ENTRY(LinkedHashMap_lookUp, 2) { | 33 DEFINE_NATIVE_ENTRY(LinkedHashMap_setIndex, 2) { |
| 37 const LinkedHashMap& map = | 34 const LinkedHashMap& map = |
| 38 LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0)); | 35 LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0)); |
| 39 GET_NON_NULL_NATIVE_ARGUMENT(Instance, key, arguments->NativeArgAt(1)); | 36 const TypedData& index = |
| 40 return map.LookUp(key); | 37 TypedData::CheckedHandle(arguments->NativeArgAt(1)); |
| 41 } | 38 map.SetIndex(index); |
| 42 | |
| 43 | |
| 44 DEFINE_NATIVE_ENTRY(LinkedHashMap_containsKey, 2) { | |
| 45 const LinkedHashMap& map = | |
| 46 LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0)); | |
| 47 GET_NON_NULL_NATIVE_ARGUMENT(Instance, key, arguments->NativeArgAt(1)); | |
| 48 return Bool::Get(map.Contains(key)).raw(); | |
| 49 } | |
| 50 | |
| 51 | |
| 52 DEFINE_NATIVE_ENTRY(LinkedHashMap_insertOrUpdate, 3) { | |
| 53 LinkedHashMap& map = | |
| 54 LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0)); | |
| 55 GET_NON_NULL_NATIVE_ARGUMENT(Instance, key, arguments->NativeArgAt(1)); | |
| 56 GET_NON_NULL_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(2)); | |
| 57 map.InsertOrUpdate(key, value); | |
| 58 return Object::null(); | 39 return Object::null(); |
| 59 } | 40 } |
| 60 | 41 |
| 61 | 42 |
| 62 DEFINE_NATIVE_ENTRY(LinkedHashMap_remove, 2) { | 43 DEFINE_NATIVE_ENTRY(LinkedHashMap_getData, 1) { |
| 63 const LinkedHashMap& map = | 44 const LinkedHashMap& map = |
| 64 LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0)); | 45 LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0)); |
| 65 GET_NON_NULL_NATIVE_ARGUMENT(Instance, key, arguments->NativeArgAt(1)); | 46 return map.data(); |
| 66 return map.Remove(key); | |
| 67 } | 47 } |
| 68 | 48 |
| 69 | 49 |
| 70 DEFINE_NATIVE_ENTRY(LinkedHashMap_clear, 1) { | 50 DEFINE_NATIVE_ENTRY(LinkedHashMap_setData, 2) { |
| 71 const LinkedHashMap& map = | 51 const LinkedHashMap& map = |
| 72 LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0)); | 52 LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0)); |
| 73 map.Clear(); | 53 const Array& data = |
| 54 Array::CheckedHandle(arguments->NativeArgAt(1)); |
| 55 map.SetData(data); |
| 74 return Object::null(); | 56 return Object::null(); |
| 75 } | 57 } |
| 76 | 58 |
| 77 | 59 |
| 78 DEFINE_NATIVE_ENTRY(LinkedHashMap_toArray, 1) { | 60 DEFINE_NATIVE_ENTRY(LinkedHashMap_getHashMask, 1) { |
| 79 const LinkedHashMap& map = | 61 const LinkedHashMap& map = |
| 80 LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0)); | 62 LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0)); |
| 81 return map.ToArray(); | 63 return map.hash_mask(); |
| 82 } | 64 } |
| 83 | 65 |
| 84 | 66 |
| 85 DEFINE_NATIVE_ENTRY(LinkedHashMap_getModMark, 2) { | 67 DEFINE_NATIVE_ENTRY(LinkedHashMap_setHashMask, 2) { |
| 86 const LinkedHashMap& map = | 68 const LinkedHashMap& map = |
| 87 LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0)); | 69 LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0)); |
| 88 GET_NON_NULL_NATIVE_ARGUMENT(Bool, create, arguments->NativeArgAt(1)); | 70 const Smi& hashMask = |
| 89 return map.GetModificationMark(create.value()); | 71 Smi::CheckedHandle(arguments->NativeArgAt(1)); |
| 72 map.SetHashMask(hashMask.Value()); |
| 73 return Object::null(); |
| 90 } | 74 } |
| 91 | 75 |
| 92 | 76 |
| 93 DEFINE_NATIVE_ENTRY(LinkedHashMap_useInternal, 0) { | 77 DEFINE_NATIVE_ENTRY(LinkedHashMap_getDeletedKeys, 1) { |
| 94 return Bool::Get(FLAG_use_internal_hash_map).raw(); | 78 const LinkedHashMap& map = |
| 79 LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0)); |
| 80 return map.deleted_keys(); |
| 81 } |
| 82 |
| 83 |
| 84 DEFINE_NATIVE_ENTRY(LinkedHashMap_setDeletedKeys, 2) { |
| 85 const LinkedHashMap& map = |
| 86 LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0)); |
| 87 const Smi& deletedKeys = |
| 88 Smi::CheckedHandle(arguments->NativeArgAt(1)); |
| 89 map.SetDeletedKeys(deletedKeys.Value()); |
| 90 return Object::null(); |
| 91 } |
| 92 |
| 93 |
| 94 DEFINE_NATIVE_ENTRY(LinkedHashMap_getUsedData, 1) { |
| 95 const LinkedHashMap& map = |
| 96 LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0)); |
| 97 return map.used_data(); |
| 98 } |
| 99 |
| 100 |
| 101 DEFINE_NATIVE_ENTRY(LinkedHashMap_setUsedData, 2) { |
| 102 const LinkedHashMap& map = |
| 103 LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0)); |
| 104 const Smi& usedData = |
| 105 Smi::CheckedHandle(arguments->NativeArgAt(1)); |
| 106 map.SetUsedData(usedData.Value()); |
| 107 return Object::null(); |
| 95 } | 108 } |
| 96 | 109 |
| 97 } // namespace dart | 110 } // namespace dart |
| OLD | NEW |