/*
- * Copyright (C) 2011, 2013, 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2011, 2013-2015 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
#include "CodeBlock.h"
#include "DFGCommon.h"
-#include "DFGFunctionWhitelist.h"
#include "Interpreter.h"
#include "JSCInlines.h"
#include "Options.h"
namespace JSC { namespace DFG {
-bool isSupported(CodeBlock* codeBlock)
+bool isSupported()
{
return Options::useDFGJIT()
- && MacroAssembler::supportsFloatingPoint()
- && Options::bytecodeRangeToDFGCompile().isInRange(codeBlock->instructionCount())
- && FunctionWhitelist::ensureGlobalWhitelist().contains(codeBlock);
+ && MacroAssembler::supportsFloatingPoint();
+}
+
+bool isSupportedForInlining(CodeBlock* codeBlock)
+{
+ return codeBlock->ownerExecutable()->isInliningCandidate();
}
bool mightCompileEval(CodeBlock* codeBlock)
{
- return isSupported(codeBlock)
+ return isSupported()
&& codeBlock->instructionCount() <= Options::maximumOptimizationCandidateInstructionCount();
}
bool mightCompileProgram(CodeBlock* codeBlock)
{
- return isSupported(codeBlock)
+ return isSupported()
&& codeBlock->instructionCount() <= Options::maximumOptimizationCandidateInstructionCount();
}
bool mightCompileFunctionForCall(CodeBlock* codeBlock)
{
- return isSupported(codeBlock)
+ return isSupported()
&& codeBlock->instructionCount() <= Options::maximumOptimizationCandidateInstructionCount();
}
bool mightCompileFunctionForConstruct(CodeBlock* codeBlock)
{
- return isSupported(codeBlock)
+ return isSupported()
&& codeBlock->instructionCount() <= Options::maximumOptimizationCandidateInstructionCount();
}
bool mightInlineFunctionForCall(CodeBlock* codeBlock)
{
return codeBlock->instructionCount() <= Options::maximumFunctionForCallInlineCandidateInstructionCount()
- && !codeBlock->ownerExecutable()->needsActivation()
- && codeBlock->ownerExecutable()->isInliningCandidate();
+ && isSupportedForInlining(codeBlock);
}
bool mightInlineFunctionForClosureCall(CodeBlock* codeBlock)
{
return codeBlock->instructionCount() <= Options::maximumFunctionForClosureCallInlineCandidateInstructionCount()
- && !codeBlock->ownerExecutable()->needsActivation()
- && codeBlock->ownerExecutable()->isInliningCandidate();
+ && isSupportedForInlining(codeBlock);
}
bool mightInlineFunctionForConstruct(CodeBlock* codeBlock)
{
return codeBlock->instructionCount() <= Options::maximumFunctionForConstructInlineCandidateInstructionCount()
- && !codeBlock->ownerExecutable()->needsActivation()
- && codeBlock->ownerExecutable()->isInliningCandidate();
+ && isSupportedForInlining(codeBlock);
}
inline void debugFail(CodeBlock* codeBlock, OpcodeID opcodeID, CapabilityLevel result)
CapabilityLevel capabilityLevel(OpcodeID opcodeID, CodeBlock* codeBlock, Instruction* pc)
{
+ UNUSED_PARAM(codeBlock); // This function does some bytecode parsing. Ordinarily bytecode parsing requires the owning CodeBlock. It's sort of strange that we don't use it here right now.
+
switch (opcodeID) {
case op_enter:
- case op_touch_entry:
case op_to_this:
+ case op_check_tdz:
case op_create_this:
- case op_get_callee:
case op_bitand:
case op_bitor:
case op_bitxor:
case op_debug:
case op_profile_will_call:
case op_profile_did_call:
+ case op_profile_type:
+ case op_profile_control_flow:
case op_mov:
- case op_captured_mov:
case op_check_has_instance:
case op_instanceof:
case op_is_undefined:
case op_is_number:
case op_is_string:
case op_is_object:
+ case op_is_object_or_null:
case op_is_function:
case op_not:
case op_less:
case op_throw_static_error:
case op_call:
case op_construct:
- case op_init_lazy_reg:
- case op_create_arguments:
- case op_tear_off_arguments:
- case op_get_argument_by_val:
- case op_get_arguments_length:
+ case op_call_varargs:
+ case op_construct_varargs:
+ case op_create_direct_arguments:
+ case op_create_scoped_arguments:
+ case op_create_out_of_band_arguments:
+ case op_get_from_arguments:
+ case op_put_to_arguments:
case op_jneq_ptr:
case op_typeof:
case op_to_number:
+ case op_to_string:
case op_switch_imm:
case op_switch_char:
case op_in:
+ case op_get_scope:
case op_get_from_scope:
+ case op_get_enumerable_length:
+ case op_has_generic_property:
+ case op_has_structure_property:
+ case op_has_indexed_property:
+ case op_get_direct_pname:
+ case op_get_property_enumerator:
+ case op_enumerator_structure_pname:
+ case op_enumerator_generic_pname:
+ case op_to_index_string:
+ case op_new_func:
+ case op_new_func_exp:
+ case op_create_lexical_environment:
return CanCompileAndInline;
case op_put_to_scope: {
case op_resolve_scope: {
// We don't compile 'catch' or 'with', so there's no point in compiling variable resolution within them.
- ResolveType resolveType = ResolveModeAndType(pc[3].u.operand).type();
+ ResolveType resolveType = ResolveModeAndType(pc[4].u.operand).type();
if (resolveType == Dynamic)
return CannotCompile;
return CanCompileAndInline;
}
- case op_call_varargs:
- if (codeBlock->usesArguments() && pc[4].u.operand == codeBlock->argumentsRegister().offset()
- && !pc[6].u.operand)
- return CanInline;
- // FIXME: We should handle this.
- // https://bugs.webkit.org/show_bug.cgi?id=127626
- return CannotCompile;
-
- case op_new_regexp:
- case op_create_activation:
- case op_tear_off_activation:
- case op_new_func:
- case op_new_captured_func:
- case op_new_func_exp:
+ case op_new_regexp:
case op_switch_string: // Don't inline because we don't want to copy string tables in the concurrent JIT.
return CanCompile;