X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/6fe7ccc865dc7d7541b93c5bcaf6368d2c98a174..refs/heads/master:/runtime/NativeErrorConstructor.cpp diff --git a/runtime/NativeErrorConstructor.cpp b/runtime/NativeErrorConstructor.cpp index b6aff91..3fb58a3 100644 --- a/runtime/NativeErrorConstructor.cpp +++ b/runtime/NativeErrorConstructor.cpp @@ -25,54 +25,65 @@ #include "JSFunction.h" #include "JSString.h" #include "NativeErrorPrototype.h" +#include "JSCInlines.h" namespace JSC { -ASSERT_CLASS_FITS_IN_CELL(NativeErrorConstructor); -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); - if (thisObject->m_errorStructure) - visitor.append(&thisObject->m_errorStructure); + 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; }