summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/runtime/CommonSlowPaths.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
commit32761a6cee1d0dee366b885b7b9c777e67885688 (patch)
treed6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/runtime/CommonSlowPaths.h
parenta4e969f4965059196ca948db781e52f7cfebf19e (diff)
downloadWebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/JavaScriptCore/runtime/CommonSlowPaths.h')
-rw-r--r--Source/JavaScriptCore/runtime/CommonSlowPaths.h194
1 files changed, 75 insertions, 119 deletions
diff --git a/Source/JavaScriptCore/runtime/CommonSlowPaths.h b/Source/JavaScriptCore/runtime/CommonSlowPaths.h
index 98fe5db26..cfc8bdbb7 100644
--- a/Source/JavaScriptCore/runtime/CommonSlowPaths.h
+++ b/Source/JavaScriptCore/runtime/CommonSlowPaths.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011-2013, 2015 Apple Inc. All rights reserved.
+ * Copyright (C) 2011, 2012, 2013 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -30,12 +30,14 @@
#include "CodeSpecializationKind.h"
#include "ExceptionHelpers.h"
#include "JSStackInlines.h"
-#include "SlowPathReturnType.h"
+#include "NameInstance.h"
#include "StackAlignment.h"
-#include "Symbol.h"
#include "VM.h"
+#include <wtf/Platform.h>
#include <wtf/StdLibExtras.h>
+#if ENABLE(JIT) || ENABLE(LLINT)
+
namespace JSC {
// The purpose of this namespace is to include slow paths that are shared
@@ -47,11 +49,6 @@ namespace JSC {
namespace CommonSlowPaths {
-struct ArityCheckData {
- unsigned paddedStackSpace;
- void* thunkToCall;
-};
-
ALWAYS_INLINE int arityCheckFor(ExecState* exec, JSStack* stack, CodeSpecializationKind kind)
{
JSFunction* callee = jsCast<JSFunction*>(exec->callee());
@@ -60,20 +57,25 @@ ALWAYS_INLINE int arityCheckFor(ExecState* exec, JSStack* stack, CodeSpecializat
int argumentCountIncludingThis = exec->argumentCountIncludingThis();
ASSERT(argumentCountIncludingThis < newCodeBlock->numParameters());
- int frameSize = argumentCountIncludingThis + JSStack::CallFrameHeaderSize;
- int alignedFrameSizeForParameters = WTF::roundUpToMultipleOf(stackAlignmentRegisters(),
- newCodeBlock->numParameters() + JSStack::CallFrameHeaderSize);
- int paddedStackSpace = alignedFrameSizeForParameters - frameSize;
+ int missingArgumentCount = newCodeBlock->numParameters() - argumentCountIncludingThis;
+ int paddedMissingArgumentCount = WTF::roundUpToMultipleOf(stackAlignmentRegisters(), missingArgumentCount);
- if (!stack->ensureCapacityFor(exec->registers() - paddedStackSpace % stackAlignmentRegisters()))
+#if USE(SEPARATE_C_AND_JS_STACK)
+ if (!stack->grow(exec->registers() - paddedMissingArgumentCount))
+ return -1;
+#else
+ UNUSED_PARAM(stack);
+ if (!exec->vm().isSafeToRecurse(paddedMissingArgumentCount * sizeof(Register)))
return -1;
- return paddedStackSpace;
+#endif // USE(SEPARATE_C_AND_JS_STACK)
+
+ return paddedMissingArgumentCount;
}
inline bool opIn(ExecState* exec, JSValue propName, JSValue baseVal)
{
if (!baseVal.isObject()) {
- exec->vm().throwException(exec, createInvalidInParameterError(exec, baseVal));
+ exec->vm().throwException(exec, createInvalidParameterError(exec, "in", baseVal));
return false;
}
@@ -83,99 +85,71 @@ inline bool opIn(ExecState* exec, JSValue propName, JSValue baseVal)
if (propName.getUInt32(i))
return baseObj->hasProperty(exec, i);
- auto property = propName.toPropertyKey(exec);
+ if (isName(propName))
+ return baseObj->hasProperty(exec, jsCast<NameInstance*>(propName.asCell())->privateName());
+
+ Identifier property(exec, propName.toString(exec)->value(exec));
if (exec->vm().exception())
return false;
return baseObj->hasProperty(exec, property);
}
-inline void tryCachePutToScopeGlobal(
- ExecState* exec, CodeBlock* codeBlock, Instruction* pc, JSObject* scope,
- GetPutInfo getPutInfo, PutPropertySlot& slot, const Identifier& ident)
+} // namespace CommonSlowPaths
+
+class ExecState;
+struct Instruction;
+
+#if USE(JSVALUE64)
+// According to C++ rules, a type used for the return signature of function with C linkage (i.e.
+// 'extern "C"') needs to be POD; hence putting any constructors into it could cause either compiler
+// warnings, or worse, a change in the ABI used to return these types.
+struct SlowPathReturnType {
+ void* a;
+ void* b;
+};
+
+inline SlowPathReturnType encodeResult(void* a, void* b)
{
- // Covers implicit globals. Since they don't exist until they first execute, we didn't know how to cache them at compile time.
- ResolveType resolveType = getPutInfo.resolveType();
- if (resolveType != GlobalProperty && resolveType != GlobalPropertyWithVarInjectionChecks
- && resolveType != UnresolvedProperty && resolveType != UnresolvedPropertyWithVarInjectionChecks)
- return;
-
- if (resolveType == UnresolvedProperty || resolveType == UnresolvedPropertyWithVarInjectionChecks) {
- if (JSGlobalLexicalEnvironment* globalLexicalEnvironment = jsDynamicCast<JSGlobalLexicalEnvironment*>(scope)) {
- ResolveType newResolveType = resolveType == UnresolvedProperty ? GlobalLexicalVar : GlobalLexicalVarWithVarInjectionChecks;
- pc[4].u.operand = GetPutInfo(getPutInfo.resolveMode(), newResolveType, getPutInfo.initializationMode()).operand();
- SymbolTableEntry entry = globalLexicalEnvironment->symbolTable()->get(ident.impl());
- ASSERT(!entry.isNull());
- pc[5].u.watchpointSet = entry.watchpointSet();
- pc[6].u.pointer = static_cast<void*>(globalLexicalEnvironment->variableAt(entry.scopeOffset()).slot());
- } else if (jsDynamicCast<JSGlobalObject*>(scope)) {
- ResolveType newResolveType = resolveType == UnresolvedProperty ? GlobalProperty : GlobalPropertyWithVarInjectionChecks;
- resolveType = newResolveType;
- getPutInfo = GetPutInfo(getPutInfo.resolveMode(), newResolveType, getPutInfo.initializationMode());
- pc[4].u.operand = getPutInfo.operand();
- }
- }
-
- if (resolveType == GlobalProperty || resolveType == GlobalPropertyWithVarInjectionChecks) {
- if (!slot.isCacheablePut()
- || slot.base() != scope
- || !scope->structure()->propertyAccessesAreCacheable())
- return;
-
- if (slot.type() == PutPropertySlot::NewProperty) {
- // Don't cache if we've done a transition. We want to detect the first replace so that we
- // can invalidate the watchpoint.
- return;
- }
-
- scope->structure()->didCachePropertyReplacement(exec->vm(), slot.cachedOffset());
-
- ConcurrentJITLocker locker(codeBlock->m_lock);
- pc[5].u.structure.set(exec->vm(), codeBlock, scope->structure());
- pc[6].u.operand = slot.cachedOffset();
- }
+ SlowPathReturnType result;
+ result.a = a;
+ result.b = b;
+ return result;
}
-inline void tryCacheGetFromScopeGlobal(
- ExecState* exec, VM& vm, Instruction* pc, JSObject* scope, PropertySlot& slot, const Identifier& ident)
+inline void decodeResult(SlowPathReturnType result, void*& a, void*& b)
{
- GetPutInfo getPutInfo(pc[4].u.operand);
- ResolveType resolveType = getPutInfo.resolveType();
-
- if (resolveType == UnresolvedProperty || resolveType == UnresolvedPropertyWithVarInjectionChecks) {
- if (JSGlobalLexicalEnvironment* globalLexicalEnvironment = jsDynamicCast<JSGlobalLexicalEnvironment*>(scope)) {
- ResolveType newResolveType = resolveType == UnresolvedProperty ? GlobalLexicalVar : GlobalLexicalVarWithVarInjectionChecks;
- pc[4].u.operand = GetPutInfo(getPutInfo.resolveMode(), newResolveType, getPutInfo.initializationMode()).operand();
- SymbolTableEntry entry = globalLexicalEnvironment->symbolTable()->get(ident.impl());
- ASSERT(!entry.isNull());
- pc[5].u.watchpointSet = entry.watchpointSet();
- pc[6].u.pointer = static_cast<void*>(globalLexicalEnvironment->variableAt(entry.scopeOffset()).slot());
- } else if (jsDynamicCast<JSGlobalObject*>(scope)) {
- ResolveType newResolveType = resolveType == UnresolvedProperty ? GlobalProperty : GlobalPropertyWithVarInjectionChecks;
- resolveType = newResolveType; // Allow below caching mechanism to kick in.
- pc[4].u.operand = GetPutInfo(getPutInfo.resolveMode(), newResolveType, getPutInfo.initializationMode()).operand();
- }
- }
-
- // 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 (resolveType == GlobalProperty || resolveType == GlobalPropertyWithVarInjectionChecks) {
- CodeBlock* codeBlock = exec->codeBlock();
- Structure* structure = scope->structure(vm);
- {
- ConcurrentJITLocker locker(codeBlock->m_lock);
- pc[5].u.structure.set(exec->vm(), codeBlock, structure);
- pc[6].u.operand = slot.cachedOffset();
- }
- structure->startWatchingPropertyForReplacements(vm, slot.cachedOffset());
- }
- }
+ a = result.a;
+ b = result.b;
}
-} // namespace CommonSlowPaths
+#else // USE(JSVALUE32_64)
+typedef int64_t SlowPathReturnType;
-class ExecState;
-struct Instruction;
+typedef union {
+ struct {
+ void* a;
+ void* b;
+ } pair;
+ int64_t i;
+} SlowPathReturnTypeEncoding;
+inline SlowPathReturnType encodeResult(void* a, void* b)
+{
+ SlowPathReturnTypeEncoding u;
+ u.pair.a = a;
+ u.pair.b = b;
+ return u.i;
+}
+
+inline void decodeResult(SlowPathReturnType result, void*& a, void*& b)
+{
+ SlowPathReturnTypeEncoding u;
+ u.i = result;
+ a = u.pair.a;
+ b = u.pair.b;
+}
+#endif // USE(JSVALUE32_64)
+
#define SLOW_PATH
#define SLOW_PATH_DECL(name) \
@@ -186,15 +160,14 @@ SLOW_PATH_DECL(name) WTF_INTERNAL
SLOW_PATH_HIDDEN_DECL(slow_path_call_arityCheck);
SLOW_PATH_HIDDEN_DECL(slow_path_construct_arityCheck);
-SLOW_PATH_HIDDEN_DECL(slow_path_create_direct_arguments);
-SLOW_PATH_HIDDEN_DECL(slow_path_create_scoped_arguments);
-SLOW_PATH_HIDDEN_DECL(slow_path_create_out_of_band_arguments);
+SLOW_PATH_HIDDEN_DECL(slow_path_touch_entry);
+SLOW_PATH_HIDDEN_DECL(slow_path_create_arguments);
SLOW_PATH_HIDDEN_DECL(slow_path_create_this);
SLOW_PATH_HIDDEN_DECL(slow_path_enter);
SLOW_PATH_HIDDEN_DECL(slow_path_get_callee);
SLOW_PATH_HIDDEN_DECL(slow_path_to_this);
-SLOW_PATH_HIDDEN_DECL(slow_path_throw_tdz_error);
-SLOW_PATH_HIDDEN_DECL(slow_path_throw_strict_mode_readonly_property_write_error);
+SLOW_PATH_HIDDEN_DECL(slow_path_captured_mov);
+SLOW_PATH_HIDDEN_DECL(slow_path_new_captured_func);
SLOW_PATH_HIDDEN_DECL(slow_path_not);
SLOW_PATH_HIDDEN_DECL(slow_path_eq);
SLOW_PATH_HIDDEN_DECL(slow_path_neq);
@@ -207,7 +180,6 @@ SLOW_PATH_HIDDEN_DECL(slow_path_greatereq);
SLOW_PATH_HIDDEN_DECL(slow_path_inc);
SLOW_PATH_HIDDEN_DECL(slow_path_dec);
SLOW_PATH_HIDDEN_DECL(slow_path_to_number);
-SLOW_PATH_HIDDEN_DECL(slow_path_to_string);
SLOW_PATH_HIDDEN_DECL(slow_path_negate);
SLOW_PATH_HIDDEN_DECL(slow_path_add);
SLOW_PATH_HIDDEN_DECL(slow_path_mul);
@@ -223,30 +195,14 @@ SLOW_PATH_HIDDEN_DECL(slow_path_bitor);
SLOW_PATH_HIDDEN_DECL(slow_path_bitxor);
SLOW_PATH_HIDDEN_DECL(slow_path_typeof);
SLOW_PATH_HIDDEN_DECL(slow_path_is_object);
-SLOW_PATH_HIDDEN_DECL(slow_path_is_object_or_null);
SLOW_PATH_HIDDEN_DECL(slow_path_is_function);
SLOW_PATH_HIDDEN_DECL(slow_path_in);
SLOW_PATH_HIDDEN_DECL(slow_path_del_by_val);
SLOW_PATH_HIDDEN_DECL(slow_path_strcat);
SLOW_PATH_HIDDEN_DECL(slow_path_to_primitive);
-SLOW_PATH_HIDDEN_DECL(slow_path_get_enumerable_length);
-SLOW_PATH_HIDDEN_DECL(slow_path_has_generic_property);
-SLOW_PATH_HIDDEN_DECL(slow_path_has_structure_property);
-SLOW_PATH_HIDDEN_DECL(slow_path_has_indexed_property);
-SLOW_PATH_HIDDEN_DECL(slow_path_get_direct_pname);
-SLOW_PATH_HIDDEN_DECL(slow_path_get_property_enumerator);
-SLOW_PATH_HIDDEN_DECL(slow_path_next_structure_enumerator_pname);
-SLOW_PATH_HIDDEN_DECL(slow_path_next_generic_enumerator_pname);
-SLOW_PATH_HIDDEN_DECL(slow_path_to_index_string);
-SLOW_PATH_HIDDEN_DECL(slow_path_profile_type_clear_log);
-SLOW_PATH_HIDDEN_DECL(slow_path_assert);
-SLOW_PATH_HIDDEN_DECL(slow_path_save);
-SLOW_PATH_HIDDEN_DECL(slow_path_resume);
-SLOW_PATH_HIDDEN_DECL(slow_path_create_lexical_environment);
-SLOW_PATH_HIDDEN_DECL(slow_path_push_with_scope);
-SLOW_PATH_HIDDEN_DECL(slow_path_resolve_scope);
-SLOW_PATH_HIDDEN_DECL(slow_path_copy_rest);
} // namespace JSC
+#endif // ENABLE(JIT) || ENABLE(LLINT)
+
#endif // CommonSlowPaths_h