Unreviewed, rolling out r199712.
authorgskachkov@gmail.com <gskachkov@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 19 Apr 2016 13:29:54 +0000 (13:29 +0000)
committergskachkov@gmail.com <gskachkov@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 19 Apr 2016 13:29:54 +0000 (13:29 +0000)
https://bugs.webkit.org/show_bug.cgi?id=156741

It caused a serious regression on 32 bit platform (Requested
by gskachkov on #webkit).

Reverted changeset:

"calling super() a second time in a constructor should throw"
https://bugs.webkit.org/show_bug.cgi?id=151113
http://trac.webkit.org/changeset/199712

Patch by Commit Queue <commit-queue@webkit.org> on 2016-04-19

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@199724 268f45cc-cd09-0410-ab3c-d52691b4dbfc

30 files changed:
LayoutTests/ChangeLog
LayoutTests/js/class-syntax-super-expected.txt
LayoutTests/js/script-tests/class-syntax-super.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/bytecode/BytecodeList.json
Source/JavaScriptCore/bytecode/BytecodeUseDef.h
Source/JavaScriptCore/bytecode/CodeBlock.cpp
Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h
Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
Source/JavaScriptCore/dfg/DFGCapabilities.cpp
Source/JavaScriptCore/dfg/DFGClobberize.h
Source/JavaScriptCore/dfg/DFGDoesGC.cpp
Source/JavaScriptCore/dfg/DFGFixupPhase.cpp
Source/JavaScriptCore/dfg/DFGNodeType.h
Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp
Source/JavaScriptCore/dfg/DFGSafeToExecute.h
Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
Source/JavaScriptCore/ftl/FTLCapabilities.cpp
Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp
Source/JavaScriptCore/jit/JIT.cpp
Source/JavaScriptCore/jit/JIT.h
Source/JavaScriptCore/jit/JITOpcodes.cpp
Source/JavaScriptCore/jit/JITOpcodes32_64.cpp
Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
Source/JavaScriptCore/tests/stress/class-syntax-double-constructor.js [deleted file]

index 53e6ebf..47c3082 100644 (file)
@@ -1,3 +1,17 @@
+2016-04-19  Commit Queue  <commit-queue@webkit.org>
+
+        Unreviewed, rolling out r199712.
+        https://bugs.webkit.org/show_bug.cgi?id=156741
+
+        It caused a serious regression on 32 bit platform (Requested
+        by gskachkov on #webkit).
+
+        Reverted changeset:
+
+        "calling super() a second time in a constructor should throw"
+        https://bugs.webkit.org/show_bug.cgi?id=151113
+        http://trac.webkit.org/changeset/199712
+
 2016-04-19  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         Unreviewed GTK+ gardening. Update CSP tests.
index 2cf2c14..951d3a5 100644 (file)
@@ -49,7 +49,6 @@ PASS (function () { eval("super.method()");})():::SyntaxError: 'super' is only v
 PASS (function () { eval("super()");})():::SyntaxError: 'super' is only valid inside a function or an 'eval' inside a function.
 PASS new (class { constructor() { (function () { eval("super()");})(); } }):::SyntaxError: 'super' is only valid inside a function or an 'eval' inside a function.
 PASS (new (class { method() { (function () { eval("super.method()");})(); }})).method():::SyntaxError: 'super' is only valid inside a function or an 'eval' inside a function.
-PASS new (class extends Base { constructor() { super(); super();}}):::ReferenceError: 'super()' can't be called more than once in a constructor.
 PASS successfullyParsed
 
 TEST COMPLETE
index bddd289..2e1f284 100644 (file)
@@ -135,5 +135,4 @@ shouldThrow('(function () { eval("super()");})()', '"SyntaxError: \'super\' is o
 shouldThrow('new (class { constructor() { (function () { eval("super()");})(); } })', '"SyntaxError: \'super\' is only valid inside a function or an \'eval\' inside a function."');
 shouldThrow('(new (class { method() { (function () { eval("super.method()");})(); }})).method()', '"SyntaxError: \'super\' is only valid inside a function or an \'eval\' inside a function."');
 
-shouldThrow('new (class extends Base { constructor() { super(); super();}})', '"ReferenceError: \'super()\' can\'t be called more than once in a constructor."');
 var successfullyParsed = true;
index 434a9b3..e127c83 100644 (file)
@@ -1,3 +1,17 @@
+2016-04-19  Commit Queue  <commit-queue@webkit.org>
+
+        Unreviewed, rolling out r199712.
+        https://bugs.webkit.org/show_bug.cgi?id=156741
+
+        It caused a serious regression on 32 bit platform (Requested
+        by gskachkov on #webkit).
+
+        Reverted changeset:
+
+        "calling super() a second time in a constructor should throw"
+        https://bugs.webkit.org/show_bug.cgi?id=151113
+        http://trac.webkit.org/changeset/199712
+
 2016-04-09  Skachkov Oleksandr  <gskachkov@gmail.com>
 
         calling super() a second time in a constructor should throw
index 6723c92..e8eb9b6 100644 (file)
@@ -49,7 +49,6 @@
             { "name" : "op_instanceof", "length" : 4 },
             { "name" : "op_instanceof_custom", "length" : 5 },
             { "name" : "op_typeof", "length" : 3 },
-            { "name" : "op_is_empty", "length" : 3 },
             { "name" : "op_is_undefined", "length" : 3 },
             { "name" : "op_is_boolean", "length" : 3 },
             { "name" : "op_is_number", "length" : 3 },
index fb05608..33c04a8 100644 (file)
@@ -147,7 +147,6 @@ void computeUsesForBytecodeOffset(
     case op_get_by_id:
     case op_get_array_length:
     case op_typeof:
-    case op_is_empty:
     case op_is_undefined:
     case op_is_boolean:
     case op_is_number:
@@ -377,7 +376,6 @@ void computeDefsForBytecodeOffset(CodeBlock* codeBlock, BytecodeBasicBlock* bloc
     case op_instanceof_custom:
     case op_get_by_val:
     case op_typeof:
-    case op_is_empty:
     case op_is_undefined:
     case op_is_boolean:
     case op_is_number:
index 3b7212a..1760510 100644 (file)
@@ -1064,10 +1064,6 @@ void CodeBlock::dumpBytecode(
             printUnaryOp(out, exec, location, it, "typeof");
             break;
         }
-        case op_is_empty: {
-            printUnaryOp(out, exec, location, it, "is_empty");
-            break;
-        }
         case op_is_undefined: {
             printUnaryOp(out, exec, location, it, "is_undefined");
             break;
index 0e2b878..3c9a5a2 100644 (file)
@@ -4108,14 +4108,6 @@ RegisterID* BytecodeGenerator::emitIsUndefined(RegisterID* dst, RegisterID* src)
     return dst;
 }
 
-RegisterID* BytecodeGenerator::emitIsEmpty(RegisterID* dst, RegisterID* src)
-{
-    emitOpcode(op_is_empty);
-    instructions().append(dst->index());
-    instructions().append(src->index());
-    return dst;
-}
-    
 RegisterID* BytecodeGenerator::emitIteratorNext(RegisterID* dst, RegisterID* iterator, const ThrowableExpressionData* node)
 {
     {
index e4328ca..81cc526 100644 (file)
@@ -620,7 +620,6 @@ namespace JSC {
 
         RegisterID* emitIsObject(RegisterID* dst, RegisterID* src);
         RegisterID* emitIsUndefined(RegisterID* dst, RegisterID* src);
-        RegisterID* emitIsEmpty(RegisterID* dst, RegisterID* src);
         void emitRequireObjectCoercible(RegisterID* value, const String& error);
 
         RegisterID* emitIteratorNext(RegisterID* dst, RegisterID* iterator, const ThrowableExpressionData* node);
index e1dd747..3ec74ef 100644 (file)
@@ -758,21 +758,10 @@ RegisterID* FunctionCallValueNode::emitBytecode(BytecodeGenerator& generator, Re
         ASSERT(generator.constructorKind() == ConstructorKind::Derived || generator.derivedContextType() == DerivedContextType::DerivedConstructorContext);
         generator.emitMove(callArguments.thisRegister(), generator.newTarget());
         RegisterID* ret = generator.emitConstruct(returnValue.get(), func.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd());
-
-        bool isConstructorKindDerived = generator.constructorKind() == ConstructorKind::Derived;
-        bool doWeUseArrowFunctionInConstructor = isConstructorKindDerived && generator.needsToUpdateArrowFunctionContext();
-
-        if (generator.isDerivedConstructorContext() || (doWeUseArrowFunctionInConstructor && generator.isSuperCallUsedInInnerArrowFunction()))
-            generator.emitLoadThisFromArrowFunctionLexicalEnvironment();
-        
-        RefPtr<Label> thisIsEmptyLabel = generator.newLabel();
-        generator.emitJumpIfTrue(generator.emitIsEmpty(generator.newTemporary(), generator.thisRegister()), thisIsEmptyLabel.get());
-        generator.emitThrowReferenceError(ASCIILiteral("'super()' can't be called more than once in a constructor."));
-        generator.emitLabel(thisIsEmptyLabel.get());
-
         generator.emitMove(generator.thisRegister(), ret);
         
-        if (generator.isDerivedConstructorContext() || doWeUseArrowFunctionInConstructor)
+        bool isConstructorKindDerived = generator.constructorKind() == ConstructorKind::Derived;
+        if (generator.isDerivedConstructorContext() || (isConstructorKindDerived && generator.needsToUpdateArrowFunctionContext()))
             generator.emitPutThisToArrowFunctionContextScope();
         
         return ret;
index 7be562c..ab15e25 100644 (file)
@@ -979,7 +979,6 @@ bool AbstractInterpreter<AbstractStateType>::executeEffects(unsigned clobberLimi
         break;
     }
 
-    case IsEmpty:
     case IsArrayObject:
     case IsJSArray:
     case IsArrayConstructor:
@@ -1064,9 +1063,6 @@ bool AbstractInterpreter<AbstractStateType>::executeEffects(unsigned clobberLimi
                 } else
                     setConstant(node, jsBoolean(false));
                 break;
-            case IsEmpty:
-                setConstant(node, jsBoolean(child.value().isEmpty()));
-                break;
             default:
                 constantWasSet = false;
                 break;
@@ -1097,21 +1093,6 @@ bool AbstractInterpreter<AbstractStateType>::executeEffects(unsigned clobberLimi
             }
 
             break;
-        case IsEmpty: {
-            if (child.m_type && !(child.m_type & SpecEmpty)) {
-                setConstant(node, jsBoolean(false));
-                constantWasSet = true;
-                break;
-            }
-
-            if (child.m_type && !(child.m_type & ~SpecEmpty)) {
-                setConstant(node, jsBoolean(true));
-                constantWasSet = true;
-                break;
-            }
-
-            break;
-        }
         case IsUndefined:
             // FIXME: Use the masquerades-as-undefined watchpoint thingy.
             // https://bugs.webkit.org/show_bug.cgi?id=144456
index 8d19adb..ab658cb 100644 (file)
@@ -3712,11 +3712,7 @@ bool ByteCodeParser::parseBlock(unsigned limit)
             set(VirtualRegister(currentInstruction[1].u.operand), addToGraph(InstanceOfCustom, value, constructor, hasInstanceValue));
             NEXT_OPCODE(op_instanceof_custom);
         }
-        case op_is_empty: {
-            Node* value = get(VirtualRegister(currentInstruction[2].u.operand));
-            set(VirtualRegister(currentInstruction[1].u.operand), addToGraph(IsEmpty, value));
-            NEXT_OPCODE(op_is_empty);
-        }
+
         case op_is_undefined: {
             Node* value = get(VirtualRegister(currentInstruction[2].u.operand));
             set(VirtualRegister(currentInstruction[1].u.operand), addToGraph(IsUndefined, value));
index 1e92538..7370138 100644 (file)
@@ -132,7 +132,6 @@ CapabilityLevel capabilityLevel(OpcodeID opcodeID, CodeBlock* codeBlock, Instruc
     case op_overrides_has_instance:
     case op_instanceof:
     case op_instanceof_custom:
-    case op_is_empty:
     case op_is_undefined:
     case op_is_boolean:
     case op_is_number:
index d9fb8ef..1690371 100644 (file)
@@ -155,7 +155,6 @@ void clobberize(Graph& graph, Node* node, const ReadFunctor& read, const WriteFu
     case CompareStrictEq:
     case IsJSArray:
     case IsArrayConstructor:
-    case IsEmpty:
     case IsUndefined:
     case IsBoolean:
     case IsNumber:
index ac475e9..475b798 100644 (file)
@@ -156,7 +156,6 @@ bool doesGC(Graph& graph, Node* node)
     case IsArrayObject:
     case IsJSArray:
     case IsArrayConstructor:
-    case IsEmpty:
     case IsUndefined:
     case IsBoolean:
     case IsNumber:
index 4d1183b..97ed6ad 100644 (file)
@@ -1525,7 +1525,6 @@ private:
         case IsArrayObject:
         case IsJSArray:
         case IsArrayConstructor:
-        case IsEmpty:
         case IsUndefined:
         case IsBoolean:
         case IsNumber:
index 2eb687e..f471419 100644 (file)
@@ -306,7 +306,6 @@ namespace JSC { namespace DFG {
     macro(IsArrayObject, NodeMustGenerate | NodeResultBoolean) \
     macro(IsJSArray, NodeResultBoolean) \
     macro(IsArrayConstructor, NodeResultBoolean) \
-    macro(IsEmpty, NodeResultBoolean) \
     macro(IsUndefined, NodeResultBoolean) \
     macro(IsBoolean, NodeResultBoolean) \
     macro(IsNumber, NodeResultBoolean) \
index b668249..e4d26e0 100644 (file)
@@ -431,7 +431,6 @@ private:
         case IsArrayObject:
         case IsJSArray:
         case IsArrayConstructor:
-        case IsEmpty:
         case IsUndefined:
         case IsBoolean:
         case IsNumber:
index 6913da3..31531c6 100644 (file)
@@ -256,7 +256,6 @@ bool safeToExecute(AbstractStateType& state, Graph& graph, Node* node)
     case IsArrayObject:
     case IsJSArray:
     case IsArrayConstructor:
-    case IsEmpty:
     case IsUndefined:
     case IsBoolean:
     case IsNumber:
index 181717f..b749c94 100644 (file)
@@ -4413,14 +4413,6 @@ void SpeculativeJIT::compile(Node* node)
         break;
     }
 
-    case IsEmpty: {        
-        JSValueOperand value(this, node->child1());
-        GPRTemporary result(this, Reuse, value, TagWord);
-        m_jit.comparePtr(JITCompiler::Equal, value.tagGPR(), TrustedImm32(JSValue::EmptyValueTag), result.gpr());
-        booleanResult(result.gpr(), node);
-        break;
-    }
-
     case IsUndefined: {
         JSValueOperand value(this, node->child1());
         GPRTemporary result(this);
index 0e8139e..9915102 100644 (file)
@@ -4432,17 +4432,6 @@ void SpeculativeJIT::compile(Node* node)
         compileInstanceOfCustom(node);
         break;
     }
-
-    case IsEmpty: {        
-        JSValueOperand value(this, node->child1());
-        GPRTemporary result(this, Reuse, value);
-
-        m_jit.comparePtr(JITCompiler::Equal, value.gpr(), TrustedImm32(JSValue::encode(JSValue())), result.gpr());
-        m_jit.or32(TrustedImm32(ValueFalse), result.gpr());
-
-        jsValueResult(result.gpr(), node, DataFormatJSBoolean);
-        break;
-    }
         
     case IsUndefined: {
         JSValueOperand value(this, node->child1());
index c30d5e1..ebcf59e 100644 (file)
@@ -179,7 +179,6 @@ inline CapabilityLevel canCompile(Node* node)
     case IsArrayObject:
     case IsJSArray:
     case IsArrayConstructor:
-    case IsEmpty:
     case IsUndefined:
     case IsBoolean:
     case IsNumber:
index 3ca6c05..9282d49 100644 (file)
@@ -840,9 +840,6 @@ private:
         case InvalidationPoint:
             compileInvalidationPoint();
             break;
-        case IsEmpty:
-            compileIsEmpty();
-            break;
         case IsUndefined:
             compileIsUndefined();
             break;
@@ -5726,11 +5723,6 @@ private:
         // When this abruptly terminates, it could read any heap location.
         patchpoint->effects.reads = HeapRange::top();
     }
-
-    void compileIsEmpty()
-    {
-        setBoolean(m_out.isZero64(lowJSValue(m_node->child1())));
-    }
     
     void compileIsUndefined()
     {
index 96e4ec2..2d74cf6 100644 (file)
@@ -235,7 +235,6 @@ void JIT::privateCompileMainPass()
         DEFINE_OP(op_overrides_has_instance)
         DEFINE_OP(op_instanceof)
         DEFINE_OP(op_instanceof_custom)
-        DEFINE_OP(op_is_empty)
         DEFINE_OP(op_is_undefined)
         DEFINE_OP(op_is_boolean)
         DEFINE_OP(op_is_number)
index 0c3f11d..0819b7e 100644 (file)
@@ -511,7 +511,6 @@ namespace JSC {
         void emit_op_overrides_has_instance(Instruction*);
         void emit_op_instanceof(Instruction*);
         void emit_op_instanceof_custom(Instruction*);
-        void emit_op_is_empty(Instruction*);
         void emit_op_is_undefined(Instruction*);
         void emit_op_is_boolean(Instruction*);
         void emit_op_is_number(Instruction*);
index 5c5eda9..f1364ff 100644 (file)
@@ -175,18 +175,6 @@ void JIT::emit_op_instanceof_custom(Instruction*)
     // This always goes to slow path since we expect it to be rare.
     addSlowCase(jump());
 }
-    
-void JIT::emit_op_is_empty(Instruction* currentInstruction)
-{
-    int dst = currentInstruction[1].u.operand;
-    int value = currentInstruction[2].u.operand;
-
-    emitGetVirtualRegister(value, regT0);
-    compare64(Equal, regT0, TrustedImm32(JSValue::encode(JSValue())), regT0);
-
-    emitTagBool(regT0);
-    emitPutVirtualRegister(dst);
-}
 
 void JIT::emit_op_is_undefined(Instruction* currentInstruction)
 {
index b45d390..ed44349 100644 (file)
@@ -290,17 +290,6 @@ void JIT::emitSlow_op_instanceof_custom(Instruction* currentInstruction, Vector<
     callOperation(operationInstanceOfCustom, regT1, regT0, regT2, regT4, regT3);
     emitStoreBool(dst, returnValueGPR);
 }
-    
-void JIT::emit_op_is_empty(Instruction* currentInstruction)
-{
-    int dst = currentInstruction[1].u.operand;
-    int value = currentInstruction[2].u.operand;
-    
-    emitLoad(value, regT1, regT0);
-    compare32(Equal, regT1, TrustedImm32(JSValue::EmptyValueTag), regT0);
-
-    emitStoreBool(dst, regT0);
-}
 
 void JIT::emit_op_is_undefined(Instruction* currentInstruction)
 {
index e151c62..5649797 100644 (file)
@@ -1212,16 +1212,6 @@ _llint_op_instanceof_custom:
     dispatch(5)
 
 
-_llint_op_is_empty:
-    traceExecution()
-    loadi 8[PC], t1
-    loadi 4[PC], t0
-    loadConstantOrVariable(t1, t2, t3)
-    cieq t2, EmptyValueTag, t3
-    storei t3, PayloadOffset[cfr, t0, 8]
-    dispatch(3)
-
-
 _llint_op_is_undefined:
     traceExecution()
     loadi 8[PC], t1
index c602553..7b83eee 100644 (file)
@@ -1098,18 +1098,6 @@ _llint_op_instanceof_custom:
     callSlowPath(_llint_slow_path_instanceof_custom)
     dispatch(5)
 
-
-_llint_op_is_empty:
-    traceExecution()
-    loadisFromInstruction(2, t1)
-    loadisFromInstruction(1, t2)
-    loadConstantOrVariable(t1, t0)
-    cqeq t0, ValueEmpty, t3
-    orq ValueFalse, t3
-    storeq t3, [cfr, t2, 8]
-    dispatch(3)
-
-
 _llint_op_is_undefined:
     traceExecution()
     loadisFromInstruction(2, t1)
diff --git a/Source/JavaScriptCore/tests/stress/class-syntax-double-constructor.js b/Source/JavaScriptCore/tests/stress/class-syntax-double-constructor.js
deleted file mode 100644 (file)
index 71fac04..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-const oneCallOfParentConstructor = 1;
-const twoCallOfParentConstructor = 2;
-
-function tryCatch(klass) {
-  let result = false;
-  try {
-    new klass();
-  } catch(e) {
-    result = e instanceof ReferenceError;
-  }
-  return result;
-}
-
-var testCase = function (actual, expected, message) {
-  if (actual !== expected) {
-    throw message + ". Expected '" + expected + "', but was '" + actual + "'";
-  }
-};
-
-let count = 0;
-class A {
-  constructor() {
-    this.id = 0;
-    count++;
-  }
-}
-
-class B extends A {
-  constructor() {
-    super();
-    super();
-    super();
-  }
-}
-
-testCase(tryCatch(B), true, 'Error: ReferenceError was not raised in case of two or more call super() #1');
-testCase(count, twoCallOfParentConstructor, 'Excpected two call of parent constructor #1');
-
-count = 0;
-class C extends A {
-  constructor() {
-    (()=>super())();
-    (()=>super())();
-    (()=>super())();
-  }
-}
-
-testCase(tryCatch(C), true, 'Error: ReferenceError was not raised in case of two or more call super() in arrrow function #2');
-testCase(count, twoCallOfParentConstructor, 'Excpected two call of parent constructor in arrow function #2');
-
-count = 0;
-class D extends A {
-  constructor() {
-    eval('super()');
-    eval('super()');
-    eval('super()');
-  }
-}
-
-testCase(tryCatch(D), true, 'Error: ReferenceError was not raised in case of two or more call super() in eval #3');
-testCase(count, twoCallOfParentConstructor, 'Excpected two call of parent constructor in eval #3');
-
-count = 0;
-class E extends A {
-  constructor() {
-    (()=>eval('super()'))();
-    (()=>eval('super()'))();
-    (()=>eval('super()'))();
-  }
-}
-
-testCase(tryCatch(E), true, 'Error: ReferenceError was not raised in case of two or more call super() in eval within arrow function #4');
-testCase(count, twoCallOfParentConstructor, 'Excpected two call of parent constructor in eval within arrow function #4');
-
-count = 0;
-class F extends A {
-    constructor() {
-        super();
-        var arrow = () => 'testValue';
-        arrow();
-    }
-}
-
-testCase(tryCatch(F), false, 'Error: ReferenceError was raised but should not be #5');
-testCase(count, oneCallOfParentConstructor, 'Excpected two call of parent constructor #5');
-
-count = 0;
-class G extends A {
-    constructor() {
-        super();
-        eval('(()=>"abc")()');
-    }
-}
-
-testCase(tryCatch(G), false, 'Error: ReferenceError was raised but should not be #6');
-testCase(count, oneCallOfParentConstructor, 'Excpected two call of parent constructor #6');
-
-count = 0;
-class H extends A {
-    constructor() {
-        eval('(()=>eval("super()"))()');
-        try {
-            eval('(()=>eval("super()"))()');
-        } catch(e) {
-          let result = e instanceof ReferenceError;
-          if (!result) throw new Error('Wrong type error');
-        }
-        try {
-            eval('(()=>eval("super()"))()');
-          } catch(e) {
-            let result = e instanceof ReferenceError;
-            if (!result) throw new Error('Wrong type error');
-          }
-        try {
-            eval('(()=>eval("super()"))()');
-        } catch(e) {
-            let result = e instanceof ReferenceError;
-            if (!result) throw new Error('Wrong type error');
-        }
-    }
-}
-
-testCase(tryCatch(H), false, 'Error: ReferenceError was raised but should not be #7');
-testCase(count, 4, 'Excpected two call of parent constructor #7');
-
-noInline(B);
-for (var i = 0; i < 10000; i++) {
-    count = 0;
-    let result = false;
-    try {
-        new B();
-    } catch(e) {
-        result = e instanceof ReferenceError;
-    }
-
-    testCase(result, true, '');
-    testCase(count, 2, '');
-}
-
-count = 0;
-class I extends A {
-  constructor() {
-    super();
-    (()=>super())();
-  }
-}
-
-testCase(tryCatch(I), true, 'Error: ReferenceError was not raised in case of two or more call super() #8');
-testCase(count, 2, 'Excpected two call of parent constructor #8');
-
-count = 0;
-class J extends A {
-  constructor() {
-    super();
-    eval('super()');
-  }
-}
-
-testCase(tryCatch(J), true, 'Error: ReferenceError was not raised in case of two or more call super() #9');
-testCase(count, 2, 'Excpected two call of parent constructor #9');
-
-let maxCount = 150000;
-class K extends A {
-  constructor(i) {
-    if (i % 2 === 0 )
-      super();
-    if (i % 2 !== 0 || maxCount === i)
-      super();
-  }
-}
-
-noInline(K);
-let result = false;
-try {
-    count = 0;
-    for (var i = 1; i <= maxCount; i++) {
-        new K(i);
-    }
-} catch (e) {
-    result = e instanceof ReferenceError;
-}
-testCase(result, true, 'Error: ReferenceError was not raised in case of two or more call super() #10');
-testCase(count, maxCount + 1, 'Excpected a lot of calls of parent constructor #10');