Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (157438 => 157439)
--- trunk/Source/_javascript_Core/ChangeLog 2013-10-15 02:47:38 UTC (rev 157438)
+++ trunk/Source/_javascript_Core/ChangeLog 2013-10-15 03:03:45 UTC (rev 157439)
@@ -1,3 +1,42 @@
+2013-10-14 Mark Lam <[email protected]>
+
+ Transition *switch* and *scope* JITStubs to JIT operations.
+ https://bugs.webkit.org/show_bug.cgi?id=122757.
+
+ Reviewed by Geoffrey Garen.
+
+ Transitioning:
+ cti_op_switch_char
+ cti_op_switch_imm
+ cti_op_switch_string
+ cti_op_resolve_scope
+ cti_op_get_from_scope
+ cti_op_put_to_scope
+
+ * jit/JIT.h:
+ * jit/JITInlines.h:
+ (JSC::JIT::callOperation):
+ * jit/JITOpcodes.cpp:
+ (JSC::JIT::emit_op_switch_imm):
+ (JSC::JIT::emit_op_switch_char):
+ (JSC::JIT::emit_op_switch_string):
+ * jit/JITOpcodes32_64.cpp:
+ (JSC::JIT::emit_op_switch_imm):
+ (JSC::JIT::emit_op_switch_char):
+ (JSC::JIT::emit_op_switch_string):
+ * jit/JITOperations.cpp:
+ * jit/JITOperations.h:
+ * jit/JITPropertyAccess.cpp:
+ (JSC::JIT::emitSlow_op_resolve_scope):
+ (JSC::JIT::emitSlow_op_get_from_scope):
+ (JSC::JIT::emitSlow_op_put_to_scope):
+ * jit/JITPropertyAccess32_64.cpp:
+ (JSC::JIT::emitSlow_op_resolve_scope):
+ (JSC::JIT::emitSlow_op_get_from_scope):
+ (JSC::JIT::emitSlow_op_put_to_scope):
+ * jit/JITStubs.cpp:
+ * jit/JITStubs.h:
+
2013-10-14 Filip Pizlo <[email protected]>
DFG PutById IC should use the ConcurrentJITLocker since it's now dealing with IC's that get read by the compiler thread
Modified: trunk/Source/_javascript_Core/jit/JIT.h (157438 => 157439)
--- trunk/Source/_javascript_Core/jit/JIT.h 2013-10-15 02:47:38 UTC (rev 157438)
+++ trunk/Source/_javascript_Core/jit/JIT.h 2013-10-15 03:03:45 UTC (rev 157439)
@@ -867,6 +867,9 @@
MacroAssembler::Call callOperation(J_JITOperation_EJIdc, int, GPRReg, const Identifier*);
MacroAssembler::Call callOperation(J_JITOperation_EJJ, int, GPRReg, GPRReg);
MacroAssembler::Call callOperation(J_JITOperation_EP, int, void*);
+ MacroAssembler::Call callOperation(J_JITOperation_EPc, int, Instruction*);
+ MacroAssembler::Call callOperation(J_JITOperation_EZ, int, int32_t);
+ MacroAssembler::Call callOperation(P_JITOperation_EJS, GPRReg, size_t);
MacroAssembler::Call callOperation(S_JITOperation_ECC, RegisterID, RegisterID);
MacroAssembler::Call callOperation(S_JITOperation_EJ, RegisterID);
MacroAssembler::Call callOperation(S_JITOperation_EJJ, RegisterID, RegisterID);
@@ -876,6 +879,7 @@
#else
MacroAssembler::Call callOperation(V_JITOperation_EJJI, RegisterID, RegisterID, RegisterID, RegisterID, StringImpl*);
#endif
+ MacroAssembler::Call callOperation(V_JITOperation_EPc, Instruction*);
MacroAssembler::Call callOperationWithCallFrameRollbackOnException(J_JITOperation_E);
MacroAssembler::Call callOperationWithCallFrameRollbackOnException(V_JITOperation_ECb, CodeBlock*);
MacroAssembler::Call callOperationWithCallFrameRollbackOnException(Z_JITOperation_E);
@@ -885,6 +889,7 @@
MacroAssembler::Call callOperation(J_JITOperation_EJ, int, GPRReg, GPRReg);
MacroAssembler::Call callOperation(J_JITOperation_EJIdc, int, GPRReg, GPRReg, const Identifier*);
MacroAssembler::Call callOperation(J_JITOperation_EJJ, int, GPRReg, GPRReg, GPRReg, GPRReg);
+ MacroAssembler::Call callOperation(P_JITOperation_EJS, GPRReg, GPRReg, size_t);
MacroAssembler::Call callOperation(S_JITOperation_EJ, RegisterID, RegisterID);
MacroAssembler::Call callOperation(S_JITOperation_EJJ, RegisterID, RegisterID, RegisterID, RegisterID);
#endif
Modified: trunk/Source/_javascript_Core/jit/JITInlines.h (157438 => 157439)
--- trunk/Source/_javascript_Core/jit/JITInlines.h 2013-10-15 02:47:38 UTC (rev 157438)
+++ trunk/Source/_javascript_Core/jit/JITInlines.h 2013-10-15 03:03:45 UTC (rev 157439)
@@ -324,6 +324,24 @@
return appendCallWithExceptionCheckSetJSValueResult(operation, dst);
}
+ALWAYS_INLINE MacroAssembler::Call JIT::callOperation(J_JITOperation_EPc operation, int dst, Instruction* bytecodePC)
+{
+ setupArgumentsWithExecState(TrustedImmPtr(bytecodePC));
+ return appendCallWithExceptionCheckSetJSValueResult(operation, dst);
+}
+
+ALWAYS_INLINE MacroAssembler::Call JIT::callOperation(J_JITOperation_EZ operation, int dst, int32_t arg)
+{
+ setupArgumentsWithExecState(TrustedImm32(arg));
+ return appendCallWithExceptionCheckSetJSValueResult(operation, dst);
+}
+
+ALWAYS_INLINE MacroAssembler::Call JIT::callOperation(P_JITOperation_EJS operation, GPRReg arg1, size_t arg2)
+{
+ setupArgumentsWithExecState(arg1, TrustedImmPtr(arg2));
+ return appendCallWithExceptionCheck(operation);
+}
+
ALWAYS_INLINE MacroAssembler::Call JIT::callOperation(S_JITOperation_ECC operation, RegisterID regOp1, RegisterID regOp2)
{
setupArgumentsWithExecState(regOp1, regOp2);
@@ -348,6 +366,12 @@
return appendCallWithExceptionCheck(operation);
}
+ALWAYS_INLINE MacroAssembler::Call JIT::callOperation(V_JITOperation_EPc operation, Instruction* bytecodePC)
+{
+ setupArgumentsWithExecState(TrustedImmPtr(bytecodePC));
+ return appendCallWithExceptionCheck(operation);
+}
+
ALWAYS_INLINE MacroAssembler::Call JIT::callOperationWithCallFrameRollbackOnException(J_JITOperation_E operation)
{
setupArgumentsExecState();
@@ -414,6 +438,12 @@
return appendCallWithExceptionCheckSetJSValueResult(operation, dst);
}
+ALWAYS_INLINE MacroAssembler::Call JIT::callOperation(P_JITOperation_EJS operation, GPRReg arg1Tag, GPRReg arg1Payload, size_t arg2)
+{
+ setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, TrustedImmPtr(arg2));
+ return appendCallWithExceptionCheck(operation);
+}
+
ALWAYS_INLINE MacroAssembler::Call JIT::callOperation(S_JITOperation_EJ operation, RegisterID argTag, RegisterID argPayload)
{
setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG argPayload, argTag);
Modified: trunk/Source/_javascript_Core/jit/JITOpcodes.cpp (157438 => 157439)
--- trunk/Source/_javascript_Core/jit/JITOpcodes.cpp 2013-10-15 02:47:38 UTC (rev 157438)
+++ trunk/Source/_javascript_Core/jit/JITOpcodes.cpp 2013-10-15 03:03:45 UTC (rev 157439)
@@ -682,7 +682,7 @@
void JIT::emit_op_switch_imm(Instruction* currentInstruction)
{
- unsigned tableIndex = currentInstruction[1].u.operand;
+ size_t tableIndex = currentInstruction[1].u.operand;
unsigned defaultOffset = currentInstruction[2].u.operand;
unsigned scrutinee = currentInstruction[3].u.operand;
@@ -691,16 +691,14 @@
m_switches.append(SwitchRecord(jumpTable, m_bytecodeOffset, defaultOffset, SwitchRecord::Immediate));
jumpTable->ctiOffsets.grow(jumpTable->branchOffsets.size());
- JITStubCall stubCall(this, cti_op_switch_imm);
- stubCall.addArgument(scrutinee, regT2);
- stubCall.addArgument(TrustedImm32(tableIndex));
- stubCall.call();
- jump(regT0);
+ emitGetVirtualRegister(scrutinee, regT0);
+ callOperation(operationSwitchImmWithUnknownKeyType, regT0, tableIndex);
+ jump(returnValueRegister);
}
void JIT::emit_op_switch_char(Instruction* currentInstruction)
{
- unsigned tableIndex = currentInstruction[1].u.operand;
+ size_t tableIndex = currentInstruction[1].u.operand;
unsigned defaultOffset = currentInstruction[2].u.operand;
unsigned scrutinee = currentInstruction[3].u.operand;
@@ -709,16 +707,14 @@
m_switches.append(SwitchRecord(jumpTable, m_bytecodeOffset, defaultOffset, SwitchRecord::Character));
jumpTable->ctiOffsets.grow(jumpTable->branchOffsets.size());
- JITStubCall stubCall(this, cti_op_switch_char);
- stubCall.addArgument(scrutinee, regT2);
- stubCall.addArgument(TrustedImm32(tableIndex));
- stubCall.call();
- jump(regT0);
+ emitGetVirtualRegister(scrutinee, regT0);
+ callOperation(operationSwitchCharWithUnknownKeyType, regT0, tableIndex);
+ jump(returnValueRegister);
}
void JIT::emit_op_switch_string(Instruction* currentInstruction)
{
- unsigned tableIndex = currentInstruction[1].u.operand;
+ size_t tableIndex = currentInstruction[1].u.operand;
unsigned defaultOffset = currentInstruction[2].u.operand;
unsigned scrutinee = currentInstruction[3].u.operand;
@@ -726,11 +722,9 @@
StringJumpTable* jumpTable = &m_codeBlock->stringSwitchJumpTable(tableIndex);
m_switches.append(SwitchRecord(jumpTable, m_bytecodeOffset, defaultOffset));
- JITStubCall stubCall(this, cti_op_switch_string);
- stubCall.addArgument(scrutinee, regT2);
- stubCall.addArgument(TrustedImm32(tableIndex));
- stubCall.call();
- jump(regT0);
+ emitGetVirtualRegister(scrutinee, regT0);
+ callOperation(operationSwitchStringWithUnknownKeyType, regT0, tableIndex);
+ jump(returnValueRegister);
}
void JIT::emit_op_throw_static_error(Instruction* currentInstruction)
Modified: trunk/Source/_javascript_Core/jit/JITOpcodes32_64.cpp (157438 => 157439)
--- trunk/Source/_javascript_Core/jit/JITOpcodes32_64.cpp 2013-10-15 02:47:38 UTC (rev 157438)
+++ trunk/Source/_javascript_Core/jit/JITOpcodes32_64.cpp 2013-10-15 03:03:45 UTC (rev 157439)
@@ -994,7 +994,7 @@
void JIT::emit_op_switch_imm(Instruction* currentInstruction)
{
- unsigned tableIndex = currentInstruction[1].u.operand;
+ size_t tableIndex = currentInstruction[1].u.operand;
unsigned defaultOffset = currentInstruction[2].u.operand;
unsigned scrutinee = currentInstruction[3].u.operand;
@@ -1003,16 +1003,14 @@
m_switches.append(SwitchRecord(jumpTable, m_bytecodeOffset, defaultOffset, SwitchRecord::Immediate));
jumpTable->ctiOffsets.grow(jumpTable->branchOffsets.size());
- JITStubCall stubCall(this, cti_op_switch_imm);
- stubCall.addArgument(scrutinee);
- stubCall.addArgument(TrustedImm32(tableIndex));
- stubCall.call();
- jump(regT0);
+ emitLoad(scrutinee, regT1, regT0);
+ callOperation(operationSwitchImmWithUnknownKeyType, regT1, regT0, tableIndex);
+ jump(returnValueRegister);
}
void JIT::emit_op_switch_char(Instruction* currentInstruction)
{
- unsigned tableIndex = currentInstruction[1].u.operand;
+ size_t tableIndex = currentInstruction[1].u.operand;
unsigned defaultOffset = currentInstruction[2].u.operand;
unsigned scrutinee = currentInstruction[3].u.operand;
@@ -1021,16 +1019,14 @@
m_switches.append(SwitchRecord(jumpTable, m_bytecodeOffset, defaultOffset, SwitchRecord::Character));
jumpTable->ctiOffsets.grow(jumpTable->branchOffsets.size());
- JITStubCall stubCall(this, cti_op_switch_char);
- stubCall.addArgument(scrutinee);
- stubCall.addArgument(TrustedImm32(tableIndex));
- stubCall.call();
- jump(regT0);
+ emitLoad(scrutinee, regT1, regT0);
+ callOperation(operationSwitchCharWithUnknownKeyType, regT1, regT0, tableIndex);
+ jump(returnValueRegister);
}
void JIT::emit_op_switch_string(Instruction* currentInstruction)
{
- unsigned tableIndex = currentInstruction[1].u.operand;
+ size_t tableIndex = currentInstruction[1].u.operand;
unsigned defaultOffset = currentInstruction[2].u.operand;
unsigned scrutinee = currentInstruction[3].u.operand;
@@ -1038,11 +1034,9 @@
StringJumpTable* jumpTable = &m_codeBlock->stringSwitchJumpTable(tableIndex);
m_switches.append(SwitchRecord(jumpTable, m_bytecodeOffset, defaultOffset));
- JITStubCall stubCall(this, cti_op_switch_string);
- stubCall.addArgument(scrutinee);
- stubCall.addArgument(TrustedImm32(tableIndex));
- stubCall.call();
- jump(regT0);
+ emitLoad(scrutinee, regT1, regT0);
+ callOperation(operationSwitchStringWithUnknownKeyType, regT1, regT0, tableIndex);
+ jump(returnValueRegister);
}
void JIT::emit_op_throw_static_error(Instruction* currentInstruction)
Modified: trunk/Source/_javascript_Core/jit/JITOperations.cpp (157438 => 157439)
--- trunk/Source/_javascript_Core/jit/JITOperations.cpp 2013-10-15 02:47:38 UTC (rev 157438)
+++ trunk/Source/_javascript_Core/jit/JITOperations.cpp 2013-10-15 03:03:45 UTC (rev 157439)
@@ -893,6 +893,133 @@
return JSValue::encode(JSValue::decode(value).toObject(exec));
}
+char* JIT_OPERATION operationSwitchCharWithUnknownKeyType(ExecState* exec, EncodedJSValue encodedKey, size_t tableIndex)
+{
+ VM& vm = exec->vm();
+ NativeCallFrameTracer tracer(&vm, exec);
+ JSValue key = JSValue::decode(encodedKey);
+ CodeBlock* codeBlock = exec->codeBlock();
+
+ SimpleJumpTable& jumpTable = codeBlock->switchJumpTable(tableIndex);
+ void* result = jumpTable.ctiDefault.executableAddress();
+
+ if (key.isString()) {
+ StringImpl* value = asString(key)->value(exec).impl();
+ if (value->length() == 1)
+ result = jumpTable.ctiForValue((*value)[0]).executableAddress();
+ }
+
+ return reinterpret_cast<char*>(result);
+}
+
+char* JIT_OPERATION operationSwitchImmWithUnknownKeyType(ExecState* exec, EncodedJSValue encodedKey, size_t tableIndex)
+{
+ VM& vm = exec->vm();
+ NativeCallFrameTracer tracer(&vm, exec);
+ JSValue key = JSValue::decode(encodedKey);
+ CodeBlock* codeBlock = exec->codeBlock();
+
+ SimpleJumpTable& jumpTable = codeBlock->switchJumpTable(tableIndex);
+ void* result;
+ if (key.isInt32())
+ result = jumpTable.ctiForValue(key.asInt32()).executableAddress();
+ else if (key.isDouble() && key.asDouble() == static_cast<int32_t>(key.asDouble()))
+ result = jumpTable.ctiForValue(static_cast<int32_t>(key.asDouble())).executableAddress();
+ else
+ result = jumpTable.ctiDefault.executableAddress();
+ return reinterpret_cast<char*>(result);
+}
+
+char* JIT_OPERATION operationSwitchStringWithUnknownKeyType(ExecState* exec, EncodedJSValue encodedKey, size_t tableIndex)
+{
+ VM& vm = exec->vm();
+ NativeCallFrameTracer tracer(&vm, exec);
+ JSValue key = JSValue::decode(encodedKey);
+ CodeBlock* codeBlock = exec->codeBlock();
+
+ void* result;
+ StringJumpTable& jumpTable = codeBlock->stringSwitchJumpTable(tableIndex);
+
+ if (key.isString()) {
+ StringImpl* value = asString(key)->value(exec).impl();
+ result = jumpTable.ctiForValue(value).executableAddress();
+ } else
+ result = jumpTable.ctiDefault.executableAddress();
+
+ return reinterpret_cast<char*>(result);
+}
+
+EncodedJSValue JIT_OPERATION operationResolveScope(ExecState* exec, int32_t identifierIndex)
+{
+ VM& vm = exec->vm();
+ NativeCallFrameTracer tracer(&vm, exec);
+ const Identifier& ident = exec->codeBlock()->identifier(identifierIndex);
+ return JSValue::encode(JSScope::resolve(exec, exec->scope(), ident));
+}
+
+EncodedJSValue JIT_OPERATION operationGetFromScope(ExecState* exec, Instruction* bytecodePC)
+{
+ VM& vm = exec->vm();
+ NativeCallFrameTracer tracer(&vm, exec);
+ CodeBlock* codeBlock = exec->codeBlock();
+ Instruction* pc = bytecodePC;
+
+ const Identifier& ident = codeBlock->identifier(pc[3].u.operand);
+ JSObject* scope = jsCast<JSObject*>(exec->uncheckedR(pc[2].u.operand).jsValue());
+ ResolveModeAndType modeAndType(pc[4].u.operand);
+
+ PropertySlot slot(scope);
+ if (!scope->getPropertySlot(exec, ident, slot)) {
+ if (modeAndType.mode() == ThrowIfNotFound)
+ vm.throwException(exec, createUndefinedVariableError(exec, ident));
+ return JSValue::encode(jsUndefined());
+ }
+
+ // Covers implicit globals. Since they don't exist until they first execute, we didn't know how to cache them at compile time.
+ if (slot.isCacheableValue() && slot.slotBase() == scope && scope->structure()->propertyAccessesAreCacheable()) {
+ if (modeAndType.type() == GlobalProperty || modeAndType.type() == GlobalPropertyWithVarInjectionChecks) {
+ ConcurrentJITLocker locker(codeBlock->m_lock);
+ pc[5].u.structure.set(exec->vm(), codeBlock->ownerExecutable(), scope->structure());
+ pc[6].u.operand = slot.cachedOffset();
+ }
+ }
+
+ return JSValue::encode(slot.getValue(exec, ident));
+}
+
+void JIT_OPERATION operationPutToScope(ExecState* exec, Instruction* bytecodePC)
+{
+ VM& vm = exec->vm();
+ NativeCallFrameTracer tracer(&vm, exec);
+ Instruction* pc = bytecodePC;
+
+ CodeBlock* codeBlock = exec->codeBlock();
+ const Identifier& ident = codeBlock->identifier(pc[2].u.operand);
+ JSObject* scope = jsCast<JSObject*>(exec->uncheckedR(pc[1].u.operand).jsValue());
+ JSValue value = exec->r(pc[3].u.operand).jsValue();
+ ResolveModeAndType modeAndType = ResolveModeAndType(pc[4].u.operand);
+
+ if (modeAndType.mode() == ThrowIfNotFound && !scope->hasProperty(exec, ident)) {
+ exec->vm().throwException(exec, createUndefinedVariableError(exec, ident));
+ return;
+ }
+
+ PutPropertySlot slot(codeBlock->isStrictMode());
+ scope->methodTable()->put(scope, exec, ident, value, slot);
+
+ if (exec->vm().exception())
+ return;
+
+ // Covers implicit globals. Since they don't exist until they first execute, we didn't know how to cache them at compile time.
+ if (modeAndType.type() == GlobalProperty || modeAndType.type() == GlobalPropertyWithVarInjectionChecks) {
+ if (slot.isCacheable() && slot.base() == scope && scope->structure()->propertyAccessesAreCacheable()) {
+ ConcurrentJITLocker locker(codeBlock->m_lock);
+ pc[5].u.structure.set(exec->vm(), codeBlock->ownerExecutable(), scope->structure());
+ pc[6].u.operand = slot.cachedOffset();
+ }
+ }
+}
+
JITHandlerEncoded JIT_OPERATION lookupExceptionHandler(ExecState* exec)
{
VM* vm = &exec->vm();
Modified: trunk/Source/_javascript_Core/jit/JITOperations.h (157438 => 157439)
--- trunk/Source/_javascript_Core/jit/JITOperations.h 2013-10-15 02:47:38 UTC (rev 157438)
+++ trunk/Source/_javascript_Core/jit/JITOperations.h 2013-10-15 03:03:45 UTC (rev 157439)
@@ -61,6 +61,7 @@
Jss: JSString*
O: JSObject*
P: pointer (char*)
+ Pc: Instruction* i.e. bytecode PC
R: Register
S: size_t
St: Structure*
@@ -90,6 +91,7 @@
typedef EncodedJSValue JIT_OPERATION (*J_JITOperation_EP)(ExecState*, void*);
typedef EncodedJSValue JIT_OPERATION (*J_JITOperation_EPP)(ExecState*, void*, void*);
typedef EncodedJSValue JIT_OPERATION (*J_JITOperation_EPS)(ExecState*, void*, size_t);
+typedef EncodedJSValue JIT_OPERATION (*J_JITOperation_EPc)(ExecState*, Instruction*);
typedef EncodedJSValue JIT_OPERATION (*J_JITOperation_ESS)(ExecState*, size_t, size_t);
typedef EncodedJSValue JIT_OPERATION (*J_JITOperation_EZ)(ExecState*, int32_t);
typedef EncodedJSValue JIT_OPERATION (*J_JITOperation_EZIcfZ)(ExecState*, int32_t, InlineCallFrame*, int32_t);
@@ -130,6 +132,7 @@
typedef void JIT_OPERATION (*V_JITOperation_EJJI)(ExecState*, EncodedJSValue, EncodedJSValue, StringImpl*);
typedef void JIT_OPERATION (*V_JITOperation_EJJJ)(ExecState*, EncodedJSValue, EncodedJSValue, EncodedJSValue);
typedef void JIT_OPERATION (*V_JITOperation_EJPP)(ExecState*, EncodedJSValue, void*, void*);
+typedef void JIT_OPERATION (*V_JITOperation_EPc)(ExecState*, Instruction*);
typedef void JIT_OPERATION (*V_JITOperation_EPZJ)(ExecState*, void*, int32_t, EncodedJSValue);
typedef void JIT_OPERATION (*V_JITOperation_W)(WatchpointSet*);
typedef char* JIT_OPERATION (*P_JITOperation_E)(ExecState*);
@@ -250,6 +253,13 @@
CallFrame* JIT_OPERATION operationLoadVarargs(ExecState*, EncodedJSValue thisValue, EncodedJSValue arguments, int32_t firstFreeRegister) WTF_INTERNAL;
EncodedJSValue JIT_OPERATION operationToObject(ExecState*, EncodedJSValue) WTF_INTERNAL;
+char* JIT_OPERATION operationSwitchCharWithUnknownKeyType(ExecState*, EncodedJSValue key, size_t tableIndex) WTF_INTERNAL;
+char* JIT_OPERATION operationSwitchImmWithUnknownKeyType(ExecState*, EncodedJSValue key, size_t tableIndex) WTF_INTERNAL;
+char* JIT_OPERATION operationSwitchStringWithUnknownKeyType(ExecState*, EncodedJSValue key, size_t tableIndex) WTF_INTERNAL;
+EncodedJSValue JIT_OPERATION operationResolveScope(ExecState*, int32_t identifierIndex) WTF_INTERNAL;
+EncodedJSValue JIT_OPERATION operationGetFromScope(ExecState*, Instruction* bytecodePC) WTF_INTERNAL;
+void JIT_OPERATION operationPutToScope(ExecState*, Instruction* bytecodePC) WTF_INTERNAL;
+
} // extern "C"
} // namespace JSC
Modified: trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp (157438 => 157439)
--- trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp 2013-10-15 02:47:38 UTC (rev 157438)
+++ trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp 2013-10-15 03:03:45 UTC (rev 157439)
@@ -1176,10 +1176,8 @@
return;
linkSlowCase(iter);
-
- JITStubCall stubCall(this, cti_op_resolve_scope);
- stubCall.addArgument(TrustedImmPtr(currentInstruction));
- stubCall.call(dst);
+ int32_t indentifierIndex = currentInstruction[2].u.operand;
+ callOperation(operationResolveScope, dst, indentifierIndex);
}
void JIT::emitLoadWithStructureCheck(int scope, Structure** structureSlot)
@@ -1249,10 +1247,7 @@
return;
linkSlowCase(iter);
-
- JITStubCall stubCall(this, cti_op_get_from_scope);
- stubCall.addArgument(TrustedImmPtr(currentInstruction));
- stubCall.call(dst);
+ callOperation(operationGetFromScope, dst, currentInstruction);
emitValueProfilingSite(regT4);
}
@@ -1317,10 +1312,7 @@
return;
linkSlowCase(iter);
-
- JITStubCall stubCall(this, cti_op_put_to_scope);
- stubCall.addArgument(TrustedImmPtr(currentInstruction));
- stubCall.call();
+ callOperation(operationPutToScope, currentInstruction);
}
void JIT::emit_op_init_global_const(Instruction* currentInstruction)
Modified: trunk/Source/_javascript_Core/jit/JITPropertyAccess32_64.cpp (157438 => 157439)
--- trunk/Source/_javascript_Core/jit/JITPropertyAccess32_64.cpp 2013-10-15 02:47:38 UTC (rev 157438)
+++ trunk/Source/_javascript_Core/jit/JITPropertyAccess32_64.cpp 2013-10-15 03:03:45 UTC (rev 157439)
@@ -1200,10 +1200,8 @@
return;
linkSlowCase(iter);
-
- JITStubCall stubCall(this, cti_op_resolve_scope);
- stubCall.addArgument(TrustedImmPtr(currentInstruction));
- stubCall.call(dst);
+ int32_t indentifierIndex = currentInstruction[2].u.operand;
+ callOperation(operationResolveScope, dst, indentifierIndex);
}
void JIT::emitLoadWithStructureCheck(int scope, Structure** structureSlot)
@@ -1276,10 +1274,7 @@
return;
linkSlowCase(iter);
-
- JITStubCall stubCall(this, cti_op_get_from_scope);
- stubCall.addArgument(TrustedImmPtr(currentInstruction));
- stubCall.call(dst);
+ callOperation(operationGetFromScope, dst, currentInstruction);
emitValueProfilingSite(regT4);
}
@@ -1347,10 +1342,7 @@
return;
linkSlowCase(iter);
-
- JITStubCall stubCall(this, cti_op_put_to_scope);
- stubCall.addArgument(TrustedImmPtr(currentInstruction));
- stubCall.call();
+ callOperation(operationPutToScope, currentInstruction);
}
void JIT::emit_op_init_global_const(Instruction* currentInstruction)
Modified: trunk/Source/_javascript_Core/jit/JITStubs.cpp (157438 => 157439)
--- trunk/Source/_javascript_Core/jit/JITStubs.cpp 2013-10-15 02:47:38 UTC (rev 157438)
+++ trunk/Source/_javascript_Core/jit/JITStubs.cpp 2013-10-15 03:03:45 UTC (rev 157439)
@@ -1185,63 +1185,6 @@
asArray(arrayValue)->putDirectIndex(callFrame, property, stackFrame.args[2].jsValue());
}
-DEFINE_STUB_FUNCTION(void*, op_switch_imm)
-{
- STUB_INIT_STACK_FRAME(stackFrame);
-
- JSValue scrutinee = stackFrame.args[0].jsValue();
- unsigned tableIndex = stackFrame.args[1].int32();
- CallFrame* callFrame = stackFrame.callFrame;
- CodeBlock* codeBlock = callFrame->codeBlock();
-
- if (scrutinee.isInt32())
- return codeBlock->switchJumpTable(tableIndex).ctiForValue(scrutinee.asInt32()).executableAddress();
- if (scrutinee.isDouble() && scrutinee.asDouble() == static_cast<int32_t>(scrutinee.asDouble()))
- return codeBlock->switchJumpTable(tableIndex).ctiForValue(static_cast<int32_t>(scrutinee.asDouble())).executableAddress();
- return codeBlock->switchJumpTable(tableIndex).ctiDefault.executableAddress();
-}
-
-DEFINE_STUB_FUNCTION(void*, op_switch_char)
-{
- STUB_INIT_STACK_FRAME(stackFrame);
-
- JSValue scrutinee = stackFrame.args[0].jsValue();
- unsigned tableIndex = stackFrame.args[1].int32();
- CallFrame* callFrame = stackFrame.callFrame;
- CodeBlock* codeBlock = callFrame->codeBlock();
-
- void* result = codeBlock->switchJumpTable(tableIndex).ctiDefault.executableAddress();
-
- if (scrutinee.isString()) {
- StringImpl* value = asString(scrutinee)->value(callFrame).impl();
- if (value->length() == 1)
- result = codeBlock->switchJumpTable(tableIndex).ctiForValue((*value)[0]).executableAddress();
- }
-
- CHECK_FOR_EXCEPTION_AT_END();
- return result;
-}
-
-DEFINE_STUB_FUNCTION(void*, op_switch_string)
-{
- STUB_INIT_STACK_FRAME(stackFrame);
-
- JSValue scrutinee = stackFrame.args[0].jsValue();
- unsigned tableIndex = stackFrame.args[1].int32();
- CallFrame* callFrame = stackFrame.callFrame;
- CodeBlock* codeBlock = callFrame->codeBlock();
-
- void* result = codeBlock->stringSwitchJumpTable(tableIndex).ctiDefault.executableAddress();
-
- if (scrutinee.isString()) {
- StringImpl* value = asString(scrutinee)->value(callFrame).impl();
- result = codeBlock->stringSwitchJumpTable(tableIndex).ctiForValue(value).executableAddress();
- }
-
- CHECK_FOR_EXCEPTION_AT_END();
- return result;
-}
-
DEFINE_STUB_FUNCTION(void, op_put_getter_setter)
{
STUB_INIT_STACK_FRAME(stackFrame);
@@ -1327,84 +1270,6 @@
}
#endif
-DEFINE_STUB_FUNCTION(EncodedJSValue, op_resolve_scope)
-{
- STUB_INIT_STACK_FRAME(stackFrame);
- ExecState* exec = stackFrame.callFrame;
- Instruction* pc = stackFrame.args[0].pc();
-
- const Identifier& ident = exec->codeBlock()->identifier(pc[2].u.operand);
- return JSValue::encode(JSScope::resolve(exec, exec->scope(), ident));
-}
-
-DEFINE_STUB_FUNCTION(EncodedJSValue, op_get_from_scope)
-{
- STUB_INIT_STACK_FRAME(stackFrame);
- ExecState* exec = stackFrame.callFrame;
- Instruction* pc = stackFrame.args[0].pc();
-
- const Identifier& ident = exec->codeBlock()->identifier(pc[3].u.operand);
- JSObject* scope = jsCast<JSObject*>(exec->uncheckedR(pc[2].u.operand).jsValue());
- ResolveModeAndType modeAndType(pc[4].u.operand);
-
- PropertySlot slot(scope);
- if (!scope->getPropertySlot(exec, ident, slot)) {
- if (modeAndType.mode() == ThrowIfNotFound) {
- exec->vm().throwException(exec, createUndefinedVariableError(exec, ident));
- VM_THROW_EXCEPTION();
- }
- return JSValue::encode(jsUndefined());
- }
-
- // Covers implicit globals. Since they don't exist until they first execute, we didn't know how to cache them at compile time.
- if (slot.isCacheableValue() && slot.slotBase() == scope && scope->structure()->propertyAccessesAreCacheable()) {
- if (modeAndType.type() == GlobalProperty || modeAndType.type() == GlobalPropertyWithVarInjectionChecks) {
- CodeBlock* codeBlock = exec->codeBlock();
- ConcurrentJITLocker locker(codeBlock->m_lock);
- pc[5].u.structure.set(exec->vm(), codeBlock->ownerExecutable(), scope->structure());
- pc[6].u.operand = slot.cachedOffset();
- }
- }
-
- return JSValue::encode(slot.getValue(exec, ident));
-}
-
-DEFINE_STUB_FUNCTION(void, op_put_to_scope)
-{
- STUB_INIT_STACK_FRAME(stackFrame);
- ExecState* exec = stackFrame.callFrame;
- Instruction* pc = stackFrame.args[0].pc();
-
- CodeBlock* codeBlock = exec->codeBlock();
- const Identifier& ident = codeBlock->identifier(pc[2].u.operand);
- JSObject* scope = jsCast<JSObject*>(exec->uncheckedR(pc[1].u.operand).jsValue());
- JSValue value = exec->r(pc[3].u.operand).jsValue();
- ResolveModeAndType modeAndType = ResolveModeAndType(pc[4].u.operand);
-
- if (modeAndType.mode() == ThrowIfNotFound && !scope->hasProperty(exec, ident)) {
- exec->vm().throwException(exec, createUndefinedVariableError(exec, ident));
- VM_THROW_EXCEPTION_AT_END();
- return;
- }
-
- PutPropertySlot slot(codeBlock->isStrictMode());
- scope->methodTable()->put(scope, exec, ident, value, slot);
-
- if (exec->vm().exception()) {
- VM_THROW_EXCEPTION_AT_END();
- return;
- }
-
- // Covers implicit globals. Since they don't exist until they first execute, we didn't know how to cache them at compile time.
- if (modeAndType.type() == GlobalProperty || modeAndType.type() == GlobalPropertyWithVarInjectionChecks) {
- if (slot.isCacheable() && slot.base() == scope && scope->structure()->propertyAccessesAreCacheable()) {
- ConcurrentJITLocker locker(codeBlock->m_lock);
- pc[5].u.structure.set(exec->vm(), codeBlock->ownerExecutable(), scope->structure());
- pc[6].u.operand = slot.cachedOffset();
- }
- }
-}
-
} // namespace JSC
#endif // ENABLE(JIT)
Modified: trunk/Source/_javascript_Core/jit/JITStubs.h (157438 => 157439)
--- trunk/Source/_javascript_Core/jit/JITStubs.h 2013-10-15 02:47:38 UTC (rev 157438)
+++ trunk/Source/_javascript_Core/jit/JITStubs.h 2013-10-15 03:03:45 UTC (rev 157439)
@@ -360,16 +360,9 @@
#if ENABLE(DFG_JIT)
void JIT_STUB cti_optimize(STUB_ARGS_DECLARATION) WTF_INTERNAL;
#endif
-void* JIT_STUB cti_op_switch_char(STUB_ARGS_DECLARATION) WTF_INTERNAL;
-void* JIT_STUB cti_op_switch_imm(STUB_ARGS_DECLARATION) WTF_INTERNAL;
-void* JIT_STUB cti_op_switch_string(STUB_ARGS_DECLARATION) WTF_INTERNAL;
void* JIT_STUB cti_op_throw(STUB_ARGS_DECLARATION) WTF_INTERNAL;
void* JIT_STUB cti_vm_throw(STUB_ARGS_DECLARATION) REFERENCED_FROM_ASM WTF_INTERNAL;
-EncodedJSValue JIT_STUB cti_op_resolve_scope(STUB_ARGS_DECLARATION) WTF_INTERNAL;
-EncodedJSValue JIT_STUB cti_op_get_from_scope(STUB_ARGS_DECLARATION) WTF_INTERNAL;
-void JIT_STUB cti_op_put_to_scope(STUB_ARGS_DECLARATION) WTF_INTERNAL;
-
#if USE(JSVALUE32_64)
EncodedExceptionHandler JIT_STUB cti_vm_handle_exception(CallFrame*) REFERENCED_FROM_ASM WTF_INTERNAL;
#else