Use "= default" to denote default constructor or destructor
[WebKit-https.git] / Source / WebCore / bridge / runtime_method.cpp
1 /*
2  * Copyright (C) 2003, 2008, 2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25  
26 #include "config.h"
27 #include "runtime_method.h"
28
29 #include "JSDOMBinding.h"
30 #include "JSHTMLElement.h"
31 #include "JSPluginElementFunctions.h"
32 #include "runtime_object.h"
33 #include <runtime/Error.h>
34 #include <runtime/FunctionPrototype.h>
35
36 using namespace WebCore;
37
38 namespace JSC {
39
40 using namespace Bindings;
41
42 WEBCORE_EXPORT const ClassInfo RuntimeMethod::s_info = { "RuntimeMethod", &InternalFunction::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(RuntimeMethod) };
43
44 RuntimeMethod::RuntimeMethod(JSGlobalObject* globalObject, Structure* structure, Method* method)
45     // Callers will need to pass in the right global object corresponding to this native object "method".
46     : InternalFunction(globalObject->vm(), structure)
47     , m_method(method)
48 {
49 }
50
51 void RuntimeMethod::finishCreation(VM& vm, const String& ident)
52 {
53     Base::finishCreation(vm, ident);
54     ASSERT(inherits(vm, info()));
55 }
56
57 EncodedJSValue RuntimeMethod::lengthGetter(ExecState* exec, EncodedJSValue thisValue, PropertyName)
58 {
59     VM& vm = exec->vm();
60     auto scope = DECLARE_THROW_SCOPE(vm);
61
62     RuntimeMethod* thisObject = jsDynamicDowncast<RuntimeMethod*>(vm, JSValue::decode(thisValue));
63     if (!thisObject)
64         return throwVMTypeError(exec, scope);
65     return JSValue::encode(jsNumber(thisObject->m_method->numParameters()));
66 }
67
68 bool RuntimeMethod::getOwnPropertySlot(JSObject* object, ExecState* exec, PropertyName propertyName, PropertySlot &slot)
69 {
70     VM& vm = exec->vm();
71     RuntimeMethod* thisObject = jsCast<RuntimeMethod*>(object);
72     if (propertyName == vm.propertyNames->length) {
73         slot.setCacheableCustom(thisObject, PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum, thisObject->lengthGetter);
74         return true;
75     }
76     
77     return InternalFunction::getOwnPropertySlot(thisObject, exec, propertyName, slot);
78 }
79
80 static EncodedJSValue JSC_HOST_CALL callRuntimeMethod(ExecState* exec)
81 {
82     VM& vm = exec->vm();
83     auto scope = DECLARE_THROW_SCOPE(vm);
84
85     RuntimeMethod* method = static_cast<RuntimeMethod*>(exec->jsCallee());
86
87     if (!method->method())
88         return JSValue::encode(jsUndefined());
89
90     RefPtr<Instance> instance;
91
92     JSValue thisValue = exec->thisValue();
93     if (thisValue.inherits(vm, RuntimeObject::info())) {
94         RuntimeObject* runtimeObject = static_cast<RuntimeObject*>(asObject(thisValue));
95         instance = runtimeObject->getInternalInstance();
96         if (!instance) 
97             return JSValue::encode(RuntimeObject::throwInvalidAccessError(exec, scope));
98     } else {
99         // Calling a runtime object of a plugin element?
100         if (thisValue.inherits(vm, JSHTMLElement::info()))
101             instance = pluginInstance(jsCast<JSHTMLElement*>(asObject(thisValue))->wrapped());
102         if (!instance)
103             return throwVMTypeError(exec, scope);
104     }
105     ASSERT(instance);
106
107     instance->begin();
108     JSValue result = instance->invokeMethod(exec, method);
109     instance->end();
110     return JSValue::encode(result);
111 }
112
113 CallType RuntimeMethod::getCallData(JSCell*, CallData& callData)
114 {
115     callData.native.function = callRuntimeMethod;
116     return CallType::Host;
117 }
118
119 }