Ignore:
Timestamp:
Jul 28, 2015, 3:39:12 PM (10 years ago)
Author:
[email protected]
Message:

Make the type profiler work with lexical scoping and add tests
https://bugs.webkit.org/show_bug.cgi?id=145438

Reviewed by Geoffrey Garen.

op_profile_type now knows how to resolve variables allocated within
the local scope stack. This means it knows how to resolve "let"
and "const" variables. Also, some refactoring was done inside
the BytecodeGenerator to make writing code to support the type
profiler much simpler and clearer.

  • bytecode/CodeBlock.cpp:

(JSC::CodeBlock::CodeBlock):

  • bytecode/CodeBlock.h:

(JSC::CodeBlock::symbolTable): Deleted.

  • bytecode/UnlinkedCodeBlock.h:

(JSC::UnlinkedCodeBlock::addExceptionHandler):
(JSC::UnlinkedCodeBlock::exceptionHandler):
(JSC::UnlinkedCodeBlock::vm):
(JSC::UnlinkedCodeBlock::addArrayProfile):
(JSC::UnlinkedCodeBlock::setSymbolTableConstantIndex): Deleted.
(JSC::UnlinkedCodeBlock::symbolTableConstantIndex): Deleted.

  • bytecompiler/BytecodeGenerator.cpp:

(JSC::BytecodeGenerator::BytecodeGenerator):
(JSC::BytecodeGenerator::emitMove):
(JSC::BytecodeGenerator::emitTypeProfilerExpressionInfo):
(JSC::BytecodeGenerator::emitProfileType):
(JSC::BytecodeGenerator::emitProfileControlFlow):
(JSC::BytecodeGenerator::pushLexicalScopeInternal):

  • bytecompiler/BytecodeGenerator.h:

(JSC::BytecodeGenerator::emitNodeForLeftHandSide):

  • bytecompiler/NodesCodegen.cpp:

(JSC::ThisNode::emitBytecode):
(JSC::ResolveNode::emitBytecode):
(JSC::BracketAccessorNode::emitBytecode):
(JSC::DotAccessorNode::emitBytecode):
(JSC::FunctionCallValueNode::emitBytecode):
(JSC::FunctionCallResolveNode::emitBytecode):
(JSC::FunctionCallBracketNode::emitBytecode):
(JSC::FunctionCallDotNode::emitBytecode):
(JSC::CallFunctionCallDotNode::emitBytecode):
(JSC::ApplyFunctionCallDotNode::emitBytecode):
(JSC::PostfixNode::emitResolve):
(JSC::PostfixNode::emitBracket):
(JSC::PostfixNode::emitDot):
(JSC::PrefixNode::emitResolve):
(JSC::PrefixNode::emitBracket):
(JSC::PrefixNode::emitDot):
(JSC::ReadModifyResolveNode::emitBytecode):
(JSC::AssignResolveNode::emitBytecode):
(JSC::AssignDotNode::emitBytecode):
(JSC::ReadModifyDotNode::emitBytecode):
(JSC::AssignBracketNode::emitBytecode):
(JSC::ReadModifyBracketNode::emitBytecode):
(JSC::EmptyVarExpression::emitBytecode):
(JSC::EmptyLetExpression::emitBytecode):
(JSC::ForInNode::emitLoopHeader):
(JSC::ForOfNode::emitBytecode):
(JSC::ReturnNode::emitBytecode):
(JSC::FunctionNode::emitBytecode):
(JSC::BindingNode::bindValue):

  • dfg/DFGSpeculativeJIT32_64.cpp:

(JSC::DFG::SpeculativeJIT::compile):

  • dfg/DFGSpeculativeJIT64.cpp:

(JSC::DFG::SpeculativeJIT::compile):

  • jit/JITOpcodes.cpp:

(JSC::JIT::emit_op_profile_type):

  • jit/JITOpcodes32_64.cpp:

(JSC::JIT::emit_op_profile_type):

  • llint/LowLevelInterpreter32_64.asm:
  • llint/LowLevelInterpreter64.asm:
  • tests/typeProfiler/es6-block-scoping.js: Added.

(noop):
(arr):
(wrapper.changeFoo):
(wrapper.scoping):
(wrapper.scoping2):
(wrapper):

  • tests/typeProfiler/es6-classes.js: Added.

(noop):
(wrapper.Animal):
(wrapper.Animal.prototype.methodA):
(wrapper.Dog):
(wrapper.Dog.prototype.methodB):
(wrapper):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

    r187515 r187524  
    154154
    155155    RegisterID* result = generator.moveToDestinationIfNeeded(dst, generator.thisRegister());
    156     if (generator.vm()->typeProfiler()) {
    157         generator.emitProfileType(generator.thisRegister(), ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    158         static const unsigned thisLength = 4;
    159         generator.emitTypeProfilerExpressionInfo(position(), JSTextPosition(-1, position().offset + thisLength, -1));
    160     }
     156    static const unsigned thisLength = 4;
     157    generator.emitProfileType(generator.thisRegister(), position(), JSTextPosition(-1, position().offset + thisLength, -1));
    161158    return result;
    162159}
     
    210207        if (dst == generator.ignoredResult())
    211208            return nullptr;
    212         if (generator.vm()->typeProfiler()) {
    213             generator.emitProfileType(local, ProfileTypeBytecodeHasGlobalID, nullptr);
    214             generator.emitTypeProfilerExpressionInfo(m_position, JSTextPosition(-1, m_position.offset + m_ident.length(), -1));
    215         }
     209
     210        generator.emitProfileType(local, var, m_position, JSTextPosition(-1, m_position.offset + m_ident.length(), -1));
    216211        return generator.moveToDestinationIfNeeded(dst, local);
    217212    }
     
    223218    RegisterID* result = generator.emitGetFromScope(finalDest, scope.get(), var, ThrowIfNotFound);
    224219    generator.emitTDZCheckIfNecessary(var, finalDest, nullptr);
    225     if (generator.vm()->typeProfiler()) {
    226         generator.emitProfileType(finalDest, var.isResolved() ? ProfileTypeBytecodeGetFromLocalScope : ProfileTypeBytecodeGetFromScope, &m_ident);
    227         generator.emitTypeProfilerExpressionInfo(m_position, JSTextPosition(-1, m_position.offset + m_ident.length(), -1));
    228     }
     220    generator.emitProfileType(finalDest, var, m_position, JSTextPosition(-1, m_position.offset + m_ident.length(), -1));
    229221    return result;
    230222}
     
    624616    generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
    625617
    626     if (generator.vm()->typeProfiler()) {
    627         generator.emitProfileType(finalDest, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    628         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    629     }
     618    generator.emitProfileType(finalDest, divotStart(), divotEnd());
    630619    return ret;
    631620}
     
    639628    RegisterID* finalDest = generator.finalDestination(dst);
    640629    RegisterID* ret = generator.emitGetById(finalDest, base.get(), m_ident);
    641     if (generator.vm()->typeProfiler()) {
    642         generator.emitProfileType(finalDest, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    643         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    644     }
     630    generator.emitProfileType(finalDest, divotStart(), divotEnd());
    645631    return ret;
    646632}
     
    735721    generator.emitLoad(callArguments.thisRegister(), jsUndefined());
    736722    RegisterID* ret = generator.emitCall(returnValue.get(), func.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd());
    737     if (generator.vm()->typeProfiler()) {
    738         generator.emitProfileType(returnValue.get(), ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    739         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    740     }
     723    generator.emitProfileType(returnValue.get(), divotStart(), divotEnd());
    741724    return ret;
    742725}
     
    758741        // local variable, then it's not one of our built-in constructors.
    759742        RegisterID* ret = generator.emitCall(returnValue.get(), func.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd());
    760         if (generator.vm()->typeProfiler()) {
    761             generator.emitProfileType(returnValue.get(), ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    762             generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    763         }
     743        generator.emitProfileType(returnValue.get(), divotStart(), divotEnd());
    764744        return ret;
    765745    }
     
    777757    generator.emitTDZCheckIfNecessary(var, func.get(), nullptr);
    778758    RegisterID* ret = generator.emitCall(returnValue.get(), func.get(), expectedFunction, callArguments, divot(), divotStart(), divotEnd());
    779     if (generator.vm()->typeProfiler()) {
    780         generator.emitProfileType(returnValue.get(), ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    781         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    782     }
     759    generator.emitProfileType(returnValue.get(), divotStart(), divotEnd());
    783760    return ret;
    784761}
     
    848825        generator.emitMove(callArguments.thisRegister(), base.get());
    849826    RegisterID* ret = generator.emitCall(returnValue.get(), function.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd());
    850     if (generator.vm()->typeProfiler()) {
    851         generator.emitProfileType(returnValue.get(), ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    852         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    853     }
     827    generator.emitProfileType(returnValue.get(), divotStart(), divotEnd());
    854828    return ret;
    855829}
     
    870844    generator.emitGetById(function.get(), baseIsSuper ? emitSuperBaseForCallee(generator) : callArguments.thisRegister(), m_ident);
    871845    RegisterID* ret = generator.emitCall(returnValue.get(), function.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd());
    872     if (generator.vm()->typeProfiler()) {
    873         generator.emitProfileType(returnValue.get(), ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    874         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    875     }
     846    generator.emitProfileType(returnValue.get(), divotStart(), divotEnd());
    876847    return ret;
    877848}
     
    928899        generator.emitLabel(end.get());
    929900    }
    930     if (generator.vm()->typeProfiler()) {
    931         generator.emitProfileType(returnValue.get(), ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    932         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    933     }
     901    generator.emitProfileType(returnValue.get(), divotStart(), divotEnd());
    934902    return returnValue.get();
    935903}
     
    10391007        generator.emitLabel(end.get());
    10401008    }
    1041     if (generator.vm()->typeProfiler()) {
    1042         generator.emitProfileType(returnValue.get(), ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    1043         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    1044     }
     1009    generator.emitProfileType(returnValue.get(), divotStart(), divotEnd());
    10451010    return returnValue.get();
    10461011}
     
    10781043            generator.emitReadOnlyExceptionIfNeeded(var);
    10791044            localReg = generator.emitMove(generator.tempDestination(dst), local);
    1080         } else if (generator.vm()->typeProfiler()) {
    1081             RefPtr<RegisterID> tempDst = generator.finalDestination(dst);
    1082             ASSERT(dst != localReg);
    1083             RefPtr<RegisterID> tempDstSrc = generator.newTemporary();
    1084             generator.emitToNumber(tempDst.get(), localReg.get());
    1085             generator.emitMove(tempDstSrc.get(), localReg.get());
    1086             emitIncOrDec(generator, tempDstSrc.get(), m_operator);
    1087             generator.emitMove(localReg.get(), tempDstSrc.get());
    1088             if (generator.vm()->typeProfiler())
    1089                 generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    1090             return tempDst.get();
    10911045        }
    1092         return emitPostIncOrDec(generator, generator.finalDestination(dst), localReg.get(), m_operator);
     1046        RefPtr<RegisterID> oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), localReg.get(), m_operator);
     1047        generator.emitProfileType(localReg.get(), var, divotStart(), divotEnd());
     1048        return oldValue.get();
    10931049    }
    10941050
     
    11041060    RefPtr<RegisterID> oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator);
    11051061    generator.emitPutToScope(scope.get(), var, value.get(), ThrowIfNotFound);
    1106     if (generator.vm()->typeProfiler()) {
    1107         generator.emitProfileType(value.get(), var.isResolved() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &ident);
    1108         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    1109     }
     1062    generator.emitProfileType(value.get(), var, divotStart(), divotEnd());
    11101063
    11111064    return oldValue.get();
     
    11301083    generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
    11311084    generator.emitPutByVal(base.get(), property.get(), value.get());
    1132     if (generator.vm()->typeProfiler()) {
    1133         generator.emitProfileType(value.get(), ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    1134         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    1135     }
     1085    generator.emitProfileType(value.get(), divotStart(), divotEnd());
    11361086    return generator.moveToDestinationIfNeeded(dst, oldValue);
    11371087}
     
    11541104    generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
    11551105    generator.emitPutById(base.get(), ident, value.get());
    1156     if (generator.vm()->typeProfiler()) {
    1157         generator.emitProfileType(value.get(), ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    1158         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    1159     }
     1106    generator.emitProfileType(value.get(), divotStart(), divotEnd());
    11601107    return generator.moveToDestinationIfNeeded(dst, oldValue);
    11611108}
     
    12921239            emitIncOrDec(generator, tempDst.get(), m_operator);
    12931240            generator.emitMove(localReg.get(), tempDst.get());
    1294             if (generator.vm()->typeProfiler())
    1295                 generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
     1241            generator.emitProfileType(localReg.get(), var, divotStart(), divotEnd());
    12961242            return generator.moveToDestinationIfNeeded(dst, tempDst.get());
    12971243        }
     
    13121258    emitIncOrDec(generator, value.get(), m_operator);
    13131259    generator.emitPutToScope(scope.get(), var, value.get(), ThrowIfNotFound);
    1314     if (generator.vm()->typeProfiler()) {
    1315         generator.emitProfileType(value.get(), var.isResolved() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &ident);
    1316         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    1317     }
     1260    generator.emitProfileType(value.get(), var, divotStart(), divotEnd());
    13181261    return generator.moveToDestinationIfNeeded(dst, value.get());
    13191262}
     
    13351278    generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
    13361279    generator.emitPutByVal(base.get(), property.get(), value);
    1337     if (generator.vm()->typeProfiler()) {
    1338         generator.emitProfileType(value, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    1339         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    1340     }
     1280    generator.emitProfileType(value, divotStart(), divotEnd());
    13411281    return generator.moveToDestinationIfNeeded(dst, propDst.get());
    13421282}
     
    13571297    generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
    13581298    generator.emitPutById(base.get(), ident, value);
    1359     if (generator.vm()->typeProfiler()) {
    1360         generator.emitProfileType(value, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    1361         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    1362     }
     1299    generator.emitProfileType(value, divotStart(), divotEnd());
    13631300    return generator.moveToDestinationIfNeeded(dst, propDst.get());
    13641301}
     
    18101747        if (var.isReadOnly()) {
    18111748            generator.emitReadOnlyExceptionIfNeeded(var);
    1812             return emitReadModifyAssignment(generator, generator.finalDestination(dst), local, m_right, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));
     1749            RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst), local, m_right, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));
     1750            generator.emitProfileType(result, divotStart(), divotEnd());
     1751            return result;
    18131752        }
    18141753       
    1815         if (generator.vm()->typeProfiler()
    1816             || generator.leftHandSideNeedsCopy(m_rightHasAssignments, m_right->isPure(generator))) {
     1754        if (generator.leftHandSideNeedsCopy(m_rightHasAssignments, m_right->isPure(generator))) {
    18171755            RefPtr<RegisterID> result = generator.newTemporary();
    18181756            generator.emitMove(result.get(), local);
     
    18201758            generator.emitMove(local, result.get());
    18211759            generator.invalidateForInContextForLocal(local);
    1822             if (generator.vm()->typeProfiler())
    1823                 generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
     1760            generator.emitProfileType(local, divotStart(), divotEnd());
    18241761            return generator.moveToDestinationIfNeeded(dst, result.get());
    18251762        }
     
    18271764        RegisterID* result = emitReadModifyAssignment(generator, local, local, m_right, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));
    18281765        generator.invalidateForInContextForLocal(local);
     1766        generator.emitProfileType(result, divotStart(), divotEnd());
    18291767        return generator.moveToDestinationIfNeeded(dst, result);
    18301768    }
     
    18411779    RefPtr<RegisterID> result = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), m_right, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()), this);
    18421780    RegisterID* returnResult = generator.emitPutToScope(scope.get(), var, result.get(), ThrowIfNotFound);
    1843     if (generator.vm()->typeProfiler()) {
    1844         generator.emitProfileType(result.get(), var.isResolved() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &m_ident);
    1845         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    1846     }
     1781    generator.emitProfileType(result.get(), var, divotStart(), divotEnd());
    18471782    return returnResult;
    18481783}
     
    18611796            result = generator.emitNode(dst, m_right); // Execute side effects first.
    18621797            generator.emitReadOnlyExceptionIfNeeded(var);
    1863         } else if (var.isSpecial() || generator.vm()->typeProfiler()) {
     1798            generator.emitProfileType(result, var, divotStart(), divotEnd());
     1799        } else if (var.isSpecial()) {
    18641800            RefPtr<RegisterID> tempDst = generator.tempDestination(dst);
    18651801            generator.emitNode(tempDst.get(), m_right);
    18661802            generator.emitMove(local, tempDst.get());
     1803            generator.emitProfileType(local, var, divotStart(), divotEnd());
    18671804            generator.invalidateForInContextForLocal(local);
    1868             if (generator.vm()->typeProfiler())
    1869                 generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    18701805            result = generator.moveToDestinationIfNeeded(dst, tempDst.get());
    18711806        } else {
    18721807            RegisterID* right = generator.emitNode(local, m_right);
     1808            generator.emitProfileType(right, var, divotStart(), divotEnd());
    18731809            generator.invalidateForInContextForLocal(local);
    18741810            result = generator.moveToDestinationIfNeeded(dst, right);
     
    18961832    generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
    18971833    RegisterID* returnResult = generator.emitPutToScope(scope.get(), var, result.get(), generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound);
    1898     if (generator.vm()->typeProfiler()) {
    1899         generator.emitProfileType(result.get(), var.isResolved() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &m_ident);
    1900         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    1901     }
     1834    generator.emitProfileType(result.get(), var, divotStart(), divotEnd());
    19021835
    19031836    if (m_assignmentContext == AssignmentContext::DeclarationStatement || m_assignmentContext == AssignmentContext::ConstDeclarationStatement)
     
    19161849    RegisterID* forwardResult = (dst == generator.ignoredResult()) ? result.get() : generator.moveToDestinationIfNeeded(generator.tempDestination(result.get()), result.get());
    19171850    generator.emitPutById(base.get(), m_ident, forwardResult);
    1918     if (generator.vm()->typeProfiler()) {
    1919         generator.emitProfileType(forwardResult, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    1920         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    1921     }
     1851    generator.emitProfileType(forwardResult, divotStart(), divotEnd());
    19221852    return generator.moveToDestinationIfNeeded(dst, forwardResult);
    19231853}
     
    19351865    generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
    19361866    RegisterID* ret = generator.emitPutById(base.get(), m_ident, updatedValue);
    1937     if (generator.vm()->typeProfiler()) {
    1938         generator.emitProfileType(updatedValue, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    1939         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    1940     }
     1867    generator.emitProfileType(updatedValue, divotStart(), divotEnd());
    19411868    return ret;
    19421869}
     
    19661893        generator.emitPutByVal(base.get(), property.get(), forwardResult);
    19671894
    1968     if (generator.vm()->typeProfiler()) {
    1969         generator.emitProfileType(forwardResult, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    1970         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    1971     }
     1895    generator.emitProfileType(forwardResult, divotStart(), divotEnd());
    19721896    return generator.moveToDestinationIfNeeded(dst, forwardResult);
    19731897}
     
    19861910    generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
    19871911    generator.emitPutByVal(base.get(), property.get(), updatedValue);
    1988     if (generator.vm()->typeProfiler()) {
    1989         generator.emitProfileType(updatedValue, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    1990         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    1991     }
     1912    generator.emitProfileType(updatedValue, divotStart(), divotEnd());
    19921913
    19931914    return updatedValue;
     
    20812002    Variable var = generator.variable(m_ident);
    20822003    if (RegisterID* local = var.local())
    2083         generator.emitProfileType(local, ProfileTypeBytecodeHasGlobalID, nullptr);
     2004        generator.emitProfileType(local, var, position(), JSTextPosition(-1, position().offset + m_ident.length(), -1));
    20842005    else {
    20852006        RefPtr<RegisterID> scope = generator.emitResolveScope(nullptr, var);
    20862007        RefPtr<RegisterID> value = generator.emitGetFromScope(generator.newTemporary(), scope.get(), var, DoNotThrowIfNotFound);
    2087         generator.emitProfileType(value.get(), var.isResolved() ? ProfileTypeBytecodeGetFromLocalScope : ProfileTypeBytecodeGetFromScope, &m_ident);
    2088     }
    2089 
    2090     generator.emitTypeProfilerExpressionInfo(position(), JSTextPosition(-1, position().offset + m_ident.length(), -1));
     2008        generator.emitProfileType(value.get(), var, position(), JSTextPosition(-1, position().offset + m_ident.length(), -1));
     2009    }
    20912010
    20922011    return nullptr;
     
    21022021    if (RegisterID* local = var.local()) {
    21032022        generator.emitLoad(local, jsUndefined());
    2104         if (generator.vm()->typeProfiler())
    2105             generator.emitProfileType(local, ProfileTypeBytecodeHasGlobalID, nullptr);
     2023        generator.emitProfileType(local, var, position(), JSTextPosition(-1, position().offset + m_ident.length(), -1));
    21062024    } else {
    21072025        RefPtr<RegisterID> scope = generator.emitResolveScope(nullptr, var);
    21082026        RefPtr<RegisterID> value = generator.emitLoad(nullptr, jsUndefined());
    21092027        generator.emitPutToScope(scope.get(), var, value.get(), generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound);
    2110         if (generator.vm()->typeProfiler())
    2111             generator.emitProfileType(value.get(), var.isResolved() ? ProfileTypeBytecodeGetFromLocalScope : ProfileTypeBytecodeGetFromScope, &m_ident);
    2112     }
    2113     if (generator.vm()->typeProfiler())
    2114         generator.emitTypeProfilerExpressionInfo(position(), JSTextPosition(-1, position().offset + m_ident.length(), -1));
     2028        generator.emitProfileType(value.get(), var, position(), JSTextPosition(-1, position().offset + m_ident.length(), -1));
     2029    }
    21152030
    21162031    // It's safe to return null here because this node will always be a child node of DeclarationStatement which ignores our return value.
     
    23172232            generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
    23182233            generator.emitPutToScope(scope, var, propertyName, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound);
    2319             if (generator.vm()->typeProfiler())
    2320                 generator.emitProfileType(propertyName, var.isResolved() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &ident);
    23212234        }
    2322         if (generator.vm()->typeProfiler())
    2323             generator.emitTypeProfilerExpressionInfo(m_lexpr->position(), JSTextPosition(-1, m_lexpr->position().offset + ident.length(), -1));
     2235        generator.emitProfileType(propertyName, var, m_lexpr->position(), JSTextPosition(-1, m_lexpr->position().offset + ident.length(), -1));
    23242236        return;
    23252237    }
     
    23302242        generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart(), assignNode->divotEnd());
    23312243        generator.emitPutById(base, ident, propertyName);
    2332         if (generator.vm()->typeProfiler()) {
    2333             generator.emitProfileType(propertyName, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    2334             generator.emitTypeProfilerExpressionInfo(assignNode->divotStart(), assignNode->divotEnd());
    2335         }
     2244        generator.emitProfileType(propertyName, assignNode->divotStart(), assignNode->divotEnd());
    23362245        return;
    23372246    }
     
    23422251        generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart(), assignNode->divotEnd());
    23432252        generator.emitPutByVal(base.get(), subscript, propertyName);
    2344         if (generator.vm()->typeProfiler()) {
    2345             generator.emitProfileType(propertyName, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    2346             generator.emitTypeProfilerExpressionInfo(assignNode->divotStart(), assignNode->divotEnd());
    2347         }
     2253        generator.emitProfileType(propertyName, assignNode->divotStart(), assignNode->divotEnd());
    23482254        return;
    23492255    }
     
    23652271        }
    23662272        generator.emitMove(var.local(), propertyName);
    2367         if (generator.vm()->typeProfiler())
    2368             generator.emitTypeProfilerExpressionInfo(simpleBinding->divotStart(), simpleBinding->divotEnd());
     2273        generator.emitProfileType(propertyName, var, simpleBinding->divotStart(), simpleBinding->divotEnd());
    23692274        return;
    23702275    }
     
    25482453                generator.emitExpressionInfo(divot(), divotStart(), divotEnd());
    25492454                generator.emitPutToScope(scope, var, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound);
    2550                 if (generator.vm()->typeProfiler())
    2551                     generator.emitProfileType(value, var.isResolved() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &ident);
    25522455            }
    2553             if (generator.vm()->typeProfiler())
    2554                 generator.emitTypeProfilerExpressionInfo(m_lexpr->position(), JSTextPosition(-1, m_lexpr->position().offset + ident.length(), -1));
     2456            generator.emitProfileType(value, var, m_lexpr->position(), JSTextPosition(-1, m_lexpr->position().offset + ident.length(), -1));
    25552457        } else if (m_lexpr->isDotAccessorNode()) {
    25562458            DotAccessorNode* assignNode = static_cast<DotAccessorNode*>(m_lexpr);
     
    25602462            generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart(), assignNode->divotEnd());
    25612463            generator.emitPutById(base.get(), ident, value);
    2562             if (generator.vm()->typeProfiler()) {
    2563                 generator.emitProfileType(value, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    2564                 generator.emitTypeProfilerExpressionInfo(assignNode->divotStart(), assignNode->divotEnd());
    2565             }
     2464            generator.emitProfileType(value, assignNode->divotStart(), assignNode->divotEnd());
    25662465        } else if (m_lexpr->isBracketAccessorNode()) {
    25672466            BracketAccessorNode* assignNode = static_cast<BracketAccessorNode*>(m_lexpr);
     
    25712470            generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart(), assignNode->divotEnd());
    25722471            generator.emitPutByVal(base.get(), subscript, value);
    2573             if (generator.vm()->typeProfiler()) {
    2574                 generator.emitProfileType(value, ProfileTypeBytecodeDoesNotHaveGlobalID, nullptr);
    2575                 generator.emitTypeProfilerExpressionInfo(assignNode->divotStart(), assignNode->divotEnd());
    2576             }
     2472            generator.emitProfileType(value, assignNode->divotStart(), assignNode->divotEnd());
    25772473        } else {
    25782474            ASSERT(m_lexpr->isDestructuringNode());
     
    26572553
    26582554    RefPtr<RegisterID> returnRegister = m_value ? generator.emitNode(dst, m_value) : generator.emitLoad(dst, jsUndefined());
    2659     if (generator.vm()->typeProfiler()) {
    2660         generator.emitProfileType(returnRegister.get(), ProfileTypeBytecodeFunctionReturnStatement, nullptr);
    2661         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    2662     }
     2555    generator.emitProfileType(returnRegister.get(), ProfileTypeBytecodeFunctionReturnStatement, divotStart(), divotEnd());
    26632556    if (generator.labelScopeDepth()) {
    26642557        returnRegister = generator.emitMove(generator.newTemporary(), returnRegister.get());
     
    30202913    if (generator.vm()->typeProfiler()) {
    30212914        for (size_t i = 0; i < m_parameters->size(); i++) {
    3022             // FIXME: Handle Destructuring assignments into arguments.
     2915            // Destructuring parameters are handled in destructuring nodes.
    30232916            if (!m_parameters->at(i).first->isBindingNode())
    30242917                continue;
    30252918            BindingNode* parameter = static_cast<BindingNode*>(m_parameters->at(i).first);
    30262919            RegisterID reg(CallFrame::argumentOffset(i));
    3027             generator.emitProfileType(&reg, ProfileTypeBytecodeFunctionArgument, nullptr);
    3028             generator.emitTypeProfilerExpressionInfo(parameter->divotStart(), parameter->divotEnd());
     2920            generator.emitProfileType(&reg, ProfileTypeBytecodeFunctionArgument, parameter->divotStart(), parameter->divotEnd());
    30292921        }
    30302922    }
     
    30472939    if (!returnNode) {
    30482940        RegisterID* r0 = generator.isConstructor() ? generator.thisRegister() : generator.emitLoad(0, jsUndefined());
    3049         if (generator.vm()->typeProfiler())
    3050             generator.emitProfileType(r0, ProfileTypeBytecodeFunctionReturnStatement, nullptr); // Do not emit expression info for this profile because it's not in the user's source code.
     2941        generator.emitProfileType(r0, ProfileTypeBytecodeFunctionReturnStatement); // Do not emit expression info for this profile because it's not in the user's source code.
    30512942        ASSERT(startOffset() >= lineStartOffset());
    30522943        generator.emitDebugHook(WillLeaveCallFrame, lastLine(), startOffset(), lineStartOffset());
     
    33683259        }
    33693260        generator.emitMove(local, value);
    3370         if (generator.vm()->typeProfiler())
    3371             generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
     3261        generator.emitProfileType(local, var, divotStart(), divotEnd());
    33723262        if (m_bindingContext == AssignmentContext::DeclarationStatement || m_bindingContext == AssignmentContext::ConstDeclarationStatement)
    33733263            generator.liftTDZCheckIfPossible(var);
     
    33863276    }
    33873277    generator.emitPutToScope(scope, var, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound);
    3388     if (generator.vm()->typeProfiler()) {
    3389         generator.emitProfileType(value, var.isResolved() ? ProfileTypeBytecodePutToLocalScope : ProfileTypeBytecodePutToScope, &m_boundProperty);
    3390         generator.emitTypeProfilerExpressionInfo(divotStart(), divotEnd());
    3391     }
     3278    generator.emitProfileType(value, var, divotStart(), divotEnd());
    33923279    if (m_bindingContext == AssignmentContext::DeclarationStatement || m_bindingContext == AssignmentContext::ConstDeclarationStatement)
    33933280        generator.liftTDZCheckIfPossible(var);
Note: See TracChangeset for help on using the changeset viewer.