JavascriptMapIterator.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #include "RuntimeLibraryPch.h"
  6. namespace Js
  7. {
  8. JavascriptMapIterator::JavascriptMapIterator(DynamicType* type, JavascriptMap* map, JavascriptMapIteratorKind kind):
  9. DynamicObject(type),
  10. m_map(map),
  11. m_mapIterator(map->GetIterator()),
  12. m_kind(kind)
  13. {
  14. Assert(type->GetTypeId() == TypeIds_MapIterator);
  15. }
  16. Var JavascriptMapIterator::EntryNext(RecyclableObject* function, CallInfo callInfo, ...)
  17. {
  18. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  19. ARGUMENTS(args, callInfo);
  20. ScriptContext* scriptContext = function->GetScriptContext();
  21. JavascriptLibrary* library = scriptContext->GetLibrary();
  22. Assert(!(callInfo.Flags & CallFlags_New));
  23. Var thisObj = args[0];
  24. if (!VarIs<JavascriptMapIterator>(thisObj))
  25. {
  26. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedMapIterator, _u("Map Iterator.prototype.next"));
  27. }
  28. JavascriptMapIterator* iterator = VarTo<JavascriptMapIterator>(thisObj);
  29. JavascriptMap* map = iterator->m_map;
  30. auto& mapIterator = iterator->m_mapIterator;
  31. if (map == nullptr || !mapIterator.Next())
  32. {
  33. iterator->m_map = nullptr;
  34. return library->CreateIteratorResultObjectDone();
  35. }
  36. auto entry = mapIterator.Current();
  37. Var result;
  38. if (iterator->m_kind == JavascriptMapIteratorKind::KeyAndValue)
  39. {
  40. JavascriptArray* keyValueTuple = library->CreateArray(2);
  41. keyValueTuple->SetItem(0, entry.Key(), PropertyOperation_None);
  42. keyValueTuple->SetItem(1, entry.Value(), PropertyOperation_None);
  43. result = keyValueTuple;
  44. }
  45. else if (iterator->m_kind == JavascriptMapIteratorKind::Key)
  46. {
  47. result = entry.Key();
  48. }
  49. else
  50. {
  51. Assert(iterator->m_kind == JavascriptMapIteratorKind::Value);
  52. result = entry.Value();
  53. }
  54. return library->CreateIteratorResultObject(result);
  55. }
  56. } //namespace Js