X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/93a3786624b2768d89bfa27e46598dc64e2fb70a..ed1e77d3adeb83d26fd1dfb16dd84cabdcefd250:/runtime/NativeErrorConstructor.cpp?ds=sidebyside diff --git a/runtime/NativeErrorConstructor.cpp b/runtime/NativeErrorConstructor.cpp index 929cc8c..3fb58a3 100644 --- a/runtime/NativeErrorConstructor.cpp +++ b/runtime/NativeErrorConstructor.cpp @@ -25,54 +25,65 @@ #include "JSFunction.h" #include "JSString.h" #include "NativeErrorPrototype.h" -#include "Operations.h" +#include "JSCInlines.h" namespace JSC { -ASSERT_HAS_TRIVIAL_DESTRUCTOR(NativeErrorConstructor); +STATIC_ASSERT_IS_TRIVIALLY_DESTRUCTIBLE(NativeErrorConstructor); -const ClassInfo NativeErrorConstructor::s_info = { "Function", &InternalFunction::s_info, 0, 0, CREATE_METHOD_TABLE(NativeErrorConstructor) }; +const ClassInfo NativeErrorConstructor::s_info = { "Function", &InternalFunction::s_info, 0, CREATE_METHOD_TABLE(NativeErrorConstructor) }; -NativeErrorConstructor::NativeErrorConstructor(JSGlobalObject* globalObject, Structure* structure) - : InternalFunction(globalObject, structure) +NativeErrorConstructor::NativeErrorConstructor(VM& vm, Structure* structure) + : InternalFunction(vm, structure) { } +void NativeErrorConstructor::finishCreation(VM& vm, JSGlobalObject* globalObject, Structure* prototypeStructure, const String& name) +{ + Base::finishCreation(vm, name); + ASSERT(inherits(info())); + + NativeErrorPrototype* prototype = NativeErrorPrototype::create(vm, globalObject, prototypeStructure, name, this); + + putDirect(vm, vm.propertyNames->length, jsNumber(1), DontDelete | ReadOnly | DontEnum); // ECMA 15.11.7.5 + putDirect(vm, vm.propertyNames->prototype, prototype, DontDelete | ReadOnly | DontEnum); + m_errorStructure.set(vm, this, ErrorInstance::createStructure(vm, globalObject, prototype)); + ASSERT(m_errorStructure); + ASSERT(m_errorStructure->isObject()); +} + void NativeErrorConstructor::visitChildren(JSCell* cell, SlotVisitor& visitor) { 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); + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + Base::visitChildren(thisObject, visitor); visitor.append(&thisObject->m_errorStructure); } -static EncodedJSValue JSC_HOST_CALL constructWithNativeErrorConstructor(ExecState* exec) +EncodedJSValue JSC_HOST_CALL Interpreter::constructWithNativeErrorConstructor(ExecState* exec) { - JSValue message = exec->argumentCount() ? exec->argument(0) : jsUndefined(); + JSValue message = exec->argument(0); Structure* errorStructure = static_cast(exec->callee())->errorStructure(); ASSERT(errorStructure); - return JSValue::encode(ErrorInstance::create(exec, errorStructure, message)); + return JSValue::encode(ErrorInstance::create(exec, errorStructure, message, nullptr, TypeNothing, false)); } ConstructType NativeErrorConstructor::getConstructData(JSCell*, ConstructData& constructData) { - constructData.native.function = constructWithNativeErrorConstructor; + constructData.native.function = Interpreter::constructWithNativeErrorConstructor; return ConstructTypeHost; } -static EncodedJSValue JSC_HOST_CALL callNativeErrorConstructor(ExecState* exec) +EncodedJSValue JSC_HOST_CALL Interpreter::callNativeErrorConstructor(ExecState* exec) { - JSValue message = exec->argumentCount() ? exec->argument(0) : jsUndefined(); + JSValue message = exec->argument(0); Structure* errorStructure = static_cast(exec->callee())->errorStructure(); - return JSValue::encode(ErrorInstance::create(exec, errorStructure, message)); + return JSValue::encode(ErrorInstance::create(exec, errorStructure, message, nullptr, TypeNothing, false)); } CallType NativeErrorConstructor::getCallData(JSCell*, CallData& callData) { - callData.native.function = callNativeErrorConstructor; + callData.native.function = Interpreter::callNativeErrorConstructor; return CallTypeHost; }