Changeset 196836 in webkit for trunk/Source/JavaScriptCore/runtime/ProxyObject.cpp
- Timestamp:
- Feb 19, 2016, 2:56:31 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/runtime/ProxyObject.cpp
r196789 r196836 66 66 } 67 67 68 m_target.set(vm, this, jsCast<JSObject*>(target)); 68 CallData ignored; 69 JSObject* targetAsObject = jsCast<JSObject*>(target); 70 m_isCallable = targetAsObject->methodTable(vm)->getCallData(targetAsObject, ignored) != CallTypeNone; 71 72 m_target.set(vm, this, targetAsObject); 69 73 m_handler.set(vm, this, handler); 70 74 } … … 106 110 arguments.append(target); 107 111 arguments.append(identifierToSafePublicJSValue(vm, Identifier::fromUid(&vm, propertyName.uid()))); 108 if (exec->hadException())109 return JSValue::encode(jsUndefined());110 112 arguments.append(thisObject); 111 113 JSValue trapResult = call(exec, getHandler, callType, callData, handler, arguments); … … 153 155 arguments.append(target); 154 156 arguments.append(identifierToSafePublicJSValue(vm, Identifier::fromUid(&vm, propertyName.uid()))); 155 if (exec->hadException())156 return false;157 157 JSValue trapResult = call(exec, getOwnPropertyDescriptorMethod, callType, callData, handler, arguments); 158 158 if (exec->hadException()) … … 235 235 arguments.append(target); 236 236 arguments.append(identifierToSafePublicJSValue(vm, Identifier::fromUid(&vm, propertyName.uid()))); 237 if (exec->hadException())238 return false;239 237 JSValue trapResult = call(exec, hasMethod, callType, callData, handler, arguments); 240 238 if (exec->hadException()) … … 299 297 } 300 298 299 static EncodedJSValue JSC_HOST_CALL performProxyCall(ExecState* exec) 300 { 301 VM& vm = exec->vm(); 302 ProxyObject* proxy = jsCast<ProxyObject*>(exec->callee()); 303 JSValue handlerValue = proxy->handler(); 304 if (handlerValue.isNull()) 305 return throwVMTypeError(exec, ASCIILiteral("Proxy 'handler' is null. It should be an Object.")); 306 307 JSObject* handler = jsCast<JSObject*>(handlerValue); 308 CallData callData; 309 CallType callType; 310 JSValue applyMethod = handler->getMethod(exec, callData, callType, makeIdentifier(vm, "apply"), ASCIILiteral("'apply' property of a Proxy's handler should be callable.")); 311 if (exec->hadException()) 312 return JSValue::encode(jsUndefined()); 313 JSObject* target = proxy->target(); 314 if (applyMethod.isUndefined()) { 315 CallData callData; 316 CallType callType = target->methodTable(vm)->getCallData(target, callData); 317 RELEASE_ASSERT(callType != CallTypeNone); 318 return JSValue::encode(call(exec, target, callType, callData, exec->thisValue(), ArgList(exec))); 319 } 320 321 JSArray* argArray = constructArray(exec, static_cast<ArrayAllocationProfile*>(nullptr), ArgList(exec)); 322 if (exec->hadException()) 323 return JSValue::encode(jsUndefined()); 324 MarkedArgumentBuffer arguments; 325 arguments.append(target); 326 arguments.append(exec->thisValue()); 327 arguments.append(argArray); 328 return JSValue::encode(call(exec, applyMethod, callType, callData, handler, arguments)); 329 } 330 331 CallType ProxyObject::getCallData(JSCell* cell, CallData& callData) 332 { 333 ProxyObject* proxy = jsCast<ProxyObject*>(cell); 334 if (!proxy->m_isCallable) { 335 callData.js.functionExecutable = nullptr; 336 callData.js.scope = nullptr; 337 return CallTypeNone; 338 } 339 340 callData.native.function = performProxyCall; 341 return CallTypeHost; 342 } 343 301 344 void ProxyObject::visitChildren(JSCell* cell, SlotVisitor& visitor) 302 345 {
Note:
See TracChangeset
for help on using the changeset viewer.