diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/runtime/CommonSlowPaths.h | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-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.h | 194 |
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 |