JavascriptGeneratorFunction::JavascriptGeneratorFunction(DynamicType* type) : ScriptFunctionBase(type, &functionInfo), scriptFunction(nullptr) { // Constructor used during copy on write. DebugOnly(VerifyEntryPoint()); }
BoundFunction::BoundFunction(DynamicType * type) : JavascriptFunction(type, &functionInfo), targetFunction(nullptr), boundThis(nullptr), count(0), boundArgs(nullptr) { // Constructor used during copy on write. DebugOnly(VerifyEntryPoint()); }
BoundFunction::BoundFunction(RecyclableObject* targetFunction, Var boundThis, Var* args, uint argsCount, DynamicType * type) : JavascriptFunction(type, &functionInfo), count(argsCount), boundArgs(nullptr) { DebugOnly(VerifyEntryPoint()); this->targetFunction = targetFunction; this->boundThis = boundThis; if (argsCount != 0) { this->boundArgs = RecyclerNewArray(this->GetScriptContext()->GetRecycler(), Var, argsCount); for (uint i = 0; i < argsCount; i++) { this->boundArgs[i] = args[i]; } } }
JavascriptExternalFunction::JavascriptExternalFunction(DynamicType *type) : RuntimeFunction(type, &EntryInfo::ExternalFunctionThunk), nativeMethod(nullptr), signature(nullptr), callbackState(nullptr), initMethod(nullptr), oneBit(1), typeSlots(0), hasAccessors(0), callCount(0), prototypeTypeId(-1), flags(0) { DebugOnly(VerifyEntryPoint()); }
JavascriptExternalFunction::JavascriptExternalFunction(ExternalMethod entryPoint, DynamicType* type, InitializeMethod method, unsigned short deferredSlotCount, bool accessors) : RuntimeFunction(type, &EntryInfo::ExternalFunctionThunk), nativeMethod(entryPoint), signature(nullptr), callbackState(nullptr), initMethod(method), oneBit(1), typeSlots(deferredSlotCount), hasAccessors(accessors), callCount(0), prototypeTypeId(-1), flags(0) { DebugOnly(VerifyEntryPoint()); }
JavascriptExternalFunction::JavascriptExternalFunction(StdCallJavascriptMethod entryPoint, DynamicType* type) : RuntimeFunction(type, &EntryInfo::StdCallExternalFunctionThunk), stdCallNativeMethod(entryPoint), signature(nullptr), callbackState(nullptr), initMethod(nullptr), oneBit(1), typeSlots(0), hasAccessors(0), flags(0), deferredLength(0) { DebugOnly(VerifyEntryPoint()); }
JavascriptExternalFunction::JavascriptExternalFunction(JavascriptExternalFunction* entryPoint, DynamicType* type) : RuntimeFunction(type, &EntryInfo::WrappedFunctionThunk), wrappedMethod(entryPoint), callbackState(nullptr), initMethod(nullptr), oneBit(1), typeSlots(0), hasAccessors(0), flags(0), deferredLength(0) { DebugOnly(VerifyEntryPoint()); }
JavascriptAsyncFunction::JavascriptAsyncFunction(DynamicType* type, GeneratorVirtualScriptFunction* scriptFunction) : JavascriptGeneratorFunction(type, &functionInfo, scriptFunction) { DebugOnly(VerifyEntryPoint()); }
JavascriptGeneratorFunction::JavascriptGeneratorFunction(DynamicType* type, FunctionInfo* functionInfo, GeneratorVirtualScriptFunction* scriptFunction) : ScriptFunctionBase(type, functionInfo), scriptFunction(scriptFunction) { DebugOnly(VerifyEntryPoint()); }
BoundFunction::BoundFunction(Arguments args, DynamicType * type) : JavascriptFunction(type, &functionInfo), count(0), boundArgs(nullptr) { DebugOnly(VerifyEntryPoint()); AssertMsg(args.Info.Count > 0, "wrong number of args in BoundFunction"); ScriptContext *scriptContext = this->GetScriptContext(); targetFunction = RecyclableObject::FromVar(args[0]); // Let proto be targetFunction.[[GetPrototypeOf]](). RecyclableObject* proto = JavascriptOperators::GetPrototype(targetFunction); if (proto != type->GetPrototype()) { if (type->GetIsShared()) { this->ChangeType(); type = this->GetDynamicType(); } type->SetPrototype(proto); } // If targetFunction is proxy, need to make sure that traps are called in right order as per 19.2.3.2 in RC#4 dated April 3rd 2015. // Here although we won't use value of length, this is just to make sure that we call traps involved with HasOwnProperty(Target, "length") and Get(Target, "length") if (JavascriptProxy::Is(targetFunction)) { if (JavascriptOperators::HasOwnProperty(targetFunction, PropertyIds::length, scriptContext) == TRUE) { int len = 0; Var varLength; if (targetFunction->GetProperty(targetFunction, PropertyIds::length, &varLength, nullptr, scriptContext)) { len = JavascriptConversion::ToInt32(varLength, scriptContext); } } GetTypeHandler()->EnsureObjectReady(this); } if (args.Info.Count > 1) { boundThis = args[1]; // function object and "this" arg const uint countAccountedFor = 2; count = args.Info.Count - countAccountedFor; // Store the args excluding function obj and "this" arg if (args.Info.Count > 2) { boundArgs = RecyclerNewArray(scriptContext->GetRecycler(), Var, count); for (uint i=0; i<count; i++) { boundArgs[i] = args[i+countAccountedFor]; } } } else { // If no "this" is passed, "undefined" is used boundThis = scriptContext->GetLibrary()->GetUndefined(); } }