JavascriptMapIterator.cpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. bool JavascriptMapIterator::Is(Var aValue)
  17. {
  18. TypeId typeId = JavascriptOperators::GetTypeId(aValue);
  19. return typeId == TypeIds_MapIterator;
  20. }
  21. JavascriptMapIterator* JavascriptMapIterator::FromVar(Var aValue)
  22. {
  23. AssertMsg(Is(aValue), "Ensure var is actually a 'JavascriptMapIterator'");
  24. return static_cast<JavascriptMapIterator *>(RecyclableObject::FromVar(aValue));
  25. }
  26. Var JavascriptMapIterator::EntryNext(RecyclableObject* function, CallInfo callInfo, ...)
  27. {
  28. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault);
  29. ARGUMENTS(args, callInfo);
  30. ScriptContext* scriptContext = function->GetScriptContext();
  31. JavascriptLibrary* library = scriptContext->GetLibrary();
  32. Assert(!(callInfo.Flags & CallFlags_New));
  33. Var thisObj = args[0];
  34. if (!JavascriptMapIterator::Is(thisObj))
  35. {
  36. JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedMapIterator, _u("Map Iterator.prototype.next"));
  37. }
  38. JavascriptMapIterator* iterator = JavascriptMapIterator::FromVar(thisObj);
  39. JavascriptMap* map = iterator->m_map;
  40. auto& mapIterator = iterator->m_mapIterator;
  41. if (map == nullptr || !mapIterator.Next())
  42. {
  43. iterator->m_map = nullptr;
  44. return library->CreateIteratorResultObjectUndefinedTrue();
  45. }
  46. auto entry = mapIterator.Current();
  47. Var result;
  48. if (iterator->m_kind == JavascriptMapIteratorKind::KeyAndValue)
  49. {
  50. JavascriptArray* keyValueTuple = library->CreateArray(2);
  51. keyValueTuple->SetItem(0, entry.Key(), PropertyOperation_None);
  52. keyValueTuple->SetItem(1, entry.Value(), PropertyOperation_None);
  53. result = keyValueTuple;
  54. }
  55. else if (iterator->m_kind == JavascriptMapIteratorKind::Key)
  56. {
  57. result = entry.Key();
  58. }
  59. else
  60. {
  61. Assert(iterator->m_kind == JavascriptMapIteratorKind::Value);
  62. result = entry.Value();
  63. }
  64. return library->CreateIteratorResultObjectValueFalse(result);
  65. }
  66. } //namespace Js