X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/ba379fdc102753d6be2c4d937058fe40257329fe..refs/heads/master:/runtime/NativeErrorConstructor.cpp diff --git a/runtime/NativeErrorConstructor.cpp b/runtime/NativeErrorConstructor.cpp index 0205fc5..3fb58a3 100644 --- a/runtime/NativeErrorConstructor.cpp +++ b/runtime/NativeErrorConstructor.cpp @@ -25,48 +25,65 @@ #include "JSFunction.h" #include "JSString.h" #include "NativeErrorPrototype.h" +#include "JSCInlines.h" namespace JSC { -ASSERT_CLASS_FITS_IN_CELL(NativeErrorConstructor); +STATIC_ASSERT_IS_TRIVIALLY_DESTRUCTIBLE(NativeErrorConstructor); -const ClassInfo NativeErrorConstructor::info = { "Function", &InternalFunction::info, 0, 0 }; +const ClassInfo NativeErrorConstructor::s_info = { "Function", &InternalFunction::s_info, 0, CREATE_METHOD_TABLE(NativeErrorConstructor) }; -NativeErrorConstructor::NativeErrorConstructor(ExecState* exec, PassRefPtr structure, NativeErrorPrototype* nativeErrorPrototype) - : InternalFunction(&exec->globalData(), structure, Identifier(exec, nativeErrorPrototype->getDirect(exec->propertyNames().name).getString())) - , m_errorStructure(ErrorInstance::createStructure(nativeErrorPrototype)) +NativeErrorConstructor::NativeErrorConstructor(VM& vm, Structure* structure) + : InternalFunction(vm, 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::finishCreation(VM& vm, JSGlobalObject* globalObject, Structure* prototypeStructure, const String& name) { - 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; + 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, info()); + Base::visitChildren(thisObject, visitor); + visitor.append(&thisObject->m_errorStructure); } -static JSObject* constructWithNativeErrorConstructor(ExecState* exec, JSObject* constructor, const ArgList& args) +EncodedJSValue JSC_HOST_CALL Interpreter::constructWithNativeErrorConstructor(ExecState* exec) { - return static_cast(constructor)->construct(exec, args); + JSValue message = exec->argument(0); + Structure* errorStructure = static_cast(exec->callee())->errorStructure(); + ASSERT(errorStructure); + return JSValue::encode(ErrorInstance::create(exec, errorStructure, message, nullptr, TypeNothing, false)); } -ConstructType NativeErrorConstructor::getConstructData(ConstructData& constructData) +ConstructType NativeErrorConstructor::getConstructData(JSCell*, ConstructData& constructData) { - constructData.native.function = constructWithNativeErrorConstructor; + constructData.native.function = Interpreter::constructWithNativeErrorConstructor; return ConstructTypeHost; } -static JSValue JSC_HOST_CALL callNativeErrorConstructor(ExecState* exec, JSObject* constructor, JSValue, const ArgList& args) +EncodedJSValue JSC_HOST_CALL Interpreter::callNativeErrorConstructor(ExecState* exec) { - return static_cast(constructor)->construct(exec, args); + JSValue message = exec->argument(0); + Structure* errorStructure = static_cast(exec->callee())->errorStructure(); + return JSValue::encode(ErrorInstance::create(exec, errorStructure, message, nullptr, TypeNothing, false)); } -CallType NativeErrorConstructor::getCallData(CallData& callData) +CallType NativeErrorConstructor::getCallData(JSCell*, CallData& callData) { - callData.native.function = callNativeErrorConstructor; + callData.native.function = Interpreter::callNativeErrorConstructor; return CallTypeHost; }