X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/f9bf01c6616d5ddcf65b13b33cedf9e387ff7a63..2656c66b5b30d5597e842a751c7f19ad6c2fe31a:/runtime/NativeErrorConstructor.cpp diff --git a/runtime/NativeErrorConstructor.cpp b/runtime/NativeErrorConstructor.cpp index 403fc7e..6260055 100644 --- a/runtime/NativeErrorConstructor.cpp +++ b/runtime/NativeErrorConstructor.cpp @@ -25,48 +25,74 @@ #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, 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(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()); + 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) +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); + Vector stackTrace; + exec->vm().interpreter->getStackTrace(stackTrace, std::numeric_limits::max()); + stackTrace.remove(0); + return JSValue::encode(ErrorInstance::create(exec, errorStructure, message, stackTrace)); } -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(); + Vector stackTrace; + exec->vm().interpreter->getStackTrace(stackTrace, std::numeric_limits::max()); + stackTrace.remove(0); + return JSValue::encode(ErrorInstance::create(exec, errorStructure, message, stackTrace)); } -CallType NativeErrorConstructor::getCallData(CallData& callData) +CallType NativeErrorConstructor::getCallData(JSCell*, CallData& callData) { - callData.native.function = callNativeErrorConstructor; + callData.native.function = Interpreter::callNativeErrorConstructor; return CallTypeHost; }