X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/f9bf01c6616d5ddcf65b13b33cedf9e387ff7a63..4be4e30906bcb8ee30b4d189205cb70bad6707ce:/runtime/NativeErrorConstructor.cpp diff --git a/runtime/NativeErrorConstructor.cpp b/runtime/NativeErrorConstructor.cpp index 403fc7e..929cc8c 100644 --- a/runtime/NativeErrorConstructor.cpp +++ b/runtime/NativeErrorConstructor.cpp @@ -25,46 +25,52 @@ #include "JSFunction.h" #include "JSString.h" #include "NativeErrorPrototype.h" +#include "Operations.h" namespace JSC { -ASSERT_CLASS_FITS_IN_CELL(NativeErrorConstructor); +ASSERT_HAS_TRIVIAL_DESTRUCTOR(NativeErrorConstructor); -const ClassInfo NativeErrorConstructor::info = { "Function", &InternalFunction::info, 0, 0 }; +const ClassInfo NativeErrorConstructor::s_info = { "Function", &InternalFunction::s_info, 0, 0, CREATE_METHOD_TABLE(NativeErrorConstructor) }; -NativeErrorConstructor::NativeErrorConstructor(ExecState* exec, NonNullPassRefPtr structure, NativeErrorPrototype* nativeErrorPrototype) - : InternalFunction(&exec->globalData(), structure, Identifier(exec, nativeErrorPrototype->getDirect(exec->propertyNames().name).getString(exec))) - , m_errorStructure(ErrorInstance::createStructure(nativeErrorPrototype)) +NativeErrorConstructor::NativeErrorConstructor(JSGlobalObject* globalObject, Structure* structure) + : InternalFunction(globalObject, structure) { - putDirect(exec->propertyNames().length, jsNumber(exec, 1), DontDelete | ReadOnly | DontEnum); // ECMA 15.11.7.5 - putDirect(exec->propertyNames().prototype, nativeErrorPrototype, DontDelete | ReadOnly | DontEnum); } -ErrorInstance* NativeErrorConstructor::construct(ExecState* exec, const ArgList& args) +void NativeErrorConstructor::visitChildren(JSCell* cell, SlotVisitor& visitor) { - ErrorInstance* object = new (exec) ErrorInstance(m_errorStructure); - if (!args.at(0).isUndefined()) - object->putDirect(exec->propertyNames().message, jsString(exec, args.at(0).toString(exec))); - return object; + NativeErrorConstructor* thisObject = jsCast(cell); + ASSERT_GC_OBJECT_INHERITS(thisObject, &s_info); + COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); + ASSERT(thisObject->structure()->typeInfo().overridesVisitChildren()); + + InternalFunction::visitChildren(thisObject, visitor); + visitor.append(&thisObject->m_errorStructure); } -static JSObject* constructWithNativeErrorConstructor(ExecState* exec, JSObject* constructor, const ArgList& args) +static EncodedJSValue JSC_HOST_CALL constructWithNativeErrorConstructor(ExecState* exec) { - return static_cast(constructor)->construct(exec, args); + JSValue message = exec->argumentCount() ? exec->argument(0) : jsUndefined(); + Structure* errorStructure = static_cast(exec->callee())->errorStructure(); + ASSERT(errorStructure); + return JSValue::encode(ErrorInstance::create(exec, errorStructure, message)); } -ConstructType NativeErrorConstructor::getConstructData(ConstructData& constructData) +ConstructType NativeErrorConstructor::getConstructData(JSCell*, ConstructData& constructData) { constructData.native.function = constructWithNativeErrorConstructor; return ConstructTypeHost; } -static JSValue JSC_HOST_CALL callNativeErrorConstructor(ExecState* exec, JSObject* constructor, JSValue, const ArgList& args) +static EncodedJSValue JSC_HOST_CALL callNativeErrorConstructor(ExecState* exec) { - return static_cast(constructor)->construct(exec, args); + JSValue message = exec->argumentCount() ? exec->argument(0) : jsUndefined(); + Structure* errorStructure = static_cast(exec->callee())->errorStructure(); + return JSValue::encode(ErrorInstance::create(exec, errorStructure, message)); } -CallType NativeErrorConstructor::getCallData(CallData& callData) +CallType NativeErrorConstructor::getCallData(JSCell*, CallData& callData) { callData.native.function = callNativeErrorConstructor; return CallTypeHost;