Changeset 39961 in webkit for trunk/JavaScriptCore/parser


Ignore:
Timestamp:
Jan 15, 2009, 10:52:13 PM (16 years ago)
Author:
[email protected]
Message:

2009-01-15 Gavin Barraclough <[email protected]>

Reviewed by Oliver Hunt.

Add support in ResultType to track that the results of bitops
are always of type int32_t.

  • parser/Nodes.cpp: (JSC::ReadModifyResolveNode::emitBytecode): (JSC::ReadModifyDotNode::emitBytecode): (JSC::ReadModifyBracketNode::emitBytecode):
  • parser/Nodes.h: (JSC::ExpressionNode::): (JSC::BooleanNode::): (JSC::NumberNode::): (JSC::StringNode::): (JSC::PrePostResolveNode::): (JSC::TypeOfResolveNode::): (JSC::TypeOfValueNode::): (JSC::UnaryPlusNode::): (JSC::NegateNode::): (JSC::BitwiseNotNode::): (JSC::LogicalNotNode::): (JSC::MultNode::): (JSC::DivNode::): (JSC::ModNode::): (JSC::SubNode::): (JSC::LeftShiftNode::): (JSC::RightShiftNode::): (JSC::UnsignedRightShiftNode::): (JSC::LessNode::): (JSC::GreaterNode::): (JSC::LessEqNode::): (JSC::GreaterEqNode::): (JSC::InstanceOfNode::): (JSC::EqualNode::): (JSC::NotEqualNode::): (JSC::StrictEqualNode::): (JSC::NotStrictEqualNode::): (JSC::BitAndNode::): (JSC::BitOrNode::): (JSC::BitXOrNode::): (JSC::LogicalOpNode::):
  • parser/ResultType.h: (JSC::ResultType::isInt32): (JSC::ResultType::isNotNumber): (JSC::ResultType::booleanType): (JSC::ResultType::numberType): (JSC::ResultType::numberTypeCanReuse): (JSC::ResultType::numberTypeCanReuseIsInt32): (JSC::ResultType::stringOrNumberTypeCanReuse): (JSC::ResultType::stringType): (JSC::ResultType::unknownType): (JSC::ResultType::forAdd): (JSC::ResultType::forBitOp): (JSC::OperandTypes::OperandTypes):
Location:
trunk/JavaScriptCore/parser
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/parser/Nodes.cpp

    r39910 r39961  
    13011301        if (generator.isLocalConstant(m_ident)) {
    13021302            RegisterID* src2 = generator.emitNode(m_right.get());
    1303             return emitReadModifyAssignment(generator, generator.finalDestination(dst), local, src2, m_operator, OperandTypes(ResultType::unknown(), m_right->resultDescriptor()));
     1303            return emitReadModifyAssignment(generator, generator.finalDestination(dst), local, src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));
    13041304        }
    13051305       
     
    13081308            generator.emitMove(result.get(), local);
    13091309            RegisterID* src2 = generator.emitNode(m_right.get());
    1310             emitReadModifyAssignment(generator, result.get(), result.get(), src2, m_operator, OperandTypes(ResultType::unknown(), m_right->resultDescriptor()));
     1310            emitReadModifyAssignment(generator, result.get(), result.get(), src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));
    13111311            generator.emitMove(local, result.get());
    13121312            return generator.moveToDestinationIfNeeded(dst, result.get());
     
    13141314       
    13151315        RegisterID* src2 = generator.emitNode(m_right.get());
    1316         RegisterID* result = emitReadModifyAssignment(generator, local, local, src2, m_operator, OperandTypes(ResultType::unknown(), m_right->resultDescriptor()));
     1316        RegisterID* result = emitReadModifyAssignment(generator, local, local, src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));
    13171317        return generator.moveToDestinationIfNeeded(dst, result);
    13181318    }
     
    13241324        RefPtr<RegisterID> src1 = generator.emitGetScopedVar(generator.tempDestination(dst), depth, index, globalObject);
    13251325        RegisterID* src2 = generator.emitNode(m_right.get());
    1326         RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), src2, m_operator, OperandTypes(ResultType::unknown(), m_right->resultDescriptor()));
     1326        RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));
    13271327        generator.emitPutScopedVar(depth, index, result, globalObject);
    13281328        return result;
     
    13341334    RegisterID* src2 = generator.emitNode(m_right.get());
    13351335    generator.emitExpressionInfo(divot(), startOffset(), endOffset());
    1336     RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), src2, m_operator, OperandTypes(ResultType::unknown(), m_right->resultDescriptor()));
     1336    RegisterID* result = emitReadModifyAssignment(generator, generator.finalDestination(dst, src1.get()), src1.get(), src2, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));
    13371337    return generator.emitPutById(base.get(), m_ident, result);
    13381338}
     
    14221422    RefPtr<RegisterID> value = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident);
    14231423    RegisterID* change = generator.emitNode(m_right.get());
    1424     RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), change, m_operator, OperandTypes(ResultType::unknown(), m_right->resultDescriptor()));
     1424    RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), change, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));
    14251425
    14261426    generator.emitExpressionInfo(divot(), startOffset(), endOffset());
     
    14941494    RefPtr<RegisterID> value = generator.emitGetByVal(generator.tempDestination(dst), base.get(), property.get());
    14951495    RegisterID* change = generator.emitNode(m_right.get());
    1496     RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), change, m_operator, OperandTypes(ResultType::unknown(), m_right->resultDescriptor()));
     1496    RegisterID* updatedValue = emitReadModifyAssignment(generator, generator.finalDestination(dst, value.get()), value.get(), change, m_operator, OperandTypes(ResultType::unknownType(), m_right->resultDescriptor()));
    14971497
    14981498    generator.emitExpressionInfo(divot(), startOffset(), endOffset());
  • trunk/JavaScriptCore/parser/Nodes.h

    r39951 r39961  
    157157    class ExpressionNode : public Node {
    158158    public:
    159         ExpressionNode(JSGlobalData* globalData, ResultType resultDesc = ResultType::unknown()) JSC_FAST_CALL
     159        ExpressionNode(JSGlobalData* globalData, ResultType resultDesc = ResultType::unknownType()) JSC_FAST_CALL
    160160            : Node(globalData)
    161161            , m_resultDesc(resultDesc)
     
    217217    public:
    218218        BooleanNode(JSGlobalData* globalData, bool value) JSC_FAST_CALL
    219             : ExpressionNode(globalData, ResultType::boolean())
     219            : ExpressionNode(globalData, ResultType::booleanType())
    220220            , m_value(value)
    221221        {
     
    233233    public:
    234234        NumberNode(JSGlobalData* globalData, double v) JSC_FAST_CALL
    235             : ExpressionNode(globalData, ResultType::constNumber())
     235            : ExpressionNode(globalData, ResultType::numberType())
    236236            , m_double(v)
    237237        {
     
    252252    public:
    253253        StringNode(JSGlobalData* globalData, const Identifier& v) JSC_FAST_CALL
    254             : ExpressionNode(globalData, ResultType::string())
     254            : ExpressionNode(globalData, ResultType::stringType())
    255255            , m_value(v)
    256256        {
     
    774774    public:
    775775        PrePostResolveNode(JSGlobalData* globalData, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL
    776             : ExpressionNode(globalData, ResultType::constNumber()) // could be reusable for pre?
     776            : ExpressionNode(globalData, ResultType::numberType()) // could be reusable for pre?
    777777            , ThrowableExpressionData(divot, startOffset, endOffset)
    778778            , m_ident(ident)
     
    954954    public:
    955955        TypeOfResolveNode(JSGlobalData* globalData, const Identifier& ident) JSC_FAST_CALL
    956             : ExpressionNode(globalData, ResultType::string())
     956            : ExpressionNode(globalData, ResultType::stringType())
    957957            , m_ident(ident)
    958958        {
     
    970970    public:
    971971        TypeOfValueNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL
    972             : ExpressionNode(globalData, ResultType::string())
     972            : ExpressionNode(globalData, ResultType::stringType())
    973973            , m_expr(expr)
    974974        {
     
    10891089    public:
    10901090        UnaryPlusNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL
    1091             : UnaryOpNode(globalData, ResultType::constNumber(), expr)
     1091            : UnaryOpNode(globalData, ResultType::numberType(), expr)
    10921092        {
    10931093        }
     
    11011101    public:
    11021102        NegateNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL
    1103             : UnaryOpNode(globalData, ResultType::reusableNumber(), expr)
     1103            : UnaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr)
    11041104        {
    11051105        }
     
    11111111    public:
    11121112        BitwiseNotNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL
    1113             : UnaryOpNode(globalData, ResultType::reusableNumber(), expr)
     1113            : UnaryOpNode(globalData, ResultType::forBitOp(), expr)
    11141114        {
    11151115        }
     
    11211121    public:
    11221122        LogicalNotNode(JSGlobalData* globalData, ExpressionNode* expr) JSC_FAST_CALL
    1123             : UnaryOpNode(globalData, ResultType::boolean(), expr)
     1123            : UnaryOpNode(globalData, ResultType::booleanType(), expr)
    11241124        {
    11251125        }
     
    11761176    public:
    11771177        MultNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1178             : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
     1178            : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, rightHasAssignments)
    11791179        {
    11801180        }
     
    11861186    public:
    11871187        DivNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1188             : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
     1188            : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, rightHasAssignments)
    11891189        {
    11901190        }
     
    11961196    public:
    11971197        ModNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1198             : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
     1198            : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, rightHasAssignments)
    11991199        {
    12001200        }
     
    12161216    public:
    12171217        SubNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1218             : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
     1218            : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, rightHasAssignments)
    12191219        {
    12201220        }
     
    12261226    public:
    12271227        LeftShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1228             : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
     1228            : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, rightHasAssignments)
    12291229        {
    12301230        }
     
    12361236    public:
    12371237        RightShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1238             : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
     1238            : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, rightHasAssignments)
    12391239        {
    12401240        }
     
    12461246    public:
    12471247        UnsignedRightShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1248             : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
     1248            : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, rightHasAssignments)
    12491249        {
    12501250        }
     
    12561256    public:
    12571257        LessNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1258             : BinaryOpNode(globalData, ResultType::boolean(), expr1, expr2, rightHasAssignments)
     1258            : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments)
    12591259        {
    12601260        }
     
    12661266    public:
    12671267        GreaterNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1268             : ReverseBinaryOpNode(globalData, ResultType::boolean(), expr1, expr2, rightHasAssignments)
     1268            : ReverseBinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments)
    12691269        {
    12701270        }
     
    12761276    public:
    12771277        LessEqNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1278             : BinaryOpNode(globalData, ResultType::boolean(), expr1, expr2, rightHasAssignments)
     1278            : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments)
    12791279        {
    12801280        }
     
    12861286    public:
    12871287        GreaterEqNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1288             : ReverseBinaryOpNode(globalData, ResultType::boolean(), expr1, expr2, rightHasAssignments)
     1288            : ReverseBinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments)
    12891289        {
    12901290        }
     
    13091309    public:
    13101310        InstanceOfNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1311             : ThrowableBinaryOpNode(globalData, ResultType::boolean(), expr1, expr2, rightHasAssignments)
     1311            : ThrowableBinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments)
    13121312        {
    13131313        }
     
    13311331    public:
    13321332        EqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1333             : BinaryOpNode(globalData, ResultType::boolean(), expr1, expr2, rightHasAssignments)
     1333            : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments)
    13341334        {
    13351335        }
     
    13421342    public:
    13431343        NotEqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1344             : BinaryOpNode(globalData, ResultType::boolean(), expr1, expr2, rightHasAssignments)
     1344            : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments)
    13451345        {
    13461346        }
     
    13521352    public:
    13531353        StrictEqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1354             : BinaryOpNode(globalData, ResultType::boolean(), expr1, expr2, rightHasAssignments)
     1354            : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments)
    13551355        {
    13561356        }
     
    13631363    public:
    13641364        NotStrictEqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1365             : BinaryOpNode(globalData, ResultType::boolean(), expr1, expr2, rightHasAssignments)
     1365            : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments)
    13661366        {
    13671367        }
     
    13731373    public:
    13741374        BitAndNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1375             : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
     1375            : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, rightHasAssignments)
    13761376        {
    13771377        }
     
    13831383    public:
    13841384        BitOrNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1385             : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
     1385            : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, rightHasAssignments)
    13861386        {
    13871387        }
     
    13931393    public:
    13941394        BitXOrNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL
    1395             : BinaryOpNode(globalData, ResultType::reusableNumber(), expr1, expr2, rightHasAssignments)
     1395            : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, rightHasAssignments)
    13961396        {
    13971397        }
     
    14061406    public:
    14071407        LogicalOpNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator oper) JSC_FAST_CALL
    1408             : ExpressionNode(globalData, ResultType::boolean())
     1408            : ExpressionNode(globalData, ResultType::booleanType())
    14091409            , m_expr1(expr1)
    14101410            , m_expr2(expr2)
  • trunk/JavaScriptCore/parser/ResultType.h

    r38917 r39961  
    3434        typedef char Type;
    3535        static const Type TypeReusable = 1;
     36        static const Type TypeInt32    = 2;
    3637       
    37         static const Type TypeMaybeNumber = 2;
    38         static const Type TypeMaybeString = 4;
    39         static const Type TypeMaybeNull = 8;
    40         static const Type TypeMaybeBool = 16;
    41         static const Type TypeMaybeOther = 32;
     38        static const Type TypeMaybeNumber = 0x04;
     39        static const Type TypeMaybeString = 0x08;
     40        static const Type TypeMaybeNull   = 0x10;
     41        static const Type TypeMaybeBool   = 0x20;
     42        static const Type TypeMaybeOther  = 0x40;
    4243
    43         static const Type TypeReusableNumber = 3;
    44         static const Type TypeStringOrReusableNumber = 4;
    45    
    4644        explicit ResultType(Type type)
    4745            : m_type(type)
     
    5452        }
    5553
     54        bool isInt32()
     55        {
     56            return (m_type & TypeInt32);
     57        }
     58
    5659        bool definitelyIsNumber()
    5760        {
     
    6164        bool isNotNumber()
    6265        {
    63             return ((m_type & TypeMaybeNumber) == 0);
     66            return !(m_type & TypeMaybeNumber);
    6467        }
    6568       
     
    7477        }
    7578       
    76         static ResultType boolean()
     79        static ResultType booleanType()
    7780        {
    7881            return ResultType(TypeMaybeBool);
    7982        }
    8083       
    81         static ResultType constNumber()
     84        static ResultType numberType()
    8285        {
    8386            return ResultType(TypeMaybeNumber);
    8487        }
    8588       
    86         static ResultType reusableNumber()
     89        static ResultType numberTypeCanReuse()
    8790        {
    8891            return ResultType(TypeReusable | TypeMaybeNumber);
    8992        }
    9093       
    91         static ResultType reusableNumberOrString()
     94        static ResultType numberTypeCanReuseIsInt32()
     95        {
     96            return ResultType(TypeReusable | TypeInt32 | TypeMaybeNumber);
     97        }
     98       
     99        static ResultType stringOrNumberTypeCanReuse()
    92100        {
    93101            return ResultType(TypeReusable | TypeMaybeNumber | TypeMaybeString);
    94102        }
    95103       
    96         static ResultType string()
     104        static ResultType stringType()
    97105        {
    98106            return ResultType(TypeMaybeString);
    99107        }
    100108       
    101         static ResultType unknown()
     109        static ResultType unknownType()
    102110        {
    103111            return ResultType(TypeMaybeNumber | TypeMaybeString | TypeMaybeNull | TypeMaybeBool | TypeMaybeOther);
     
    107115        {
    108116            if (op1.definitelyIsNumber() && op2.definitelyIsNumber())
    109                 return reusableNumber();
     117                return numberTypeCanReuse();
    110118            if (op1.isNotNumber() || op2.isNotNumber())
    111                 return string();
    112             return reusableNumberOrString();
     119                return stringType();
     120            return stringOrNumberTypeCanReuse();
     121        }
     122       
     123        static ResultType forBitOp()
     124        {
     125            return numberTypeCanReuseIsInt32();
    113126        }
    114127
     
    119132    struct OperandTypes
    120133    {
    121         OperandTypes(ResultType first = ResultType::unknown(), ResultType second = ResultType::unknown())
     134        OperandTypes(ResultType first = ResultType::unknownType(), ResultType second = ResultType::unknownType())
    122135        {
    123136            m_u.rds.first = first.m_type;
Note: See TracChangeset for help on using the changeset viewer.