Changeset 33296
- Timestamp:
- 05/12/08 23:02:03 (6 months ago)
- Location:
- branches/squirrelfish/JavaScriptCore
- Files:
-
- 5 modified
-
ChangeLog (modified) (1 diff)
-
VM/CodeGenerator.cpp (modified) (2 diffs)
-
VM/CodeGenerator.h (modified) (1 diff)
-
VM/Machine.cpp (modified) (20 diffs)
-
kjs/nodes.cpp (modified) (26 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/squirrelfish/JavaScriptCore/ChangeLog
r33295 r33296 1 2008-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 1 52 2008-04-26 Oliver Hunt <oliver@apple.com> 2 53 -
branches/squirrelfish/JavaScriptCore/VM/CodeGenerator.cpp
r33274 r33296 689 689 } 690 690 691 RegisterID* CodeGenerator::emitResolve(RegisterID* r0, const Identifier& ident)691 RegisterID* CodeGenerator::emitResolve(RegisterID* dst, const Identifier& property) 692 692 { 693 693 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 699 RegisterID* CodeGenerator::emitResolveBase(RegisterID* dst, const Identifier& property) 700 700 { 701 701 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 707 RegisterID* CodeGenerator::emitResolveBaseAndProperty(RegisterID* baseDst, RegisterID* propDst, const Identifier& property) 708 708 { 709 709 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 716 RegisterID* CodeGenerator::emitResolveBaseAndFunc(RegisterID* baseDst, RegisterID* funcDst, const Identifier& property) 717 717 { 718 718 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 725 RegisterID* CodeGenerator::emitGetPropId(RegisterID* dst, RegisterID* base, const Identifier& property) 726 726 { 727 727 instructions().append(machine().getOpcode(op_get_prop_id)); 728 728 instructions().append(dst->index()); 729 729 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 734 RegisterID* CodeGenerator::emitPutPropId(RegisterID* base, const Identifier& property, RegisterID* value) 735 735 { 736 736 instructions().append(machine().getOpcode(op_put_prop_id)); 737 737 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 743 RegisterID* CodeGenerator::emitDeletePropId(RegisterID* dst, RegisterID* base, const Identifier& property) 744 744 { 745 745 instructions().append(machine().getOpcode(op_delete_prop_id)); 746 746 instructions().append(dst->index()); 747 747 instructions().append(base->index()); 748 instructions().append(addConstant( ident));748 instructions().append(addConstant(property)); 749 749 return dst; 750 750 } … … 759 759 } 760 760 761 RegisterID* CodeGenerator::emitPutPropVal(RegisterID* base, RegisterID* property, RegisterID* val )761 RegisterID* CodeGenerator::emitPutPropVal(RegisterID* base, RegisterID* property, RegisterID* value) 762 762 { 763 763 instructions().append(machine().getOpcode(op_put_prop_val)); 764 764 instructions().append(base->index()); 765 765 instructions().append(property->index()); 766 instructions().append(val ->index());767 return val ;766 instructions().append(value->index()); 767 return value; 768 768 } 769 769 -
branches/squirrelfish/JavaScriptCore/VM/CodeGenerator.h
r33269 r33296 189 189 RegisterID* emitIn(RegisterID*, RegisterID*, RegisterID*); 190 190 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); 200 196 201 197 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); 203 199 RegisterID* emitDeletePropId(RegisterID* dst, RegisterID* base, const Identifier&); 204 200 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); 206 202 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); 208 204 209 205 RegisterID* emitCall(RegisterID*, RegisterID*, RegisterID*, ArgumentsNode*); -
branches/squirrelfish/JavaScriptCore/VM/Machine.cpp
r33295 r33296 258 258 static bool NEVER_INLINE resolve(ExecState* exec, Instruction* vPC, Register* r, ScopeChainNode* scopeChain, CodeBlock* codeBlock, JSValue*& exceptionValue) 259 259 { 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; 262 262 263 263 ScopeChainIterator iter = scopeChain->begin(); … … 266 266 267 267 PropertySlot slot; 268 Identifier& ident = codeBlock->identifiers[ id0];268 Identifier& ident = codeBlock->identifiers[property]; 269 269 do { 270 270 JSObject* o = *iter; 271 271 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); 273 273 return true; 274 274 } … … 280 280 static void NEVER_INLINE resolveBase(ExecState* exec, Instruction* vPC, Register* r, ScopeChainNode* scopeChain, CodeBlock* codeBlock) 281 281 { 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; 284 284 285 285 ScopeChainIterator iter = scopeChain->begin(); … … 288 288 289 289 PropertySlot slot; 290 Identifier& ident = codeBlock->identifiers[ id0];290 Identifier& ident = codeBlock->identifiers[property]; 291 291 JSObject* base; 292 292 do { 293 293 base = *iter; 294 294 if (base->getPropertySlot(exec, ident, slot)) { 295 r[ r0].u.jsValue = base;295 r[dst].u.jsValue = base; 296 296 return; 297 297 } 298 298 } while (++iter != end); 299 299 300 r[ r0].u.jsValue = base;300 r[dst].u.jsValue = base; 301 301 } 302 302 303 303 static bool NEVER_INLINE resolveBaseAndProperty(ExecState* exec, Instruction* vPC, Register* r, ScopeChainNode* scopeChain, CodeBlock* codeBlock, JSValue*& exceptionValue) 304 304 { 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; 308 308 309 309 ScopeChainIterator iter = scopeChain->begin(); … … 315 315 316 316 PropertySlot slot; 317 Identifier& ident = codeBlock->identifiers[ id0];317 Identifier& ident = codeBlock->identifiers[property]; 318 318 JSObject* base; 319 319 do { 320 320 base = *iter; 321 321 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); 324 324 return true; 325 325 } … … 333 333 static bool NEVER_INLINE resolveBaseAndFunc(ExecState* exec, Instruction* vPC, Register* r, ScopeChainNode* scopeChain, CodeBlock* codeBlock, JSValue*& exceptionValue) 334 334 { 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; 338 338 339 339 ScopeChainIterator iter = scopeChain->begin(); … … 345 345 346 346 PropertySlot slot; 347 Identifier& ident = codeBlock->identifiers[ id0];347 Identifier& ident = codeBlock->identifiers[property]; 348 348 JSObject* base; 349 349 do { … … 359 359 JSObject* thisObj = base->toThisObject(exec); 360 360 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); 363 363 return true; 364 364 } … … 1110 1110 } 1111 1111 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 1112 1119 if (UNLIKELY(!resolve(exec, vPC, r, scopeChain, codeBlock, exceptionValue))) 1113 1120 goto vm_throw; … … 1118 1125 } 1119 1126 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 */ 1120 1134 resolveBase(exec, vPC, r, scopeChain, codeBlock); 1121 1135 vPC += 3; … … 1124 1138 } 1125 1139 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 */ 1126 1151 if (UNLIKELY(!resolveBaseAndProperty(exec, vPC, r, scopeChain, codeBlock, exceptionValue))) 1127 1152 goto vm_throw; … … 1132 1157 } 1133 1158 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 */ 1134 1173 if (UNLIKELY(!resolveBaseAndFunc(exec, vPC, r, scopeChain, codeBlock, exceptionValue))) 1135 1174 goto vm_throw; … … 1159 1198 } 1160 1199 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); 1169 1217 1170 1218 VM_CHECK_EXCEPTION(); … … 1173 1221 } 1174 1222 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)); 1183 1238 1184 1239 VM_CHECK_EXCEPTION(); … … 1187 1242 } 1188 1243 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; 1196 1258 1197 1259 uint32_t i; 1198 1260 if (subscript->getUInt32(i)) 1199 r[ r0].u.jsValue = base->get(exec, i);1261 r[dst].u.jsValue = baseObj->get(exec, i); 1200 1262 else { 1201 1263 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))); 1203 1265 } 1204 1266 … … 1208 1270 } 1209 1271 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; 1217 1289 1218 1290 uint32_t i; 1219 1291 if (subscript->getUInt32(i)) 1220 base ->put(exec, i, r[r2].u.jsValue);1292 baseObj->put(exec, i, r[value].u.jsValue); 1221 1293 else { 1222 1294 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); 1224 1296 } 1225 1297 … … 1229 1301 } 1230 1302 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; 1238 1317 1239 1318 uint32_t i; 1240 1319 if (subscript->getUInt32(i)) 1241 r[ r0].u.jsValue = jsBoolean(base->deleteProperty(exec, i));1320 r[dst].u.jsValue = jsBoolean(baseObj->deleteProperty(exec, i)); 1242 1321 else { 1243 1322 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)))); 1245 1324 } 1246 1325 … … 1250 1329 } 1251 1330 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); 1257 1349 1258 1350 ++vPC; … … 1605 1697 } 1606 1698 BEGIN_OPCODE(op_jsr) { 1607 /* jsr retAddrDst(r) target( address)1699 /* jsr retAddrDst(r) target(offset) 1608 1700 1609 1701 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 */ 1612 1704 int retAddrDst = (++vPC)->u.operand; 1613 int offset = (++vPC)->u.operand;1705 int target = (++vPC)->u.operand; 1614 1706 r[retAddrDst].u.vPC = vPC + 1; 1615 vPC += offset;1707 vPC += target; 1616 1708 NEXT_OPCODE; 1617 1709 } … … 1619 1711 /* sret retAddrSrc(r) 1620 1712 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 */ 1623 1717 int retAddrSrc = (++vPC)->u.operand; 1624 1718 vPC = r[retAddrSrc].u.vPC; -
branches/squirrelfish/JavaScriptCore/kjs/nodes.cpp
r33292 r33296 603 603 RegisterID* ResolveNode::emitCode(CodeGenerator& generator, RegisterID* dst) 604 604 { 605 if (RegisterID* r0= generator.registerForLocal(m_ident))606 return generator.moveToDestinationIfNeeded(dst, r0);605 if (RegisterID* local = generator.registerForLocal(m_i