void AbstractValue::set(Graph& graph, const InferredType::Descriptor& descriptor) { switch (descriptor.kind()) { case InferredType::Bottom: clear(); return; case InferredType::Boolean: setType(SpecBoolean); return; case InferredType::Other: setType(SpecOther); return; case InferredType::Int32: setType(SpecInt32); return; case InferredType::Number: setType(SpecBytecodeNumber); return; case InferredType::String: set(graph, graph.m_vm.stringStructure.get()); return; case InferredType::Symbol: set(graph, graph.m_vm.symbolStructure.get()); return; case InferredType::ObjectWithStructure: set(graph, descriptor.structure()); return; case InferredType::ObjectWithStructureOrOther: set(graph, descriptor.structure()); merge(SpecOther); return; case InferredType::Object: setType(graph, SpecObject); return; case InferredType::ObjectOrOther: setType(graph, SpecObject | SpecOther); return; case InferredType::Top: makeHeapTop(); return; } RELEASE_ASSERT_NOT_REACHED(); }
AssemblyHelpers::JumpList AssemblyHelpers::branchIfNotType( JSValueRegs regs, GPRReg tempGPR, const InferredType::Descriptor& descriptor, TagRegistersMode mode) { AssemblyHelpers::JumpList result; switch (descriptor.kind()) { case InferredType::Bottom: result.append(jump()); break; case InferredType::Boolean: result.append(branchIfNotBoolean(regs, tempGPR)); break; case InferredType::Other: result.append(branchIfNotOther(regs, tempGPR)); break; case InferredType::Int32: result.append(branchIfNotInt32(regs, mode)); break; case InferredType::Number: result.append(branchIfNotNumber(regs, tempGPR, mode)); break; case InferredType::String: result.append(branchIfNotCell(regs, mode)); result.append(branchIfNotString(regs.payloadGPR())); break; case InferredType::ObjectWithStructure: result.append(branchIfNotCell(regs, mode)); result.append( branchStructure( NotEqual, Address(regs.payloadGPR(), JSCell::structureIDOffset()), descriptor.structure())); break; case InferredType::ObjectWithStructureOrOther: { Jump ok = branchIfOther(regs, tempGPR); result.append(branchIfNotCell(regs, mode)); result.append( branchStructure( NotEqual, Address(regs.payloadGPR(), JSCell::structureIDOffset()), descriptor.structure())); ok.link(this); break; } case InferredType::Object: result.append(branchIfNotCell(regs, mode)); result.append(branchIfNotObject(regs.payloadGPR())); break; case InferredType::ObjectOrOther: { Jump ok = branchIfOther(regs, tempGPR); result.append(branchIfNotCell(regs, mode)); result.append(branchIfNotObject(regs.payloadGPR())); ok.link(this); break; } case InferredType::Top: break; } return result; }
void insertInferredTypeCheck( InsertionSet& insertionSet, unsigned nodeIndex, NodeOrigin origin, Node* baseNode, const InferredType::Descriptor& type) { insertionSet.graph().registerInferredType(type); switch (type.kind()) { case InferredType::Bottom: insertionSet.insertNode(nodeIndex, SpecNone, ForceOSRExit, origin); return; case InferredType::Boolean: insertionSet.insertNode(nodeIndex, SpecNone, Check, origin, Edge(baseNode, BooleanUse)); return; case InferredType::Other: insertionSet.insertNode(nodeIndex, SpecNone, Check, origin, Edge(baseNode, OtherUse)); return; case InferredType::Int32: insertionSet.insertNode(nodeIndex, SpecNone, Check, origin, Edge(baseNode, Int32Use)); return; case InferredType::Number: insertionSet.insertNode(nodeIndex, SpecNone, Check, origin, Edge(baseNode, NumberUse)); return; case InferredType::String: insertionSet.insertNode(nodeIndex, SpecNone, Check, origin, Edge(baseNode, StringUse)); return; case InferredType::Symbol: insertionSet.insertNode(nodeIndex, SpecNone, Check, origin, Edge(baseNode, SymbolUse)); return; case InferredType::ObjectWithStructure: insertionSet.insertNode( nodeIndex, SpecNone, CheckStructure, origin, OpInfo(insertionSet.graph().addStructureSet(type.structure())), Edge(baseNode, CellUse)); return; case InferredType::ObjectWithStructureOrOther: insertionSet.insertNode( nodeIndex, SpecNone, CheckStructure, origin, OpInfo(insertionSet.graph().addStructureSet(type.structure())), Edge(baseNode, CellOrOtherUse)); return; case InferredType::Object: insertionSet.insertNode(nodeIndex, SpecNone, Check, origin, Edge(baseNode, ObjectUse)); return; case InferredType::ObjectOrOther: insertionSet.insertNode(nodeIndex, SpecNone, Check, origin, Edge(baseNode, ObjectOrOtherUse)); return; case InferredType::Top: return; } DFG_CRASH(insertionSet.graph(), baseNode, "Bad inferred type"); }