summaryrefslogtreecommitdiffstats
path: root/js/src/vm
diff options
context:
space:
mode:
authorjanekptacijarabaci <janekptacijarabaci@seznam.cz>2018-03-24 12:09:30 +0100
committerjanekptacijarabaci <janekptacijarabaci@seznam.cz>2018-03-24 12:09:30 +0100
commit7d753c1a8f22f85f6279a3c016034ce8f8e740f7 (patch)
tree7d3dba690a5689a04d4f2c2b544accaf8621634a /js/src/vm
parent2a57d73c3b5304be3f9be51018a1bbee79f007e2 (diff)
downloadUXP-7d753c1a8f22f85f6279a3c016034ce8f8e740f7.tar
UXP-7d753c1a8f22f85f6279a3c016034ce8f8e740f7.tar.gz
UXP-7d753c1a8f22f85f6279a3c016034ce8f8e740f7.tar.lz
UXP-7d753c1a8f22f85f6279a3c016034ce8f8e740f7.tar.xz
UXP-7d753c1a8f22f85f6279a3c016034ce8f8e740f7.zip
Bug 1147371: Implement IteratorClose for for-of
Issue #74
Diffstat (limited to 'js/src/vm')
-rw-r--r--js/src/vm/Interpreter.cpp19
-rw-r--r--js/src/vm/Interpreter.h1
2 files changed, 16 insertions, 4 deletions
diff --git a/js/src/vm/Interpreter.cpp b/js/src/vm/Interpreter.cpp
index 8ae9c43b0..489d0a155 100644
--- a/js/src/vm/Interpreter.cpp
+++ b/js/src/vm/Interpreter.cpp
@@ -1171,13 +1171,19 @@ ProcessTryNotes(JSContext* cx, EnvironmentIter& ei, InterpreterRegs& regs)
SettleOnTryNote(cx, tn, ei, regs);
return FinallyContinuation;
- case JSTRY_FOR_IN: {
+ case JSTRY_FOR_IN:
+ case JSTRY_ITERCLOSE: {
/* This is similar to JSOP_ENDITER in the interpreter loop. */
DebugOnly<jsbytecode*> pc = regs.fp()->script()->main() + tn->start + tn->length;
- MOZ_ASSERT(JSOp(*pc) == JSOP_ENDITER);
+ MOZ_ASSERT_IF(tn->kind == JSTRY_FOR_IN, JSOp(*pc) == JSOP_ENDITER);
Value* sp = regs.spForStackDepth(tn->stackDepth);
RootedObject obj(cx, &sp[-1].toObject());
- if (!UnwindIteratorForException(cx, obj)) {
+ bool ok;
+ if (tn->kind == JSTRY_FOR_IN)
+ ok = UnwindIteratorForException(cx, obj);
+ else
+ ok = IteratorCloseForException(cx, obj);
+ if (!ok) {
// We should only settle on the note only if
// UnwindIteratorForException itself threw, as
// onExceptionUnwind should be called anew with the new
@@ -5040,7 +5046,12 @@ js::ThrowCheckIsObject(JSContext* cx, CheckIsObjectKind kind)
{
switch (kind) {
case CheckIsObjectKind::IteratorNext:
- JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_NEXT_RETURNED_PRIMITIVE);
+ JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
+ JSMSG_ITER_METHOD_RETURNED_PRIMITIVE, "next");
+ break;
+ case CheckIsObjectKind::IteratorReturn:
+ JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
+ JSMSG_ITER_METHOD_RETURNED_PRIMITIVE, "return");
break;
case CheckIsObjectKind::GetIterator:
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_GET_ITER_RETURNED_PRIMITIVE);
diff --git a/js/src/vm/Interpreter.h b/js/src/vm/Interpreter.h
index 1ffe1fdca..3a24240fc 100644
--- a/js/src/vm/Interpreter.h
+++ b/js/src/vm/Interpreter.h
@@ -562,6 +562,7 @@ ReportRuntimeRedeclaration(JSContext* cx, HandlePropertyName name, const char* r
enum class CheckIsObjectKind : uint8_t {
IteratorNext,
+ IteratorReturn,
GetIterator
};