Changeset 33562

Show
Ignore:
Timestamp:
05/17/08 21:53:26 (6 months ago)
Author:
cwzwarich@webkit.org
Message:

2008-05-17 Cameron Zwarich <cwzwarich@uwaterloo.ca>

Reviewed by Oliver.

Bug 18991: SquirrelFish: Major codegen issue in a.b=expr, a[b]=expr
<https://bugs.webkit.org/show_bug.cgi?id=18991>

Fix the last remaining blocking cases of this bug.

JavaScriptCore:

  • kjs/grammar.y:
  • kjs/nodes.cpp: (KJS::ReadModifyResolveNode::emitCode):

LayoutTests:

  • fast/js/codegen-temporaries-expected.txt:
  • fast/js/resources/codegen-temporaries.js:
Location:
branches/squirrelfish
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • branches/squirrelfish/JavaScriptCore/ChangeLog

    r33560 r33562  
     12008-05-17  Cameron Zwarich  <cwzwarich@uwaterloo.ca> 
     2 
     3        Reviewed by Oliver. 
     4 
     5        Bug 18991: SquirrelFish: Major codegen issue in a.b=expr, a[b]=expr 
     6        <https://bugs.webkit.org/show_bug.cgi?id=18991> 
     7 
     8        Fix the last remaining blocking cases of this bug. 
     9 
     10        * kjs/grammar.y: 
     11        * kjs/nodes.cpp: 
     12        (KJS::ReadModifyResolveNode::emitCode): 
     13 
    1142008-05-17  Cameron Zwarich  <cwzwarich@uwaterloo.ca> 
    215 
  • branches/squirrelfish/JavaScriptCore/kjs/grammar.y

    r33552 r33562  
    424424PostfixExpr: 
    425425    LeftHandSideExpr 
    426   | LeftHandSideExpr PLUSPLUS           { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode($1.m_node, OpPlusPlus), $1.m_featureInfo); } 
    427   | LeftHandSideExpr MINUSMINUS         { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode($1.m_node, OpMinusMinus), $1.m_featureInfo); } 
     426  | LeftHandSideExpr PLUSPLUS           { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode($1.m_node, OpPlusPlus), $1.m_featureInfo | AssignFeature); } 
     427  | LeftHandSideExpr MINUSMINUS         { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode($1.m_node, OpMinusMinus), $1.m_featureInfo | AssignFeature); } 
    428428; 
    429429 
    430430PostfixExprNoBF: 
    431431    LeftHandSideExprNoBF 
    432   | LeftHandSideExprNoBF PLUSPLUS       { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode($1.m_node, OpPlusPlus), $1.m_featureInfo); } 
    433   | LeftHandSideExprNoBF MINUSMINUS     { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode($1.m_node, OpMinusMinus), $1.m_featureInfo); } 
     432  | LeftHandSideExprNoBF PLUSPLUS       { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode($1.m_node, OpPlusPlus), $1.m_featureInfo | AssignFeature); } 
     433  | LeftHandSideExprNoBF MINUSMINUS     { $$ = createNodeFeatureInfo<ExpressionNode*>(makePostfixNode($1.m_node, OpMinusMinus), $1.m_featureInfo | AssignFeature); } 
    434434; 
    435435 
  • branches/squirrelfish/JavaScriptCore/kjs/nodes.cpp

    r33560 r33562  
    41584158        } 
    41594159         
     4160        if (generator.leftHandSideNeedsCopy(m_rightHasAssignments) && !m_right.get()->isNumber()) { 
     4161            RefPtr<RegisterID> result = generator.newTemporary(); 
     4162            generator.emitMove(result.get(), local); 
     4163            RegisterID* src2 = generator.emitNode(m_right.get()); 
     4164            emitReadModifyAssignment(generator, result.get(), result.get(), src2, m_operator); 
     4165            generator.emitMove(local, result.get()); 
     4166            return generator.moveToDestinationIfNeeded(dst, result.get()); 
     4167        } 
     4168         
    41604169        RegisterID* src2 = generator.emitNode(m_right.get()); 
    41614170        RegisterID* result = emitReadModifyAssignment(generator, local, local, src2, m_operator); 
  • branches/squirrelfish/LayoutTests/ChangeLog

    r33552 r33562  
     12008-05-17  Cameron Zwarich  <cwzwarich@uwaterloo.ca> 
     2 
     3        Reviewed by Oliver. 
     4 
     5        Add more tests for: 
     6 
     7        Bug 18991: SquirrelFish: Major codegen issue in a.b=expr, a[b]=expr 
     8        <https://bugs.webkit.org/show_bug.cgi?id=18991> 
     9 
     10        * fast/js/codegen-temporaries-expected.txt: 
     11        * fast/js/resources/codegen-temporaries.js: 
     12 
    1132008-05-17  Cameron Zwarich  <cwzwarich@uwaterloo.ca> 
    214 
  • branches/squirrelfish/LayoutTests/fast/js/codegen-temporaries-expected.txt

    r33552 r33562  
    2222PASS assign_test15() is 'PASS' 
    2323PASS assign_test16() is 2 
     24PASS a17 is 3 
     25PASS assign_test18() is 3 
     26PASS a19.b is 3 
     27PASS assign_test20() is 3 
     28PASS a21['b'] is 3 
     29PASS assign_test22() is 3 
     30PASS assign_test23() is 3 
     31PASS assign_test24() is 3 
     32PASS assign_test25() is 3 
     33PASS assign_test26() is 3 
     34PASS assign_test27() is 3 
     35PASS assign_test28() is 3 
     36PASS assign_test29() is 3 
     37PASS assign_test30() is 'fooNaN' 
    2438PASS successfullyParsed is true 
    2539 
  • branches/squirrelfish/LayoutTests/fast/js/resources/codegen-temporaries.js

    r33552 r33562  
    166166shouldBe("assign_test16()", "2"); 
    167167 
     168var a17 = 1; 
     169a17 += (a17 += 1); 
     170 
     171shouldBe("a17", "3"); 
     172 
     173function assign_test18() 
     174{ 
     175    var a = 1; 
     176    a += (a += 1); 
     177    return a; 
     178} 
     179 
     180shouldBe("assign_test18()", "3"); 
     181 
     182var a19 = { b: 1 }; 
     183a19.b += (a19.b += 1); 
     184 
     185shouldBe("a19.b", "3"); 
     186 
     187function assign_test20() 
     188{ 
     189    var a = { b: 1 }; 
     190    a.b += (a.b += 1); 
     191    return a.b; 
     192} 
     193 
     194shouldBe("assign_test20()", "3"); 
     195 
     196var a21 = { b: 1 }; 
     197a21["b"] += (a21["b"] += 1); 
     198 
     199shouldBe("a21['b']", "3"); 
     200 
     201function assign_test22() 
     202{ 
     203    var a = { b: 1 }; 
     204    a["b"] += (a["b"] += 1); 
     205    return a["b"]; 
     206} 
     207 
     208shouldBe("assign_test22()", "3"); 
     209 
     210function assign_test23() 
     211{ 
     212    var o = { b: 1 }; 
     213    var a = o; 
     214    a.b += a = 2; 
     215    return o.b; 
     216} 
     217 
     218shouldBe("assign_test23()", "3"); 
     219 
     220function assign_test24() 
     221{ 
     222    var o = { b: 1 }; 
     223    var a = o; 
     224    a["b"] += a = 2; 
     225    return o["b"]; 
     226} 
     227 
     228shouldBe("assign_test24()", "3"); 
     229 
     230function assign_test25() 
     231{ 
     232    var o = { b: 1 }; 
     233    var a = o; 
     234    a[a = "b"] += a = 2; 
     235    return o["b"]; 
     236} 
     237 
     238shouldBe("assign_test25()", "3"); 
     239 
     240function assign_test26() 
     241{ 
     242    var o = { b: 1 }; 
     243    var a = o; 
     244    var b = "b"; 
     245    a[b] += a = 2; 
     246    return o["b"]; 
     247} 
     248 
     249shouldBe("assign_test26()", "3"); 
     250 
     251function assign_test27() 
     252{ 
     253    var o = { b: 1 }; 
     254    var a = o; 
     255    a.b += (a = 100, 2); 
     256    return o.b; 
     257} 
     258 
     259shouldBe("assign_test27()", "3"); 
     260 
     261function assign_test28() 
     262{ 
     263    var o = { b: 1 }; 
     264    var a = o; 
     265    a["b"] += (a = 100, 2); 
     266    return o["b"]; 
     267} 
     268 
     269shouldBe("assign_test28()", "3"); 
     270 
     271function assign_test29() 
     272{ 
     273    var o = { b: 1 }; 
     274    var a = o; 
     275    var b = "b"; 
     276    a[b] += (a = 100, 2); 
     277    return o["b"]; 
     278} 
     279 
     280shouldBe("assign_test29()", "3"); 
     281 
     282function assign_test30() 
     283{ 
     284    var a = "foo"; 
     285    a += (a++); 
     286    return a; 
     287} 
     288 
     289shouldBe("assign_test30()", "'fooNaN'"); 
     290 
    168291successfullyParsed = true;