JSObjectRef JSObjectCallAsConstructor(JSContextRef ctx, JSObjectRef object, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { ExecState* exec = toJS(ctx); exec->globalData().heap->registerThread(); JSLock lock(exec); JSObject* jsObject = toJS(object); ConstructData constructData; ConstructType constructType = jsObject->getConstructData(constructData); if (constructType == ConstructTypeNone) return 0; ArgList argList; for (size_t i = 0; i < argumentCount; i++) argList.append(toJS(arguments[i])); JSObjectRef result = toRef(construct(exec, jsObject, constructType, constructData, argList)); if (exec->hadException()) { if (exception) *exception = toRef(exec->exception()); exec->clearException(); result = 0; } return result; }
ScriptObject ScriptFunctionCall::construct(bool& hadException, bool reportExceptions) { JSObject* thisObject = m_thisObject.jsObject(); JSLock lock(SilenceAssertionsOnly); JSObject* constructor = asObject(thisObject->get(m_exec, Identifier(m_exec, stringToUString(m_name)))); if (m_exec->hadException()) { if (reportExceptions) reportException(m_exec, m_exec->exception()); hadException = true; return ScriptObject(); } ConstructData constructData; ConstructType constructType = constructor->getConstructData(constructData); if (constructType == ConstructTypeNone) return ScriptObject(); JSValue result = JSC::construct(m_exec, constructor, constructType, constructData, m_arguments); if (m_exec->hadException()) { if (reportExceptions) reportException(m_exec, m_exec->exception()); hadException = true; return ScriptObject(); } return ScriptObject(m_exec, asObject(result)); }
JSObject* Error::create(ExecState* exec, ErrorType type, const UString& message, int lineNumber, intptr_t sourceID, const UString& sourceURL) { JSObject* constructor; const char* name; switch (type) { case EvalError: constructor = exec->lexicalGlobalObject()->evalErrorConstructor(); name = "Evaluation error"; break; case RangeError: constructor = exec->lexicalGlobalObject()->rangeErrorConstructor(); name = "Range error"; break; case ReferenceError: constructor = exec->lexicalGlobalObject()->referenceErrorConstructor(); name = "Reference error"; break; case SyntaxError: constructor = exec->lexicalGlobalObject()->syntaxErrorConstructor(); name = "Syntax error"; break; case TypeError: constructor = exec->lexicalGlobalObject()->typeErrorConstructor(); name = "Type error"; break; case URIError: constructor = exec->lexicalGlobalObject()->URIErrorConstructor(); name = "URI error"; break; default: constructor = exec->lexicalGlobalObject()->errorConstructor(); name = "Error"; break; } MarkedArgumentBuffer args; if (message.isEmpty()) args.append(jsString(exec, name)); else args.append(jsString(exec, message)); ConstructData constructData; ConstructType constructType = constructor->getConstructData(constructData); JSObject* error = construct(exec, constructor, constructType, constructData, args); if (lineNumber != -1) error->putWithAttributes(exec, Identifier(exec, JSC_ERROR_LINENUMBER_PROPERTYNAME), jsNumber(exec, lineNumber), ReadOnly | DontDelete); if (sourceID != -1) error->putWithAttributes(exec, Identifier(exec, "sourceId"), jsNumber(exec, sourceID), ReadOnly | DontDelete); if (!sourceURL.isNull()) error->putWithAttributes(exec, Identifier(exec, JSC_ERROR_FILENAME_PROPERTYNAME), jsString(exec, sourceURL), ReadOnly | DontDelete); return error; }
JSObjectRef JSObjectCallAsConstructor(JSContextRef ctx, JSObjectRef object, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { ExecState* exec = toJS(ctx); APIEntryShim entryShim(exec); JSObject* jsObject = toJS(object); ConstructData constructData; ConstructType constructType = jsObject->getConstructData(constructData); if (constructType == ConstructTypeNone) return 0; MarkedArgumentBuffer argList; for (size_t i = 0; i < argumentCount; i++) argList.append(toJS(exec, arguments[i])); JSObjectRef result = toRef(construct(exec, jsObject, constructType, constructData, argList)); if (exec->hadException()) { if (exception) *exception = toRef(exec, exec->exception()); exec->clearException(); result = 0; } return result; }
bool JSObjectIsConstructor(JSContextRef, JSObjectRef object) { JSObject* jsObject = toJS(object); ConstructData constructData; return jsObject->getConstructData(constructData) != ConstructTypeNone; }