Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (255039 => 255040)
--- trunk/Source/_javascript_Core/ChangeLog 2020-01-23 22:49:15 UTC (rev 255039)
+++ trunk/Source/_javascript_Core/ChangeLog 2020-01-23 23:25:32 UTC (rev 255040)
@@ -1,3 +1,21 @@
+2020-01-23 Robin Morisset <rmoris...@apple.com>
+
+ Don't include BytecodeStructs.h in CommonSlowPaths.h
+ https://bugs.webkit.org/show_bug.cgi?id=206566
+
+ Reviewed by Tadeu Zagallo.
+
+ Simple improvement to compile times.
+
+ * _javascript_Core.xcodeproj/project.pbxproj:
+ * dfg/DFGOSREntry.cpp:
+ * jit/JIT.h:
+ * jit/JITInlines.h:
+ * jit/JITOperations.cpp:
+ * llint/LLIntSlowPaths.cpp:
+ * runtime/CommonSlowPaths.h:
+ * wasm/WasmSlowPaths.cpp:
+
2020-01-23 Saam Barati <sbar...@apple.com>
OptimizeAssociativeExpressionTrees should reset value owners before running
Modified: trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj (255039 => 255040)
--- trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2020-01-23 22:49:15 UTC (rev 255039)
+++ trunk/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj 2020-01-23 23:25:32 UTC (rev 255040)
@@ -867,6 +867,7 @@
2AF7382D18BBBF92008A5A37 /* StructureIDTable.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AF7382B18BBBF92008A5A37 /* StructureIDTable.h */; settings = {ATTRIBUTES = (Private, ); }; };
2D342F36F7244096804ADB24 /* SourceOrigin.h in Headers */ = {isa = PBXBuildFile; fileRef = 425BA1337E4344E1B269A671 /* SourceOrigin.h */; settings = {ATTRIBUTES = (Private, ); }; };
3395C70722555F6D00BDBFAD /* B3EliminateDeadCode.h in Headers */ = {isa = PBXBuildFile; fileRef = 3395C70522555F6D00BDBFAD /* B3EliminateDeadCode.h */; };
+ 33A920BD23DA2C6D000EBAF0 /* CommonSlowPathsInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 33A920BC23DA2C6D000EBAF0 /* CommonSlowPathsInlines.h */; settings = {ATTRIBUTES = (Private, ); }; };
33B2A54722653481005A0F79 /* B3ValueInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FEC84FB1BDACDAC0080FF74 /* B3ValueInlines.h */; };
33B2A548226543BF005A0F79 /* FTLLowerDFGToB3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FEA0A04170513DB00BB722C /* FTLLowerDFGToB3.cpp */; };
371D842D17C98B6E00ECF994 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 371D842C17C98B6E00ECF994 /* libz.dylib */; };
@@ -3508,6 +3509,7 @@
3374364A224D79EF00C8C227 /* B3OptimizeAssociativeExpressionTrees.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = B3OptimizeAssociativeExpressionTrees.h; path = b3/B3OptimizeAssociativeExpressionTrees.h; sourceTree = "<group>"; };
3395C70422555F6C00BDBFAD /* B3EliminateDeadCode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = B3EliminateDeadCode.cpp; path = b3/B3EliminateDeadCode.cpp; sourceTree = "<group>"; };
3395C70522555F6D00BDBFAD /* B3EliminateDeadCode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3EliminateDeadCode.h; path = b3/B3EliminateDeadCode.h; sourceTree = "<group>"; };
+ 33A920BC23DA2C6D000EBAF0 /* CommonSlowPathsInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommonSlowPathsInlines.h; sourceTree = "<group>"; };
33B2A54522651D53005A0F79 /* MarkedSpace.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = MarkedSpace.cpp; sourceTree = "<group>"; };
37119A7720CCB5DC002C6DC9 /* WebKitTargetConditionals.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = WebKitTargetConditionals.xcconfig; sourceTree = "<group>"; };
371D842C17C98B6E00ECF994 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
@@ -4834,10 +4836,6 @@
CE20BD02237D3AD40046E520 /* PredictionFileCreatingFuzzerAgent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = PredictionFileCreatingFuzzerAgent.cpp; sourceTree = "<group>"; };
CE20BD03237D3AD40046E520 /* FileBasedFuzzerAgentBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FileBasedFuzzerAgentBase.h; sourceTree = "<group>"; };
CE20BD04237D3AD40046E520 /* FileBasedFuzzerAgentBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FileBasedFuzzerAgentBase.cpp; sourceTree = "<group>"; };
- CECFAD322372DAA700291599 /* FileBasedFuzzerAgent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FileBasedFuzzerAgent.h; sourceTree = "<group>"; };
- CECFAD332372DAA700291599 /* FileBasedFuzzerAgent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FileBasedFuzzerAgent.cpp; sourceTree = "<group>"; };
- CECFAD342372DAA700291599 /* FuzzerPredictions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FuzzerPredictions.h; sourceTree = "<group>"; };
- CECFAD352372DAA700291599 /* FuzzerPredictions.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FuzzerPredictions.cpp; sourceTree = "<group>"; };
CE27A3D523759BAC0089605E /* WideningNumberPredictionFuzzerAgent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WideningNumberPredictionFuzzerAgent.h; sourceTree = "<group>"; };
CE27A3D623759BAC0089605E /* WideningNumberPredictionFuzzerAgent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WideningNumberPredictionFuzzerAgent.cpp; sourceTree = "<group>"; };
CE27A3D723759BAC0089605E /* NarrowingNumberPredictionFuzzerAgent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = NarrowingNumberPredictionFuzzerAgent.cpp; sourceTree = "<group>"; };
@@ -4844,6 +4842,10 @@
CE27A3D823759BAC0089605E /* NarrowingNumberPredictionFuzzerAgent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NarrowingNumberPredictionFuzzerAgent.h; sourceTree = "<group>"; };
CE27A3D92375A6DC0089605E /* NumberPredictionFuzzerAgent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = NumberPredictionFuzzerAgent.cpp; sourceTree = "<group>"; };
CE27A3DA2375A6DC0089605E /* NumberPredictionFuzzerAgent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NumberPredictionFuzzerAgent.h; sourceTree = "<group>"; };
+ CECFAD322372DAA700291599 /* FileBasedFuzzerAgent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FileBasedFuzzerAgent.h; sourceTree = "<group>"; };
+ CECFAD332372DAA700291599 /* FileBasedFuzzerAgent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FileBasedFuzzerAgent.cpp; sourceTree = "<group>"; };
+ CECFAD342372DAA700291599 /* FuzzerPredictions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FuzzerPredictions.h; sourceTree = "<group>"; };
+ CECFAD352372DAA700291599 /* FuzzerPredictions.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FuzzerPredictions.cpp; sourceTree = "<group>"; };
D21202280AD4310C00ED79B6 /* DateConversion.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = DateConversion.cpp; sourceTree = "<group>"; };
D21202290AD4310C00ED79B6 /* DateConversion.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = DateConversion.h; sourceTree = "<group>"; };
DC00039019D8BE6F00023EB0 /* DFGPreciseLocalClobberize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGPreciseLocalClobberize.h; path = dfg/DFGPreciseLocalClobberize.h; sourceTree = "<group>"; };
@@ -7042,6 +7044,7 @@
65EA73630BAE35D1001BB560 /* CommonIdentifiers.h */,
A709F2F117A0AC2A00512E98 /* CommonSlowPaths.cpp */,
0F15F15D14B7A73A005DE37D /* CommonSlowPaths.h */,
+ 33A920BC23DA2C6D000EBAF0 /* CommonSlowPathsInlines.h */,
A7E5A3A51797432D00E893C0 /* CompilationResult.cpp */,
A7E5A3A61797432D00E893C0 /* CompilationResult.h */,
969A09220ED1E09C00F1F681 /* Completion.cpp */,
@@ -9383,6 +9386,7 @@
0F1FB3971E1AF7E300A9BE50 /* DFGWorklistInlines.h in Headers */,
0FE050181AA9091100D33B33 /* DirectArguments.h in Headers */,
0FE050161AA9091100D33B33 /* DirectArgumentsOffset.h in Headers */,
+ 33A920BD23DA2C6D000EBAF0 /* CommonSlowPathsInlines.h in Headers */,
969A07980ED1D3AE00F1F681 /* DirectEvalCodeCache.h in Headers */,
14386A751DD69895008652C4 /* DirectEvalExecutable.h in Headers */,
0F37308F1C0CD68500052BFA /* DisallowMacroScratchRegisterUsage.h in Headers */,
Modified: trunk/Source/_javascript_Core/dfg/DFGOSREntry.cpp (255039 => 255040)
--- trunk/Source/_javascript_Core/dfg/DFGOSREntry.cpp 2020-01-23 22:49:15 UTC (rev 255039)
+++ trunk/Source/_javascript_Core/dfg/DFGOSREntry.cpp 2020-01-23 23:25:32 UTC (rev 255040)
@@ -28,6 +28,7 @@
#if ENABLE(DFG_JIT)
+#include "BytecodeStructs.h"
#include "CallFrame.h"
#include "CodeBlock.h"
#include "DFGJITCode.h"
Modified: trunk/Source/_javascript_Core/jit/JIT.h (255039 => 255040)
--- trunk/Source/_javascript_Core/jit/JIT.h 2020-01-23 22:49:15 UTC (rev 255039)
+++ trunk/Source/_javascript_Core/jit/JIT.h 2020-01-23 23:25:32 UTC (rev 255040)
@@ -68,6 +68,10 @@
struct SimpleJumpTable;
struct StringJumpTable;
+ struct OpPutByVal;
+ struct OpPutByValDirect;
+ struct OpPutToScope;
+
struct CallRecord {
MacroAssembler::Call from;
BytecodeIndex bytecodeIndex;
Modified: trunk/Source/_javascript_Core/jit/JITInlines.h (255039 => 255040)
--- trunk/Source/_javascript_Core/jit/JITInlines.h 2020-01-23 22:49:15 UTC (rev 255039)
+++ trunk/Source/_javascript_Core/jit/JITInlines.h 2020-01-23 23:25:32 UTC (rev 255040)
@@ -26,6 +26,7 @@
#pragma once
#if ENABLE(JIT)
+#include "CommonSlowPathsInlines.h"
#include "JSCInlines.h"
namespace JSC {
Modified: trunk/Source/_javascript_Core/jit/JITOperations.cpp (255039 => 255040)
--- trunk/Source/_javascript_Core/jit/JITOperations.cpp 2020-01-23 22:49:15 UTC (rev 255039)
+++ trunk/Source/_javascript_Core/jit/JITOperations.cpp 2020-01-23 23:25:32 UTC (rev 255040)
@@ -31,7 +31,7 @@
#include "ArithProfile.h"
#include "ArrayConstructor.h"
#include "CacheableIdentifierInlines.h"
-#include "CommonSlowPaths.h"
+#include "CommonSlowPathsInlines.h"
#include "DFGCompilationMode.h"
#include "DFGDriver.h"
#include "DFGOSREntry.h"
Modified: trunk/Source/_javascript_Core/llint/LLIntSlowPaths.cpp (255039 => 255040)
--- trunk/Source/_javascript_Core/llint/LLIntSlowPaths.cpp 2020-01-23 22:49:15 UTC (rev 255039)
+++ trunk/Source/_javascript_Core/llint/LLIntSlowPaths.cpp 2020-01-23 23:25:32 UTC (rev 255040)
@@ -30,7 +30,7 @@
#include "BytecodeGenerator.h"
#include "CallFrame.h"
#include "CheckpointOSRExitSideState.h"
-#include "CommonSlowPaths.h"
+#include "CommonSlowPathsInlines.h"
#include "Error.h"
#include "ErrorHandlingScope.h"
#include "EvalCodeBlock.h"
Modified: trunk/Source/_javascript_Core/runtime/CommonSlowPaths.h (255039 => 255040)
--- trunk/Source/_javascript_Core/runtime/CommonSlowPaths.h 2020-01-23 22:49:15 UTC (rev 255039)
+++ trunk/Source/_javascript_Core/runtime/CommonSlowPaths.h 2020-01-23 23:25:32 UTC (rev 255040)
@@ -25,7 +25,6 @@
#pragma once
-#include "BytecodeStructs.h"
#include "CodeBlock.h"
#include "CodeSpecializationKind.h"
#include "DirectArguments.h"
@@ -117,123 +116,6 @@
RELEASE_AND_RETURN(scope, baseObj->hasProperty(globalObject, property));
}
-inline void tryCachePutToScopeGlobal(
- JSGlobalObject* globalObject, CodeBlock* codeBlock, OpPutToScope& bytecode, JSObject* scope,
- PutPropertySlot& slot, const Identifier& ident)
-{
- // Covers implicit globals. Since they don't exist until they first execute, we didn't know how to cache them at compile time.
- auto& metadata = bytecode.metadata(codeBlock);
- ResolveType resolveType = metadata.m_getPutInfo.resolveType();
-
- switch (resolveType) {
- case UnresolvedProperty:
- case UnresolvedPropertyWithVarInjectionChecks: {
- if (scope->isGlobalObject()) {
- ResolveType newResolveType = needsVarInjectionChecks(resolveType) ? GlobalPropertyWithVarInjectionChecks : GlobalProperty;
- resolveType = newResolveType; // Allow below caching mechanism to kick in.
- ConcurrentJSLocker locker(codeBlock->m_lock);
- metadata.m_getPutInfo = GetPutInfo(metadata.m_getPutInfo.resolveMode(), newResolveType, metadata.m_getPutInfo.initializationMode());
- break;
- }
- FALLTHROUGH;
- }
- case GlobalProperty:
- case GlobalPropertyWithVarInjectionChecks: {
- // Global Lexical Binding Epoch is changed. Update op_get_from_scope from GlobalProperty to GlobalLexicalVar.
- if (scope->isGlobalLexicalEnvironment()) {
- JSGlobalLexicalEnvironment* globalLexicalEnvironment = jsCast<JSGlobalLexicalEnvironment*>(scope);
- ResolveType newResolveType = needsVarInjectionChecks(resolveType) ? GlobalLexicalVarWithVarInjectionChecks : GlobalLexicalVar;
- SymbolTableEntry entry = globalLexicalEnvironment->symbolTable()->get(ident.impl());
- ASSERT(!entry.isNull());
- ConcurrentJSLocker locker(codeBlock->m_lock);
- metadata.m_getPutInfo = GetPutInfo(metadata.m_getPutInfo.resolveMode(), newResolveType, metadata.m_getPutInfo.initializationMode());
- metadata.m_watchpointSet = entry.watchpointSet();
- metadata.m_operand = reinterpret_cast<uintptr_t>(globalLexicalEnvironment->variableAt(entry.scopeOffset()).slot());
- return;
- }
- break;
- }
- default:
- return;
- }
-
- if (resolveType == GlobalProperty || resolveType == GlobalPropertyWithVarInjectionChecks) {
- VM& vm = getVM(globalObject);
- JSGlobalObject* globalObject = codeBlock->globalObject();
- ASSERT(globalObject == scope || globalObject->varInjectionWatchpoint()->hasBeenInvalidated());
- if (!slot.isCacheablePut()
- || slot.base() != scope
- || scope != globalObject
- || !scope->structure(vm)->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(vm)->didCachePropertyReplacement(vm, slot.cachedOffset());
-
- ConcurrentJSLocker locker(codeBlock->m_lock);
- metadata.m_structure.set(vm, codeBlock, scope->structure(vm));
- metadata.m_operand = slot.cachedOffset();
- }
-}
-
-inline void tryCacheGetFromScopeGlobal(
- JSGlobalObject* globalObject, CodeBlock* codeBlock, VM& vm, OpGetFromScope& bytecode, JSObject* scope, PropertySlot& slot, const Identifier& ident)
-{
- auto& metadata = bytecode.metadata(codeBlock);
- ResolveType resolveType = metadata.m_getPutInfo.resolveType();
-
- switch (resolveType) {
- case UnresolvedProperty:
- case UnresolvedPropertyWithVarInjectionChecks: {
- if (scope->isGlobalObject()) {
- ResolveType newResolveType = needsVarInjectionChecks(resolveType) ? GlobalPropertyWithVarInjectionChecks : GlobalProperty;
- resolveType = newResolveType; // Allow below caching mechanism to kick in.
- ConcurrentJSLocker locker(codeBlock->m_lock);
- metadata.m_getPutInfo = GetPutInfo(metadata.m_getPutInfo.resolveMode(), newResolveType, metadata.m_getPutInfo.initializationMode());
- break;
- }
- FALLTHROUGH;
- }
- case GlobalProperty:
- case GlobalPropertyWithVarInjectionChecks: {
- // Global Lexical Binding Epoch is changed. Update op_get_from_scope from GlobalProperty to GlobalLexicalVar.
- if (scope->isGlobalLexicalEnvironment()) {
- JSGlobalLexicalEnvironment* globalLexicalEnvironment = jsCast<JSGlobalLexicalEnvironment*>(scope);
- ResolveType newResolveType = needsVarInjectionChecks(resolveType) ? GlobalLexicalVarWithVarInjectionChecks : GlobalLexicalVar;
- SymbolTableEntry entry = globalLexicalEnvironment->symbolTable()->get(ident.impl());
- ASSERT(!entry.isNull());
- ConcurrentJSLocker locker(codeBlock->m_lock);
- metadata.m_getPutInfo = GetPutInfo(metadata.m_getPutInfo.resolveMode(), newResolveType, metadata.m_getPutInfo.initializationMode());
- metadata.m_watchpointSet = entry.watchpointSet();
- metadata.m_operand = reinterpret_cast<uintptr_t>(globalLexicalEnvironment->variableAt(entry.scopeOffset()).slot());
- return;
- }
- break;
- }
- default:
- 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 (resolveType == GlobalProperty || resolveType == GlobalPropertyWithVarInjectionChecks) {
- ASSERT(scope == globalObject || globalObject->varInjectionWatchpoint()->hasBeenInvalidated());
- if (slot.isCacheableValue() && slot.slotBase() == scope && scope == globalObject && scope->structure(vm)->propertyAccessesAreCacheable()) {
- Structure* structure = scope->structure(vm);
- {
- ConcurrentJSLocker locker(codeBlock->m_lock);
- metadata.m_structure.set(vm, codeBlock, structure);
- metadata.m_operand = slot.cachedOffset();
- }
- structure->startWatchingPropertyForReplacements(vm, slot.cachedOffset());
- }
- }
-}
-
inline bool canAccessArgumentIndexQuickly(JSObject& object, uint32_t index)
{
switch (object.type()) {
Added: trunk/Source/_javascript_Core/runtime/CommonSlowPathsInlines.h (0 => 255040)
--- trunk/Source/_javascript_Core/runtime/CommonSlowPathsInlines.h (rev 0)
+++ trunk/Source/_javascript_Core/runtime/CommonSlowPathsInlines.h 2020-01-23 23:25:32 UTC (rev 255040)
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2020 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "BytecodeStructs.h"
+#include "CommonSlowPaths.h"
+
+namespace JSC {
+
+namespace CommonSlowPaths {
+
+inline void tryCachePutToScopeGlobal(
+ JSGlobalObject* globalObject, CodeBlock* codeBlock, OpPutToScope& bytecode, JSObject* scope,
+ PutPropertySlot& slot, const Identifier& ident)
+{
+ // Covers implicit globals. Since they don't exist until they first execute, we didn't know how to cache them at compile time.
+ auto& metadata = bytecode.metadata(codeBlock);
+ ResolveType resolveType = metadata.m_getPutInfo.resolveType();
+
+ switch (resolveType) {
+ case UnresolvedProperty:
+ case UnresolvedPropertyWithVarInjectionChecks: {
+ if (scope->isGlobalObject()) {
+ ResolveType newResolveType = needsVarInjectionChecks(resolveType) ? GlobalPropertyWithVarInjectionChecks : GlobalProperty;
+ resolveType = newResolveType; // Allow below caching mechanism to kick in.
+ ConcurrentJSLocker locker(codeBlock->m_lock);
+ metadata.m_getPutInfo = GetPutInfo(metadata.m_getPutInfo.resolveMode(), newResolveType, metadata.m_getPutInfo.initializationMode());
+ break;
+ }
+ FALLTHROUGH;
+ }
+ case GlobalProperty:
+ case GlobalPropertyWithVarInjectionChecks: {
+ // Global Lexical Binding Epoch is changed. Update op_get_from_scope from GlobalProperty to GlobalLexicalVar.
+ if (scope->isGlobalLexicalEnvironment()) {
+ JSGlobalLexicalEnvironment* globalLexicalEnvironment = jsCast<JSGlobalLexicalEnvironment*>(scope);
+ ResolveType newResolveType = needsVarInjectionChecks(resolveType) ? GlobalLexicalVarWithVarInjectionChecks : GlobalLexicalVar;
+ SymbolTableEntry entry = globalLexicalEnvironment->symbolTable()->get(ident.impl());
+ ASSERT(!entry.isNull());
+ ConcurrentJSLocker locker(codeBlock->m_lock);
+ metadata.m_getPutInfo = GetPutInfo(metadata.m_getPutInfo.resolveMode(), newResolveType, metadata.m_getPutInfo.initializationMode());
+ metadata.m_watchpointSet = entry.watchpointSet();
+ metadata.m_operand = reinterpret_cast<uintptr_t>(globalLexicalEnvironment->variableAt(entry.scopeOffset()).slot());
+ return;
+ }
+ break;
+ }
+ default:
+ return;
+ }
+
+ if (resolveType == GlobalProperty || resolveType == GlobalPropertyWithVarInjectionChecks) {
+ VM& vm = getVM(globalObject);
+ JSGlobalObject* globalObject = codeBlock->globalObject();
+ ASSERT(globalObject == scope || globalObject->varInjectionWatchpoint()->hasBeenInvalidated());
+ if (!slot.isCacheablePut()
+ || slot.base() != scope
+ || scope != globalObject
+ || !scope->structure(vm)->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(vm)->didCachePropertyReplacement(vm, slot.cachedOffset());
+
+ ConcurrentJSLocker locker(codeBlock->m_lock);
+ metadata.m_structure.set(vm, codeBlock, scope->structure(vm));
+ metadata.m_operand = slot.cachedOffset();
+ }
+}
+
+inline void tryCacheGetFromScopeGlobal(
+ JSGlobalObject* globalObject, CodeBlock* codeBlock, VM& vm, OpGetFromScope& bytecode, JSObject* scope, PropertySlot& slot, const Identifier& ident)
+{
+ auto& metadata = bytecode.metadata(codeBlock);
+ ResolveType resolveType = metadata.m_getPutInfo.resolveType();
+
+ switch (resolveType) {
+ case UnresolvedProperty:
+ case UnresolvedPropertyWithVarInjectionChecks: {
+ if (scope->isGlobalObject()) {
+ ResolveType newResolveType = needsVarInjectionChecks(resolveType) ? GlobalPropertyWithVarInjectionChecks : GlobalProperty;
+ resolveType = newResolveType; // Allow below caching mechanism to kick in.
+ ConcurrentJSLocker locker(codeBlock->m_lock);
+ metadata.m_getPutInfo = GetPutInfo(metadata.m_getPutInfo.resolveMode(), newResolveType, metadata.m_getPutInfo.initializationMode());
+ break;
+ }
+ FALLTHROUGH;
+ }
+ case GlobalProperty:
+ case GlobalPropertyWithVarInjectionChecks: {
+ // Global Lexical Binding Epoch is changed. Update op_get_from_scope from GlobalProperty to GlobalLexicalVar.
+ if (scope->isGlobalLexicalEnvironment()) {
+ JSGlobalLexicalEnvironment* globalLexicalEnvironment = jsCast<JSGlobalLexicalEnvironment*>(scope);
+ ResolveType newResolveType = needsVarInjectionChecks(resolveType) ? GlobalLexicalVarWithVarInjectionChecks : GlobalLexicalVar;
+ SymbolTableEntry entry = globalLexicalEnvironment->symbolTable()->get(ident.impl());
+ ASSERT(!entry.isNull());
+ ConcurrentJSLocker locker(codeBlock->m_lock);
+ metadata.m_getPutInfo = GetPutInfo(metadata.m_getPutInfo.resolveMode(), newResolveType, metadata.m_getPutInfo.initializationMode());
+ metadata.m_watchpointSet = entry.watchpointSet();
+ metadata.m_operand = reinterpret_cast<uintptr_t>(globalLexicalEnvironment->variableAt(entry.scopeOffset()).slot());
+ return;
+ }
+ break;
+ }
+ default:
+ 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 (resolveType == GlobalProperty || resolveType == GlobalPropertyWithVarInjectionChecks) {
+ ASSERT(scope == globalObject || globalObject->varInjectionWatchpoint()->hasBeenInvalidated());
+ if (slot.isCacheableValue() && slot.slotBase() == scope && scope == globalObject && scope->structure(vm)->propertyAccessesAreCacheable()) {
+ Structure* structure = scope->structure(vm);
+ {
+ ConcurrentJSLocker locker(codeBlock->m_lock);
+ metadata.m_structure.set(vm, codeBlock, structure);
+ metadata.m_operand = slot.cachedOffset();
+ }
+ structure->startWatchingPropertyForReplacements(vm, slot.cachedOffset());
+ }
+ }
+}
+
+}} // namespace JSC::CommonSlowPaths
Modified: trunk/Source/_javascript_Core/wasm/WasmSlowPaths.cpp (255039 => 255040)
--- trunk/Source/_javascript_Core/wasm/WasmSlowPaths.cpp 2020-01-23 22:49:15 UTC (rev 255039)
+++ trunk/Source/_javascript_Core/wasm/WasmSlowPaths.cpp 2020-01-23 23:25:32 UTC (rev 255040)
@@ -28,6 +28,7 @@
#if ENABLE(WEBASSEMBLY)
+#include "BytecodeStructs.h"
#include "ExceptionFuzz.h"
#include "FrameTracers.h"
#include "LLIntData.h"