Changeset 33296

Show
Ignore:
Timestamp:
05/12/08 23:02:03 (6 months ago)
Author:
mrowe@apple.com
Message:

2008-04-26 Maciej Stachowiak <mjs@apple.com>

Reviewed by Oliver.

  • document all property getting, setting and deleting opcodes

(And fix function parameter names to match corresponding opcode parameter names.)

  • VM/CodeGenerator.cpp: (KJS::CodeGenerator::emitResolve): (KJS::CodeGenerator::emitResolveBase): (KJS::CodeGenerator::emitResolveBaseAndProperty): (KJS::CodeGenerator::emitResolveBaseAndFunc): (KJS::CodeGenerator::emitGetPropId): (KJS::CodeGenerator::emitPutPropId): (KJS::CodeGenerator::emitDeletePropId): (KJS::CodeGenerator::emitPutPropVal):
  • VM/CodeGenerator.h:
  • VM/Machine.cpp: (KJS::resolve): (KJS::resolveBase): (KJS::resolveBaseAndProperty): (KJS::resolveBaseAndFunc): (KJS::Machine::privateExecute):
  • kjs/nodes.cpp: (KJS::ResolveNode::emitCode): (KJS::ArrayNode::emitCode): (KJS::PropertyListNode::emitCode): (KJS::BracketAccessorNode::emitCode): (KJS::EvalFunctionCallNode::emitCode): (KJS::FunctionCallResolveNode::emitCode): (KJS::FunctionCallBracketNode::emitCode): (KJS::PostIncResolveNode::emitCode): (KJS::PostDecResolveNode::emitCode): (KJS::PostIncBracketNode::emitCode): (KJS::PostDecBracketNode::emitCode): (KJS::PostIncDotNode::emitCode): (KJS::PostDecDotNode::emitCode): (KJS::DeleteResolveNode::emitCode): (KJS::TypeOfResolveNode::emitCode): (KJS::PreIncResolveNode::emitCode): (KJS::PreDecResolveNode::emitCode): (KJS::PreIncBracketNode::emitCode): (KJS::PreDecBracketNode::emitCode): (KJS::AssignResolveNode::emitCode): (KJS::AssignDotNode::emitCode): (KJS::ReadModifyDotNode::emitCode): (KJS::AssignBracketNode::emitCode): (KJS::ReadModifyBracketNode::emitCode): (KJS::ConstDeclNode::emitCodeSingle):
Location:
branches/squirrelfish/JavaScriptCore
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • branches/squirrelfish/JavaScriptCore/ChangeLog

    r33295 r33296  
     12008-04-26  Maciej Stachowiak  <mjs@apple.com> 
     2 
     3        Reviewed by Oliver. 
     4         
     5        - document all property getting, setting and deleting opcodes 
     6         
     7        (And fix function parameter names to match corresponding opcode parameter names.) 
     8 
     9        * VM/CodeGenerator.cpp: 
     10        (KJS::CodeGenerator::emitResolve): 
     11        (KJS::CodeGenerator::emitResolveBase): 
     12        (KJS::CodeGenerator::emitResolveBaseAndProperty): 
     13        (KJS::CodeGenerator::emitResolveBaseAndFunc): 
     14        (KJS::CodeGenerator::emitGetPropId): 
     15        (KJS::CodeGenerator::emitPutPropId): 
     16        (KJS::CodeGenerator::emitDeletePropId): 
     17        (KJS::CodeGenerator::emitPutPropVal): 
     18        * VM/CodeGenerator.h: 
     19        * VM/Machine.cpp: 
     20        (KJS::resolve): 
     21        (KJS::resolveBase): 
     22        (KJS::resolveBaseAndProperty): 
     23        (KJS::resolveBaseAndFunc): 
     24        (KJS::Machine::privateExecute): 
     25        * kjs/nodes.cpp: 
     26        (KJS::ResolveNode::emitCode): 
     27        (KJS::ArrayNode::emitCode): 
     28        (KJS::PropertyListNode::emitCode): 
     29        (KJS::BracketAccessorNode::emitCode): 
     30        (KJS::EvalFunctionCallNode::emitCode): 
     31        (KJS::FunctionCallResolveNode::emitCode): 
     32        (KJS::FunctionCallBracketNode::emitCode): 
     33        (KJS::PostIncResolveNode::emitCode): 
     34        (KJS::PostDecResolveNode::emitCode): 
     35        (KJS::PostIncBracketNode::emitCode): 
     36        (KJS::PostDecBracketNode::emitCode): 
     37        (KJS::PostIncDotNode::emitCode): 
     38        (KJS::PostDecDotNode::emitCode): 
     39        (KJS::DeleteResolveNode::emitCode): 
     40        (KJS::TypeOfResolveNode::emitCode): 
     41        (KJS::PreIncResolveNode::emitCode): 
     42        (KJS::PreDecResolveNode::emitCode): 
     43        (KJS::PreIncBracketNode::emitCode): 
     44        (KJS::PreDecBracketNode::emitCode): 
     45        (KJS::AssignResolveNode::emitCode): 
     46        (KJS::AssignDotNode::emitCode): 
     47        (KJS::ReadModifyDotNode::emitCode): 
     48        (KJS::AssignBracketNode::emitCode): 
     49        (KJS::ReadModifyBracketNode::emitCode): 
     50        (KJS::ConstDeclNode::emitCodeSingle): 
     51 
    1522008-04-26  Oliver Hunt  <oliver@apple.com> 
    253 
  • branches/squirrelfish/JavaScriptCore/VM/CodeGenerator.cpp

    r33274 r33296  
    689689} 
    690690 
    691 RegisterID* CodeGenerator::emitResolve(RegisterID* r0, const Identifier& ident) 
     691RegisterID* CodeGenerator::emitResolve(RegisterID* dst, const Identifier& property) 
    692692{ 
    693693    instructions().append(machine().getOpcode(op_resolve)); 
    694     instructions().append(r0->index()); 
    695     instructions().append(addConstant(ident)); 
    696     return r0; 
    697 } 
    698  
    699 RegisterID* CodeGenerator::emitResolveBase(RegisterID* r0, const Identifier& ident) 
     694    instructions().append(dst->index()); 
     695    instructions().append(addConstant(property)); 
     696    return dst; 
     697} 
     698 
     699RegisterID* CodeGenerator::emitResolveBase(RegisterID* dst, const Identifier& property) 
    700700{ 
    701701    instructions().append(machine().getOpcode(op_resolve_base)); 
    702     instructions().append(r0->index()); 
    703     instructions().append(addConstant(ident)); 
    704     return r0; 
    705 } 
    706      
    707 RegisterID* CodeGenerator::emitResolveBaseAndProperty(RegisterID* r0, RegisterID* r1, const Identifier& ident) 
     702    instructions().append(dst->index()); 
     703    instructions().append(addConstant(property)); 
     704    return dst; 
     705} 
     706     
     707RegisterID* CodeGenerator::emitResolveBaseAndProperty(RegisterID* baseDst, RegisterID* propDst, const Identifier& property) 
    708708{ 
    709709    instructions().append(machine().getOpcode(op_resolve_base_and_property)); 
    710     instructions().append(r0->index()); 
    711     instructions().append(r1->index()); 
    712     instructions().append(addConstant(ident)); 
    713     return r0; 
    714 } 
    715  
    716 RegisterID* CodeGenerator::emitResolveBaseAndFunc(RegisterID* r0, RegisterID* r1, const Identifier& ident) 
     710    instructions().append(baseDst->index()); 
     711    instructions().append(propDst->index()); 
     712    instructions().append(addConstant(property)); 
     713    return baseDst; 
     714} 
     715 
     716RegisterID* CodeGenerator::emitResolveBaseAndFunc(RegisterID* baseDst, RegisterID* funcDst, const Identifier& property) 
    717717{ 
    718718    instructions().append(machine().getOpcode(op_resolve_base_and_func)); 
    719     instructions().append(r0->index()); 
    720     instructions().append(r1->index()); 
    721     instructions().append(addConstant(ident)); 
    722     return r0; 
    723 } 
    724  
    725 RegisterID* CodeGenerator::emitGetPropId(RegisterID* dst, RegisterID* base, const Identifier& ident) 
     719    instructions().append(baseDst->index()); 
     720    instructions().append(funcDst->index()); 
     721    instructions().append(addConstant(property)); 
     722    return baseDst; 
     723} 
     724 
     725RegisterID* CodeGenerator::emitGetPropId(RegisterID* dst, RegisterID* base, const Identifier& property) 
    726726{ 
    727727    instructions().append(machine().getOpcode(op_get_prop_id)); 
    728728    instructions().append(dst->index()); 
    729729    instructions().append(base->index()); 
    730     instructions().append(addConstant(ident)); 
    731     return dst; 
    732 } 
    733  
    734 RegisterID* CodeGenerator::emitPutPropId(RegisterID* base, const Identifier& ident, RegisterID* val) 
     730    instructions().append(addConstant(property)); 
     731    return dst; 
     732} 
     733 
     734RegisterID* CodeGenerator::emitPutPropId(RegisterID* base, const Identifier& property, RegisterID* value) 
    735735{ 
    736736    instructions().append(machine().getOpcode(op_put_prop_id)); 
    737737    instructions().append(base->index()); 
    738     instructions().append(addConstant(ident)); 
    739     instructions().append(val->index()); 
    740     return val; 
    741 } 
    742  
    743 RegisterID* CodeGenerator::emitDeletePropId(RegisterID* dst, RegisterID* base, const Identifier& ident) 
     738    instructions().append(addConstant(property)); 
     739    instructions().append(value->index()); 
     740    return value; 
     741} 
     742 
     743RegisterID* CodeGenerator::emitDeletePropId(RegisterID* dst, RegisterID* base, const Identifier& property) 
    744744{ 
    745745    instructions().append(machine().getOpcode(op_delete_prop_id)); 
    746746    instructions().append(dst->index()); 
    747747    instructions().append(base->index()); 
    748     instructions().append(addConstant(ident)); 
     748    instructions().append(addConstant(property)); 
    749749    return dst; 
    750750} 
     
    759759} 
    760760 
    761 RegisterID* CodeGenerator::emitPutPropVal(RegisterID* base, RegisterID* property, RegisterID* val) 
     761RegisterID* CodeGenerator::emitPutPropVal(RegisterID* base, RegisterID* property, RegisterID* value) 
    762762{ 
    763763    instructions().append(machine().getOpcode(op_put_prop_val)); 
    764764    instructions().append(base->index()); 
    765765    instructions().append(property->index()); 
    766     instructions().append(val->index()); 
    767     return val; 
     766    instructions().append(value->index()); 
     767    return value; 
    768768} 
    769769 
  • branches/squirrelfish/JavaScriptCore/VM/CodeGenerator.h

    r33269 r33296  
    189189        RegisterID* emitIn(RegisterID*, RegisterID*, RegisterID*); 
    190190 
    191         RegisterID* emitResolve(RegisterID*, const Identifier&); 
    192         RegisterID* emitResolve(RegisterID*, int); 
    193         RegisterID* emitResolve(RegisterID*, int, int); 
    194  
    195         RegisterID* emitResolveBase(RegisterID*, const Identifier&); 
    196         RegisterID* emitResolveBase(RegisterID*, int); 
    197         RegisterID* emitResolveBase(RegisterID*, int, int); 
    198         RegisterID* emitResolveBaseAndProperty(RegisterID*, RegisterID*, const Identifier&); 
    199         RegisterID* emitResolveBaseAndFunc(RegisterID*, RegisterID*, const Identifier&); 
     191        RegisterID* emitResolve(RegisterID* dst, const Identifier& property); 
     192 
     193        RegisterID* emitResolveBase(RegisterID* dst, const Identifier& property); 
     194        RegisterID* emitResolveBaseAndProperty(RegisterID* baseDst, RegisterID* propDst, const Identifier& property); 
     195        RegisterID* emitResolveBaseAndFunc(RegisterID* baseDst, RegisterID* funcDst, const Identifier& property); 
    200196         
    201197        RegisterID* emitGetPropId(RegisterID* dst, RegisterID* base, const Identifier& property); 
    202         RegisterID* emitPutPropId(RegisterID* base, const Identifier&, RegisterID* val); 
     198        RegisterID* emitPutPropId(RegisterID* base, const Identifier& property, RegisterID* value); 
    203199        RegisterID* emitDeletePropId(RegisterID* dst, RegisterID* base, const Identifier&); 
    204200        RegisterID* emitGetPropVal(RegisterID* dst, RegisterID* base, RegisterID* property); 
    205         RegisterID* emitPutPropVal(RegisterID* base, RegisterID* property, RegisterID* val); 
     201        RegisterID* emitPutPropVal(RegisterID* base, RegisterID* property, RegisterID* value); 
    206202        RegisterID* emitDeletePropVal(RegisterID* dst, RegisterID* base, RegisterID* property); 
    207         RegisterID* emitPutPropIndex(RegisterID* base, unsigned index, RegisterID* val); 
     203        RegisterID* emitPutPropIndex(RegisterID* base, unsigned index, RegisterID* value); 
    208204 
    209205        RegisterID* emitCall(RegisterID*, RegisterID*, RegisterID*, ArgumentsNode*); 
  • branches/squirrelfish/JavaScriptCore/VM/Machine.cpp

    r33295 r33296  
    258258static bool NEVER_INLINE resolve(ExecState* exec, Instruction* vPC, Register* r, ScopeChainNode* scopeChain, CodeBlock* codeBlock, JSValue*& exceptionValue) 
    259259{ 
    260     int r0 = (vPC + 1)->u.operand; 
    261     int id0 = (vPC + 2)->u.operand; 
     260    int dst = (vPC + 1)->u.operand; 
     261    int property = (vPC + 2)->u.operand; 
    262262 
    263263    ScopeChainIterator iter = scopeChain->begin(); 
     
    266266 
    267267    PropertySlot slot; 
    268     Identifier& ident = codeBlock->identifiers[id0]; 
     268    Identifier& ident = codeBlock->identifiers[property]; 
    269269    do { 
    270270        JSObject* o = *iter; 
    271271        if (o->getPropertySlot(exec, ident, slot)) { 
    272             r[r0].u.jsValue = slot.getValue(exec, o, ident); 
     272            r[dst].u.jsValue = slot.getValue(exec, o, ident); 
    273273            return true; 
    274274        } 
     
    280280static void NEVER_INLINE resolveBase(ExecState* exec, Instruction* vPC, Register* r, ScopeChainNode* scopeChain, CodeBlock* codeBlock) 
    281281{ 
    282     int r0 = (vPC + 1)->u.operand; 
    283     int id0 = (vPC + 2)->u.operand; 
     282    int dst = (vPC + 1)->u.operand; 
     283    int property = (vPC + 2)->u.operand; 
    284284 
    285285    ScopeChainIterator iter = scopeChain->begin(); 
     
    288288 
    289289    PropertySlot slot; 
    290     Identifier& ident = codeBlock->identifiers[id0]; 
     290    Identifier& ident = codeBlock->identifiers[property]; 
    291291    JSObject* base; 
    292292    do { 
    293293        base = *iter; 
    294294        if (base->getPropertySlot(exec, ident, slot)) { 
    295             r[r0].u.jsValue = base; 
     295            r[dst].u.jsValue = base; 
    296296            return; 
    297297        } 
    298298    } while (++iter != end); 
    299299 
    300     r[r0].u.jsValue = base; 
     300    r[dst].u.jsValue = base; 
    301301} 
    302302 
    303303static bool NEVER_INLINE resolveBaseAndProperty(ExecState* exec, Instruction* vPC, Register* r, ScopeChainNode* scopeChain, CodeBlock* codeBlock, JSValue*& exceptionValue) 
    304304{ 
    305     int r0 = (vPC + 1)->u.operand; 
    306     int r1 = (vPC + 2)->u.operand; 
    307     int id0 = (vPC + 3)->u.operand; 
     305    int baseDst = (vPC + 1)->u.operand; 
     306    int propDst = (vPC + 2)->u.operand; 
     307    int property = (vPC + 3)->u.operand; 
    308308     
    309309    ScopeChainIterator iter = scopeChain->begin(); 
     
    315315     
    316316    PropertySlot slot; 
    317     Identifier& ident = codeBlock->identifiers[id0]; 
     317    Identifier& ident = codeBlock->identifiers[property]; 
    318318    JSObject* base; 
    319319    do { 
    320320        base = *iter; 
    321321        if (base->getPropertySlot(exec, ident, slot)) {             
    322             r[r0].u.jsValue = base; 
    323             r[r1].u.jsValue = slot.getValue(exec, base, ident); 
     322            r[baseDst].u.jsValue = base; 
     323            r[propDst].u.jsValue = slot.getValue(exec, base, ident); 
    324324            return true; 
    325325        } 
     
    333333static bool NEVER_INLINE resolveBaseAndFunc(ExecState* exec, Instruction* vPC, Register* r, ScopeChainNode* scopeChain, CodeBlock* codeBlock, JSValue*& exceptionValue) 
    334334{ 
    335     int r0 = (vPC + 1)->u.operand; 
    336     int r1 = (vPC + 2)->u.operand; 
    337     int id0 = (vPC + 3)->u.operand; 
     335    int baseDst = (vPC + 1)->u.operand; 
     336    int funcDst = (vPC + 2)->u.operand; 
     337    int property = (vPC + 3)->u.operand; 
    338338 
    339339    ScopeChainIterator iter = scopeChain->begin(); 
     
    345345     
    346346    PropertySlot slot; 
    347     Identifier& ident = codeBlock->identifiers[id0]; 
     347    Identifier& ident = codeBlock->identifiers[property]; 
    348348    JSObject* base; 
    349349    do { 
     
    359359            JSObject* thisObj = base->toThisObject(exec); 
    360360             
    361             r[r0].u.jsValue = thisObj; 
    362             r[r1].u.jsValue = slot.getValue(exec, base, ident); 
     361            r[baseDst].u.jsValue = thisObj; 
     362            r[funcDst].u.jsValue = slot.getValue(exec, base, ident); 
    363363            return true; 
    364364        } 
     
    11101110    } 
    11111111    BEGIN_OPCODE(op_resolve) { 
     1112        /* resolve dst(r) property(id) 
     1113 
     1114           Looks up the property named by identifier property in the 
     1115           scope chain, and writes the resulting value to register 
     1116           dst. If the property is not found, raises an exception. 
     1117        */ 
     1118 
    11121119        if (UNLIKELY(!resolve(exec, vPC, r, scopeChain, codeBlock, exceptionValue))) 
    11131120            goto vm_throw; 
     
    11181125    } 
    11191126    BEGIN_OPCODE(op_resolve_base) { 
     1127        /* resolve_base dst(r) property(id) 
     1128 
     1129           Searches the scope chain for an object containing 
     1130           identifier property, and if one is found, writes it to 
     1131           register dst. If none is found, the outermost scope (which 
     1132           will be the global object) is stored in register dst. 
     1133        */ 
    11201134        resolveBase(exec, vPC, r, scopeChain, codeBlock); 
    11211135        vPC += 3; 
     
    11241138    } 
    11251139    BEGIN_OPCODE(op_resolve_base_and_property) { 
     1140        /* resolve_base_and_property baseDst(r) propDst(r) property(id) 
     1141 
     1142           Searches the scope chain for an object containing 
     1143           identifier property, and if one is found, writes it to 
     1144           register srcDst, and the retrieved property value to register 
     1145           propDst. If the property is not found, raises an exception. 
     1146 
     1147           This is more efficient than doing resolve_base followed by 
     1148           resolve, or resolve_base followed by get_prop_id, as it 
     1149           avoids duplicate hash lookups. 
     1150        */ 
    11261151        if (UNLIKELY(!resolveBaseAndProperty(exec, vPC, r, scopeChain, codeBlock, exceptionValue))) 
    11271152            goto vm_throw; 
     
    11321157    } 
    11331158    BEGIN_OPCODE(op_resolve_base_and_func) { 
     1159        /* resolve_base_and_func baseDst(r) funcDst(r) property(id) 
     1160 
     1161           Searches the scope chain for an object containing 
     1162           identifier property, and if one is found, writes the 
     1163           appropriate object to use as "this" when calling its 
     1164           properties to register baseDst; and the retrieved property 
     1165           value to register propDst. If the property is not found, 
     1166           raises an exception. 
     1167 
     1168           This differs from resolve_base_and_property, because the 
     1169           global this value will be substituted for activations or 
     1170           the global object, which is the right behavior for function 
     1171           calls but not for other property lookup. 
     1172        */ 
    11341173        if (UNLIKELY(!resolveBaseAndFunc(exec, vPC, r, scopeChain, codeBlock, exceptionValue))) 
    11351174            goto vm_throw; 
     
    11591198    } 
    11601199    BEGIN_OPCODE(op_put_prop_id) { 
    1161         int r0 = (++vPC)->u.operand; 
    1162         int id0 = (++vPC)->u.operand; 
    1163         int r1 = (++vPC)->u.operand; 
    1164  
    1165         JSObject* base = r[r0].u.jsValue->toObject(exec); 
    1166          
    1167         Identifier& ident = codeBlock->identifiers[id0]; 
    1168         base->put(exec, ident, r[r1].u.jsValue); 
     1200        /* put_prop_id base(r) property(id) value(r) 
     1201 
     1202           Sets register value on register base as the property named 
     1203           by identifier property. Base is converted to object first. 
     1204  
     1205           Unlike many opcodes, this one does not write any output to 
     1206           the register file. 
     1207        */ 
     1208 
     1209        int base = (++vPC)->u.operand; 
     1210        int property = (++vPC)->u.operand; 
     1211        int value = (++vPC)->u.operand; 
     1212 
     1213        JSObject* baseObj = r[base].u.jsValue->toObject(exec); 
     1214         
     1215        Identifier& ident = codeBlock->identifiers[property]; 
     1216        baseObj->put(exec, ident, r[value].u.jsValue); 
    11691217         
    11701218        VM_CHECK_EXCEPTION(); 
     
    11731221    } 
    11741222    BEGIN_OPCODE(op_delete_prop_id) { 
    1175         int r0 = (++vPC)->u.operand; 
    1176         int r1 = (++vPC)->u.operand; 
    1177         int id0 = (++vPC)->u.operand; 
    1178  
    1179         JSObject* base = r[r1].u.jsValue->toObject(exec); 
    1180          
    1181         Identifier& ident = codeBlock->identifiers[id0]; 
    1182         r[r0].u.jsValue = jsBoolean(base->deleteProperty(exec, ident)); 
     1223        /* delete_prop_id dst(r) base(r) property(id) 
     1224 
     1225           Converts register base to Object, deletes the property 
     1226           named by identifier property from the object, and writes a 
     1227           boolean indicating success (if true) or failure (if false) 
     1228           to register dst. 
     1229        */ 
     1230        int dst = (++vPC)->u.operand; 
     1231        int base = (++vPC)->u.operand; 
     1232        int property = (++vPC)->u.operand; 
     1233 
     1234        JSObject* baseObj = r[base].u.jsValue->toObject(exec); 
     1235         
     1236        Identifier& ident = codeBlock->identifiers[property]; 
     1237        r[dst].u.jsValue = jsBoolean(baseObj->deleteProperty(exec, ident)); 
    11831238         
    11841239        VM_CHECK_EXCEPTION(); 
     
    11871242    } 
    11881243    BEGIN_OPCODE(op_get_prop_val) { 
    1189         int r0 = (++vPC)->u.operand; 
    1190         int r1 = (++vPC)->u.operand; 
    1191         int r2 = (++vPC)->u.operand; 
    1192  
    1193         JSObject* base = r[r1].u.jsValue->toObject(exec); // may throw 
    1194          
    1195         JSValue* subscript = r[r2].u.jsValue; 
     1244        /* get_prop_val dst(r) base(r) property(r) 
     1245 
     1246           Converts register base to Object, gets the property named 
     1247           by register property from the object, and puts the result 
     1248           in register dst. property is nominally converted to string 
     1249           but numbers are treated more efficiently. 
     1250        */ 
     1251        int dst = (++vPC)->u.operand; 
     1252        int base = (++vPC)->u.operand; 
     1253        int property = (++vPC)->u.operand; 
     1254 
     1255        JSObject* baseObj = r[base].u.jsValue->toObject(exec); // may throw 
     1256         
     1257        JSValue* subscript = r[property].u.jsValue; 
    11961258 
    11971259        uint32_t i; 
    11981260        if (subscript->getUInt32(i)) 
    1199             r[r0].u.jsValue = base->get(exec, i); 
     1261            r[dst].u.jsValue = baseObj->get(exec, i); 
    12001262        else { 
    12011263            VM_CHECK_EXCEPTION(); // If toObject threw, we must not call toString, which may execute arbitrary code 
    1202             r[r0].u.jsValue = base->get(exec, Identifier(subscript->toString(exec))); 
     1264            r[dst].u.jsValue = baseObj->get(exec, Identifier(subscript->toString(exec))); 
    12031265        } 
    12041266         
     
    12081270    } 
    12091271    BEGIN_OPCODE(op_put_prop_val) { 
    1210         int r0 = (++vPC)->u.operand; 
    1211         int r1 = (++vPC)->u.operand; 
    1212         int r2 = (++vPC)->u.operand; 
    1213  
    1214         JSObject* base = r[r0].u.jsValue->toObject(exec); 
    1215          
    1216         JSValue* subscript = r[r1].u.jsValue; 
     1272        /* put_prop_val base(r) property(r) value(r) 
     1273 
     1274           Sets register value on register base as the property named 
     1275           by register property. Base is converted to object 
     1276           first. register property is nominally converted to string 
     1277           but numbers are treated more efficiently. 
     1278  
     1279           Unlike many opcodes, this one does not write any output to 
     1280           the register file. 
     1281        */ 
     1282        int base = (++vPC)->u.operand; 
     1283        int property = (++vPC)->u.operand; 
     1284        int value = (++vPC)->u.operand; 
     1285 
     1286        JSObject* baseObj = r[base].u.jsValue->toObject(exec); 
     1287         
     1288        JSValue* subscript = r[property].u.jsValue; 
    12171289 
    12181290        uint32_t i; 
    12191291        if (subscript->getUInt32(i)) 
    1220             base->put(exec, i, r[r2].u.jsValue); 
     1292            baseObj->put(exec, i, r[value].u.jsValue); 
    12211293        else { 
    12221294            VM_CHECK_EXCEPTION(); // If toObject threw, we must not call toString, which may execute arbitrary code 
    1223             base->put(exec, Identifier(subscript->toString(exec)), r[r2].u.jsValue); 
     1295            baseObj->put(exec, Identifier(subscript->toString(exec)), r[value].u.jsValue); 
    12241296        } 
    12251297         
     
    12291301    } 
    12301302    BEGIN_OPCODE(op_delete_prop_val) { 
    1231         int r0 = (++vPC)->u.operand; 
    1232         int r1 = (++vPC)->u.operand; 
    1233         int r2 = (++vPC)->u.operand; 
    1234  
    1235         JSObject* base = r[r1].u.jsValue->toObject(exec); // may throw 
    1236  
    1237         JSValue* subscript = r[r2].u.jsValue; 
     1303        /* delete_prop_id dst(r) base(r) property(r) 
     1304 
     1305           Converts register base to Object, deletes the property 
     1306           named by register property from the object, and writes a 
     1307           boolean indicating success (if true) or failure (if false) 
     1308           to register dst. 
     1309        */ 
     1310        int dst = (++vPC)->u.operand; 
     1311        int base = (++vPC)->u.operand; 
     1312        int property = (++vPC)->u.operand; 
     1313 
     1314        JSObject* baseObj = r[base].u.jsValue->toObject(exec); // may throw 
     1315 
     1316        JSValue* subscript = r[property].u.jsValue; 
    12381317 
    12391318        uint32_t i; 
    12401319        if (subscript->getUInt32(i)) 
    1241             r[r0].u.jsValue = jsBoolean(base->deleteProperty(exec, i)); 
     1320            r[dst].u.jsValue = jsBoolean(baseObj->deleteProperty(exec, i)); 
    12421321        else { 
    12431322            VM_CHECK_EXCEPTION(); // This is needed as toString may have side effects 
    1244             r[r0].u.jsValue = jsBoolean(base->deleteProperty(exec, Identifier(subscript->toString(exec)))); 
     1323            r[dst].u.jsValue = jsBoolean(baseObj->deleteProperty(exec, Identifier(subscript->toString(exec)))); 
    12451324        } 
    12461325         
     
    12501329    } 
    12511330    BEGIN_OPCODE(op_put_prop_index) { 
    1252         int r0 = (++vPC)->u.operand; 
    1253         unsigned n0 = (++vPC)->u.operand; 
    1254         int r1 = (++vPC)->u.operand; 
    1255  
    1256         r[r0].u.jsObject->put(exec, n0, r[r1].u.jsValue); 
     1331        /* put_prop_val base(r) property(n) value(r) 
     1332 
     1333           Sets register value on register base as the property named 
     1334           by the immediate number property. Base is converted to 
     1335           object first. register property is nominally converted to 
     1336           string but numbers are treated more efficiently. 
     1337  
     1338           Unlike many opcodes, this one does not write any output to 
     1339           the register file. 
     1340 
     1341           This opcode is mainly used to initialize array literals. 
     1342        */ 
     1343 
     1344        int base = (++vPC)->u.operand; 
     1345        unsigned property = (++vPC)->u.operand; 
     1346        int value = (++vPC)->u.operand; 
     1347 
     1348        r[base].u.jsObject->put(exec, property, r[value].u.jsValue); 
    12571349 
    12581350        ++vPC; 
     
    16051697    } 
    16061698    BEGIN_OPCODE(op_jsr) { 
    1607         /* jsr retAddrDst(r) target(address) 
     1699        /* jsr retAddrDst(r) target(offset) 
    16081700          
    16091701         Places the address of the next instruction into the retAddrDst 
    1610          register and branches to target. 
    1611          */ 
     1702         register and jumps to offset target from the current instruction. 
     1703        */ 
    16121704        int retAddrDst = (++vPC)->u.operand; 
    1613         int offset = (++vPC)->u.operand; 
     1705        int target = (++vPC)->u.operand; 
    16141706        r[retAddrDst].u.vPC = vPC + 1; 
    1615         vPC += offset; 
     1707        vPC += target; 
    16161708        NEXT_OPCODE; 
    16171709    } 
     
    16191711        /* sret retAddrSrc(r) 
    16201712          
    1621          Sets the vPC to the address stored in the retAddrSrc register. 
    1622          */ 
     1713         Jumps to the address stored in the retAddrSrc register. This 
     1714         differs from op_jmp because the target address is stored in a 
     1715         register, not as an immediate. 
     1716        */ 
    16231717        int retAddrSrc = (++vPC)->u.operand; 
    16241718        vPC = r[retAddrSrc].u.vPC; 
  • branches/squirrelfish/JavaScriptCore/kjs/nodes.cpp

    r33292 r33296  
    603603RegisterID* ResolveNode::emitCode(CodeGenerator& generator, RegisterID* dst) 
    604604{ 
    605     if (RegisterID* r0 = generator.registerForLocal(m_ident)) 
    606         return generator.moveToDestinationIfNeeded(dst, r0); 
     605    if (RegisterID* local = generator.registerForLocal(m_i