Changeset 208309 in webkit for trunk/Source/JavaScriptCore/bytecode/CodeBlock.h
- Timestamp:
- Nov 2, 2016, 3:19:39 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecode/CodeBlock.h
r208063 r208309 1051 1051 }; 1052 1052 1053 // Program code is not marked by any function, so we make the global object1054 // responsible for marking it.1055 1056 class GlobalCodeBlock : public CodeBlock {1057 typedef CodeBlock Base;1058 DECLARE_INFO;1059 1060 protected:1061 GlobalCodeBlock(VM* vm, Structure* structure, CopyParsedBlockTag, GlobalCodeBlock& other)1062 : CodeBlock(vm, structure, CopyParsedBlock, other)1063 {1064 }1065 1066 GlobalCodeBlock(VM* vm, Structure* structure, ScriptExecutable* ownerExecutable, UnlinkedCodeBlock* unlinkedCodeBlock, JSScope* scope, PassRefPtr<SourceProvider> sourceProvider, unsigned sourceOffset, unsigned firstLineColumnOffset)1067 : CodeBlock(vm, structure, ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, sourceOffset, firstLineColumnOffset)1068 {1069 }1070 };1071 1072 class ProgramCodeBlock : public GlobalCodeBlock {1073 public:1074 typedef GlobalCodeBlock Base;1075 DECLARE_INFO;1076 1077 static ProgramCodeBlock* create(VM* vm, CopyParsedBlockTag, ProgramCodeBlock& other)1078 {1079 ProgramCodeBlock* instance = new (NotNull, allocateCell<ProgramCodeBlock>(vm->heap))1080 ProgramCodeBlock(vm, vm->programCodeBlockStructure.get(), CopyParsedBlock, other);1081 instance->finishCreation(*vm, CopyParsedBlock, other);1082 return instance;1083 }1084 1085 static ProgramCodeBlock* create(VM* vm, ProgramExecutable* ownerExecutable, UnlinkedProgramCodeBlock* unlinkedCodeBlock,1086 JSScope* scope, PassRefPtr<SourceProvider> sourceProvider, unsigned firstLineColumnOffset)1087 {1088 ProgramCodeBlock* instance = new (NotNull, allocateCell<ProgramCodeBlock>(vm->heap))1089 ProgramCodeBlock(vm, vm->programCodeBlockStructure.get(), ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, firstLineColumnOffset);1090 instance->finishCreation(*vm, ownerExecutable, unlinkedCodeBlock, scope);1091 return instance;1092 }1093 1094 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)1095 {1096 return Structure::create(vm, globalObject, prototype, TypeInfo(CellType, StructureFlags), info());1097 }1098 1099 private:1100 ProgramCodeBlock(VM* vm, Structure* structure, CopyParsedBlockTag, ProgramCodeBlock& other)1101 : GlobalCodeBlock(vm, structure, CopyParsedBlock, other)1102 {1103 }1104 1105 ProgramCodeBlock(VM* vm, Structure* structure, ProgramExecutable* ownerExecutable, UnlinkedProgramCodeBlock* unlinkedCodeBlock,1106 JSScope* scope, PassRefPtr<SourceProvider> sourceProvider, unsigned firstLineColumnOffset)1107 : GlobalCodeBlock(vm, structure, ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, 0, firstLineColumnOffset)1108 {1109 }1110 1111 static void destroy(JSCell*);1112 };1113 1114 class ModuleProgramCodeBlock : public GlobalCodeBlock {1115 public:1116 typedef GlobalCodeBlock Base;1117 DECLARE_INFO;1118 1119 static ModuleProgramCodeBlock* create(VM* vm, CopyParsedBlockTag, ModuleProgramCodeBlock& other)1120 {1121 ModuleProgramCodeBlock* instance = new (NotNull, allocateCell<ModuleProgramCodeBlock>(vm->heap))1122 ModuleProgramCodeBlock(vm, vm->moduleProgramCodeBlockStructure.get(), CopyParsedBlock, other);1123 instance->finishCreation(*vm, CopyParsedBlock, other);1124 return instance;1125 }1126 1127 static ModuleProgramCodeBlock* create(VM* vm, ModuleProgramExecutable* ownerExecutable, UnlinkedModuleProgramCodeBlock* unlinkedCodeBlock,1128 JSScope* scope, PassRefPtr<SourceProvider> sourceProvider, unsigned firstLineColumnOffset)1129 {1130 ModuleProgramCodeBlock* instance = new (NotNull, allocateCell<ModuleProgramCodeBlock>(vm->heap))1131 ModuleProgramCodeBlock(vm, vm->moduleProgramCodeBlockStructure.get(), ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, firstLineColumnOffset);1132 instance->finishCreation(*vm, ownerExecutable, unlinkedCodeBlock, scope);1133 return instance;1134 }1135 1136 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)1137 {1138 return Structure::create(vm, globalObject, prototype, TypeInfo(CellType, StructureFlags), info());1139 }1140 1141 private:1142 ModuleProgramCodeBlock(VM* vm, Structure* structure, CopyParsedBlockTag, ModuleProgramCodeBlock& other)1143 : GlobalCodeBlock(vm, structure, CopyParsedBlock, other)1144 {1145 }1146 1147 ModuleProgramCodeBlock(VM* vm, Structure* structure, ModuleProgramExecutable* ownerExecutable, UnlinkedModuleProgramCodeBlock* unlinkedCodeBlock,1148 JSScope* scope, PassRefPtr<SourceProvider> sourceProvider, unsigned firstLineColumnOffset)1149 : GlobalCodeBlock(vm, structure, ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, 0, firstLineColumnOffset)1150 {1151 }1152 1153 static void destroy(JSCell*);1154 };1155 1156 class EvalCodeBlock : public GlobalCodeBlock {1157 public:1158 typedef GlobalCodeBlock Base;1159 DECLARE_INFO;1160 1161 static EvalCodeBlock* create(VM* vm, CopyParsedBlockTag, EvalCodeBlock& other)1162 {1163 EvalCodeBlock* instance = new (NotNull, allocateCell<EvalCodeBlock>(vm->heap))1164 EvalCodeBlock(vm, vm->evalCodeBlockStructure.get(), CopyParsedBlock, other);1165 instance->finishCreation(*vm, CopyParsedBlock, other);1166 return instance;1167 }1168 1169 static EvalCodeBlock* create(VM* vm, EvalExecutable* ownerExecutable, UnlinkedEvalCodeBlock* unlinkedCodeBlock,1170 JSScope* scope, PassRefPtr<SourceProvider> sourceProvider)1171 {1172 EvalCodeBlock* instance = new (NotNull, allocateCell<EvalCodeBlock>(vm->heap))1173 EvalCodeBlock(vm, vm->evalCodeBlockStructure.get(), ownerExecutable, unlinkedCodeBlock, scope, sourceProvider);1174 instance->finishCreation(*vm, ownerExecutable, unlinkedCodeBlock, scope);1175 return instance;1176 }1177 1178 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)1179 {1180 return Structure::create(vm, globalObject, prototype, TypeInfo(CellType, StructureFlags), info());1181 }1182 1183 const Identifier& variable(unsigned index) { return unlinkedEvalCodeBlock()->variable(index); }1184 unsigned numVariables() { return unlinkedEvalCodeBlock()->numVariables(); }1185 1186 private:1187 EvalCodeBlock(VM* vm, Structure* structure, CopyParsedBlockTag, EvalCodeBlock& other)1188 : GlobalCodeBlock(vm, structure, CopyParsedBlock, other)1189 {1190 }1191 1192 EvalCodeBlock(VM* vm, Structure* structure, EvalExecutable* ownerExecutable, UnlinkedEvalCodeBlock* unlinkedCodeBlock,1193 JSScope* scope, PassRefPtr<SourceProvider> sourceProvider)1194 : GlobalCodeBlock(vm, structure, ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, 0, 1)1195 {1196 }1197 1198 static void destroy(JSCell*);1199 1200 private:1201 UnlinkedEvalCodeBlock* unlinkedEvalCodeBlock() const { return jsCast<UnlinkedEvalCodeBlock*>(unlinkedCodeBlock()); }1202 };1203 1204 class FunctionCodeBlock : public CodeBlock {1205 public:1206 typedef CodeBlock Base;1207 DECLARE_INFO;1208 1209 static FunctionCodeBlock* create(VM* vm, CopyParsedBlockTag, FunctionCodeBlock& other)1210 {1211 FunctionCodeBlock* instance = new (NotNull, allocateCell<FunctionCodeBlock>(vm->heap))1212 FunctionCodeBlock(vm, vm->functionCodeBlockStructure.get(), CopyParsedBlock, other);1213 instance->finishCreation(*vm, CopyParsedBlock, other);1214 return instance;1215 }1216 1217 static FunctionCodeBlock* create(VM* vm, FunctionExecutable* ownerExecutable, UnlinkedFunctionCodeBlock* unlinkedCodeBlock, JSScope* scope,1218 PassRefPtr<SourceProvider> sourceProvider, unsigned sourceOffset, unsigned firstLineColumnOffset)1219 {1220 FunctionCodeBlock* instance = new (NotNull, allocateCell<FunctionCodeBlock>(vm->heap))1221 FunctionCodeBlock(vm, vm->functionCodeBlockStructure.get(), ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, sourceOffset, firstLineColumnOffset);1222 instance->finishCreation(*vm, ownerExecutable, unlinkedCodeBlock, scope);1223 return instance;1224 }1225 1226 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)1227 {1228 return Structure::create(vm, globalObject, prototype, TypeInfo(CellType, StructureFlags), info());1229 }1230 1231 private:1232 FunctionCodeBlock(VM* vm, Structure* structure, CopyParsedBlockTag, FunctionCodeBlock& other)1233 : CodeBlock(vm, structure, CopyParsedBlock, other)1234 {1235 }1236 1237 FunctionCodeBlock(VM* vm, Structure* structure, FunctionExecutable* ownerExecutable, UnlinkedFunctionCodeBlock* unlinkedCodeBlock, JSScope* scope,1238 PassRefPtr<SourceProvider> sourceProvider, unsigned sourceOffset, unsigned firstLineColumnOffset)1239 : CodeBlock(vm, structure, ownerExecutable, unlinkedCodeBlock, scope, sourceProvider, sourceOffset, firstLineColumnOffset)1240 {1241 }1242 1243 static void destroy(JSCell*);1244 };1245 1246 #if ENABLE(WEBASSEMBLY)1247 class WebAssemblyCodeBlock : public CodeBlock {1248 public:1249 typedef CodeBlock Base;1250 DECLARE_INFO;1251 1252 static WebAssemblyCodeBlock* create(VM* vm, CopyParsedBlockTag, WebAssemblyCodeBlock& other)1253 {1254 WebAssemblyCodeBlock* instance = new (NotNull, allocateCell<WebAssemblyCodeBlock>(vm->heap))1255 WebAssemblyCodeBlock(vm, vm->webAssemblyCodeBlockStructure.get(), CopyParsedBlock, other);1256 instance->finishCreation(*vm, CopyParsedBlock, other);1257 return instance;1258 }1259 1260 static WebAssemblyCodeBlock* create(VM* vm, WebAssemblyExecutable* ownerExecutable, JSGlobalObject* globalObject)1261 {1262 WebAssemblyCodeBlock* instance = new (NotNull, allocateCell<WebAssemblyCodeBlock>(vm->heap))1263 WebAssemblyCodeBlock(vm, vm->webAssemblyCodeBlockStructure.get(), ownerExecutable, globalObject);1264 instance->finishCreation(*vm, ownerExecutable, globalObject);1265 return instance;1266 }1267 1268 static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)1269 {1270 return Structure::create(vm, globalObject, prototype, TypeInfo(CellType, StructureFlags), info());1271 }1272 1273 private:1274 WebAssemblyCodeBlock(VM* vm, Structure* structure, CopyParsedBlockTag, WebAssemblyCodeBlock& other)1275 : CodeBlock(vm, structure, CopyParsedBlock, other)1276 {1277 }1278 1279 WebAssemblyCodeBlock(VM* vm, Structure* structure, WebAssemblyExecutable* ownerExecutable, JSGlobalObject* globalObject)1280 : CodeBlock(vm, structure, ownerExecutable, globalObject)1281 {1282 }1283 1284 static void destroy(JSCell*);1285 };1286 #endif1287 1288 1053 inline Register& ExecState::r(int index) 1289 1054 { … … 1313 1078 { 1314 1079 m_visitWeaklyHasBeenCalled.store(false, std::memory_order_relaxed); 1315 }1316 1317 template <typename Functor> inline void ScriptExecutable::forEachCodeBlock(Functor&& functor)1318 {1319 switch (type()) {1320 case ProgramExecutableType: {1321 if (CodeBlock* codeBlock = static_cast<CodeBlock*>(jsCast<ProgramExecutable*>(this)->m_programCodeBlock.get()))1322 codeBlock->forEachRelatedCodeBlock(std::forward<Functor>(functor));1323 break;1324 }1325 1326 case EvalExecutableType: {1327 if (CodeBlock* codeBlock = static_cast<CodeBlock*>(jsCast<EvalExecutable*>(this)->m_evalCodeBlock.get()))1328 codeBlock->forEachRelatedCodeBlock(std::forward<Functor>(functor));1329 break;1330 }1331 1332 case FunctionExecutableType: {1333 Functor f(std::forward<Functor>(functor));1334 FunctionExecutable* executable = jsCast<FunctionExecutable*>(this);1335 if (CodeBlock* codeBlock = static_cast<CodeBlock*>(executable->m_codeBlockForCall.get()))1336 codeBlock->forEachRelatedCodeBlock(f);1337 if (CodeBlock* codeBlock = static_cast<CodeBlock*>(executable->m_codeBlockForConstruct.get()))1338 codeBlock->forEachRelatedCodeBlock(f);1339 break;1340 }1341 1342 case ModuleProgramExecutableType: {1343 if (CodeBlock* codeBlock = static_cast<CodeBlock*>(jsCast<ModuleProgramExecutable*>(this)->m_moduleProgramCodeBlock.get()))1344 codeBlock->forEachRelatedCodeBlock(std::forward<Functor>(functor));1345 break;1346 }1347 1348 default:1349 RELEASE_ASSERT_NOT_REACHED();1350 }1351 1080 } 1352 1081
Note:
See TracChangeset
for help on using the changeset viewer.