1 // Copyright 2012 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_CODE_FACTORY_H_ 6 #define V8_CODE_FACTORY_H_ 7 8 #include "src/allocation.h" 9 #include "src/assembler.h" 10 #include "src/codegen.h" 11 #include "src/globals.h" 12 #include "src/interface-descriptors.h" 13 14 namespace v8 { 15 namespace internal { 16 17 // Associates a body of code with an interface descriptor. 18 class Callable final BASE_EMBEDDED { 19 public: Callable(Handle<Code> code,CallInterfaceDescriptor descriptor)20 Callable(Handle<Code> code, CallInterfaceDescriptor descriptor) 21 : code_(code), descriptor_(descriptor) {} 22 code()23 Handle<Code> code() const { return code_; } descriptor()24 CallInterfaceDescriptor descriptor() const { return descriptor_; } 25 26 private: 27 const Handle<Code> code_; 28 const CallInterfaceDescriptor descriptor_; 29 }; 30 31 class V8_EXPORT_PRIVATE CodeFactory final { 32 public: 33 // CEntryStub has var-args semantics (all the arguments are passed on the 34 // stack and the arguments count is passed via register) which currently 35 // can't be expressed in CallInterfaceDescriptor. Therefore only the code 36 // is exported here. 37 static Handle<Code> RuntimeCEntry(Isolate* isolate, int result_size = 1); 38 39 // Initial states for ICs. 40 static Callable LoadIC(Isolate* isolate); 41 static Callable LoadICInOptimizedCode(Isolate* isolate); 42 static Callable LoadICProtoArray(Isolate* isolate, bool throw_if_nonexistent); 43 static Callable LoadGlobalIC(Isolate* isolate, TypeofMode typeof_mode); 44 static Callable LoadGlobalICInOptimizedCode(Isolate* isolate, 45 TypeofMode typeof_mode); 46 static Callable KeyedLoadIC(Isolate* isolate); 47 static Callable KeyedLoadICInOptimizedCode(Isolate* isolate); 48 static Callable KeyedLoadIC_Megamorphic(Isolate* isolate); 49 static Callable CallIC(Isolate* isolate, 50 ConvertReceiverMode mode = ConvertReceiverMode::kAny, 51 TailCallMode tail_call_mode = TailCallMode::kDisallow); 52 static Callable CallICTrampoline( 53 Isolate* isolate, ConvertReceiverMode mode = ConvertReceiverMode::kAny, 54 TailCallMode tail_call_mode = TailCallMode::kDisallow); 55 static Callable StoreIC(Isolate* isolate, LanguageMode mode); 56 static Callable StoreICInOptimizedCode(Isolate* isolate, LanguageMode mode); 57 static Callable StoreOwnIC(Isolate* isolate); 58 static Callable StoreOwnICInOptimizedCode(Isolate* isolate); 59 static Callable KeyedStoreIC(Isolate* isolate, LanguageMode mode); 60 static Callable KeyedStoreICInOptimizedCode(Isolate* isolate, 61 LanguageMode mode); 62 static Callable KeyedStoreIC_Megamorphic(Isolate* isolate, LanguageMode mode); 63 64 static Callable ResumeGenerator(Isolate* isolate); 65 66 static Callable FrameDropperTrampoline(Isolate* isolate); 67 static Callable HandleDebuggerStatement(Isolate* isolate); 68 69 static Callable CompareIC(Isolate* isolate, Token::Value op); 70 static Callable CompareNilIC(Isolate* isolate, NilValue nil_value); 71 72 static Callable BinaryOpIC(Isolate* isolate, Token::Value op); 73 74 static Callable ApiGetter(Isolate* isolate); 75 76 // Code stubs. Add methods here as needed to reduce dependency on 77 // code-stubs.h. 78 static Callable InstanceOf(Isolate* isolate); 79 static Callable OrdinaryHasInstance(Isolate* isolate); 80 81 static Callable StringFromCharCode(Isolate* isolate); 82 83 static Callable GetProperty(Isolate* isolate); 84 85 static Callable ToBoolean(Isolate* isolate); 86 87 static Callable ToNumber(Isolate* isolate); 88 static Callable NonNumberToNumber(Isolate* isolate); 89 static Callable StringToNumber(Isolate* isolate); 90 static Callable ToString(Isolate* isolate); 91 static Callable ToName(Isolate* isolate); 92 static Callable ToInteger(Isolate* isolate); 93 static Callable ToLength(Isolate* isolate); 94 static Callable ToObject(Isolate* isolate); 95 static Callable NonPrimitiveToPrimitive( 96 Isolate* isolate, ToPrimitiveHint hint = ToPrimitiveHint::kDefault); 97 static Callable OrdinaryToPrimitive(Isolate* isolate, 98 OrdinaryToPrimitiveHint hint); 99 static Callable NumberToString(Isolate* isolate); 100 101 static Callable RegExpExec(Isolate* isolate); 102 103 static Callable Add(Isolate* isolate); 104 static Callable Subtract(Isolate* isolate); 105 static Callable Multiply(Isolate* isolate); 106 static Callable Divide(Isolate* isolate); 107 static Callable Modulus(Isolate* isolate); 108 static Callable ShiftRight(Isolate* isolate); 109 static Callable ShiftRightLogical(Isolate* isolate); 110 static Callable ShiftLeft(Isolate* isolate); 111 static Callable BitwiseAnd(Isolate* isolate); 112 static Callable BitwiseOr(Isolate* isolate); 113 static Callable BitwiseXor(Isolate* isolate); 114 static Callable LessThan(Isolate* isolate); 115 static Callable LessThanOrEqual(Isolate* isolate); 116 static Callable GreaterThan(Isolate* isolate); 117 static Callable GreaterThanOrEqual(Isolate* isolate); 118 static Callable Equal(Isolate* isolate); 119 static Callable NotEqual(Isolate* isolate); 120 static Callable StrictEqual(Isolate* isolate); 121 static Callable StrictNotEqual(Isolate* isolate); 122 123 static Callable StringAdd(Isolate* isolate, StringAddFlags flags, 124 PretenureFlag pretenure_flag); 125 static Callable StringCharAt(Isolate* isolate); 126 static Callable StringCharCodeAt(Isolate* isolate); 127 static Callable StringCompare(Isolate* isolate, Token::Value token); 128 static Callable StringEqual(Isolate* isolate); 129 static Callable StringNotEqual(Isolate* isolate); 130 static Callable StringLessThan(Isolate* isolate); 131 static Callable StringLessThanOrEqual(Isolate* isolate); 132 static Callable StringGreaterThan(Isolate* isolate); 133 static Callable StringGreaterThanOrEqual(Isolate* isolate); 134 static Callable SubString(Isolate* isolate); 135 static Callable StringIndexOf(Isolate* isolate); 136 137 static Callable RegExpReplace(Isolate* isolate); 138 static Callable RegExpSplit(Isolate* isolate); 139 140 static Callable ClassOf(Isolate* isolate); 141 static Callable Typeof(Isolate* isolate); 142 static Callable GetSuperConstructor(Isolate* isolate); 143 144 static Callable FastCloneRegExp(Isolate* isolate); 145 static Callable FastCloneShallowArray(Isolate* isolate, 146 AllocationSiteMode allocation_mode); 147 static Callable FastCloneShallowObject(Isolate* isolate, int length); 148 149 static Callable FastNewFunctionContext(Isolate* isolate, 150 ScopeType scope_type); 151 static Callable FastNewClosure(Isolate* isolate); 152 static Callable FastNewObject(Isolate* isolate); 153 static Callable FastNewRestParameter(Isolate* isolate); 154 static Callable FastNewSloppyArguments(Isolate* isolate); 155 static Callable FastNewStrictArguments(Isolate* isolate); 156 157 static Callable ForInPrepare(Isolate* isolate); 158 static Callable ForInNext(Isolate* isolate); 159 160 static Callable CopyFastSmiOrObjectElements(Isolate* isolate); 161 static Callable GrowFastDoubleElements(Isolate* isolate); 162 static Callable GrowFastSmiOrObjectElements(Isolate* isolate); 163 164 static Callable NewUnmappedArgumentsElements(Isolate* isolate); 165 static Callable NewRestParameterElements(Isolate* isolate); 166 167 static Callable AllocateHeapNumber(Isolate* isolate); 168 169 static Callable ArgumentAdaptor(Isolate* isolate); 170 static Callable Call(Isolate* isolate, 171 ConvertReceiverMode mode = ConvertReceiverMode::kAny, 172 TailCallMode tail_call_mode = TailCallMode::kDisallow); 173 static Callable CallWithSpread(Isolate* isolate); 174 static Callable CallFunction( 175 Isolate* isolate, ConvertReceiverMode mode = ConvertReceiverMode::kAny, 176 TailCallMode tail_call_mode = TailCallMode::kDisallow); 177 static Callable CallForwardVarargs(Isolate* isolate); 178 static Callable CallFunctionForwardVarargs(Isolate* isolate); 179 static Callable Construct(Isolate* isolate); 180 static Callable ConstructWithSpread(Isolate* isolate); 181 static Callable ConstructFunction(Isolate* isolate); 182 static Callable CreateIterResultObject(Isolate* isolate); 183 static Callable HasProperty(Isolate* isolate); 184 static Callable ForInFilter(Isolate* isolate); 185 186 static Callable InterpreterPushArgsAndCall(Isolate* isolate, 187 TailCallMode tail_call_mode, 188 InterpreterPushArgsMode mode); 189 static Callable InterpreterPushArgsAndConstruct(Isolate* isolate, 190 InterpreterPushArgsMode mode); 191 static Callable InterpreterPushArgsAndConstructArray(Isolate* isolate); 192 static Callable InterpreterCEntry(Isolate* isolate, int result_size = 1); 193 static Callable InterpreterOnStackReplacement(Isolate* isolate); 194 195 static Callable ArrayConstructor(Isolate* isolate); 196 static Callable ArrayPush(Isolate* isolate); 197 static Callable FunctionPrototypeBind(Isolate* isolate); 198 static Callable PromiseHandleReject(Isolate* isolate); 199 }; 200 201 } // namespace internal 202 } // namespace v8 203 204 #endif // V8_CODE_FACTORY_H_ 205