namespace JSC {
-struct HandlerInfo {
+enum class HandlerType {
+ Illegal = 0,
+ Catch = 1,
+ Finally = 2,
+ SynthesizedFinally = 3
+};
+
+struct HandlerInfoBase {
+ HandlerType type() const { return static_cast<HandlerType>(typeBits); }
+ void setType(HandlerType type) { typeBits = static_cast<uint32_t>(type); }
+
+ const char* typeName()
+ {
+ switch (type()) {
+ case HandlerType::Catch:
+ return "catch";
+ case HandlerType::Finally:
+ return "finally";
+ case HandlerType::SynthesizedFinally:
+ return "synthesized finally";
+ default:
+ ASSERT_NOT_REACHED();
+ }
+ return nullptr;
+ }
+
+ bool isCatchHandler() const { return type() == HandlerType::Catch; }
+
uint32_t start;
uint32_t end;
uint32_t target;
- uint32_t scopeDepth;
+ uint32_t scopeDepth : 30;
+ uint32_t typeBits : 2; // HandlerType
+};
+
+struct UnlinkedHandlerInfo : public HandlerInfoBase {
+ UnlinkedHandlerInfo(uint32_t start, uint32_t end, uint32_t target, uint32_t scopeDepth, HandlerType handlerType)
+ {
+ this->start = start;
+ this->end = end;
+ this->target = target;
+ this->scopeDepth = scopeDepth;
+ setType(handlerType);
+ ASSERT(type() == handlerType);
+ }
+};
+
+struct HandlerInfo : public HandlerInfoBase {
+ void initialize(const UnlinkedHandlerInfo& unlinkedInfo, size_t nonLocalScopeDepth)
+ {
+ start = unlinkedInfo.start;
+ end = unlinkedInfo.end;
+ target = unlinkedInfo.target;
+ scopeDepth = unlinkedInfo.scopeDepth + nonLocalScopeDepth;
+ typeBits = unlinkedInfo.typeBits;
+ }
+
#if ENABLE(JIT)
+ void initialize(const UnlinkedHandlerInfo& unlinkedInfo, size_t nonLocalScopeDepth, CodeLocationLabel label)
+ {
+ initialize(unlinkedInfo, nonLocalScopeDepth);
+ nativeCode = label;
+ }
+
CodeLocationLabel nativeCode;
#endif
};