OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 1259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1270 } | 1270 } |
1271 } | 1271 } |
1272 } | 1272 } |
1273 } | 1273 } |
1274 | 1274 |
1275 | 1275 |
1276 // ------------------------------------------------------------------------ | 1276 // ------------------------------------------------------------------------ |
1277 // StubCompiler implementation. | 1277 // StubCompiler implementation. |
1278 | 1278 |
1279 | 1279 |
1280 MaybeObject* LoadCallbackProperty(RUNTIME_CALLING_CONVENTION) { | 1280 RUNTIME_FUNCTION(MaybeObject*, LoadCallbackProperty) { |
1281 RUNTIME_GET_ISOLATE; | |
1282 ASSERT(args[0]->IsJSObject()); | 1281 ASSERT(args[0]->IsJSObject()); |
1283 ASSERT(args[1]->IsJSObject()); | 1282 ASSERT(args[1]->IsJSObject()); |
1284 AccessorInfo* callback = AccessorInfo::cast(args[3]); | 1283 AccessorInfo* callback = AccessorInfo::cast(args[3]); |
1285 Address getter_address = v8::ToCData<Address>(callback->getter()); | 1284 Address getter_address = v8::ToCData<Address>(callback->getter()); |
1286 v8::AccessorGetter fun = FUNCTION_CAST<v8::AccessorGetter>(getter_address); | 1285 v8::AccessorGetter fun = FUNCTION_CAST<v8::AccessorGetter>(getter_address); |
1287 ASSERT(fun != NULL); | 1286 ASSERT(fun != NULL); |
1288 v8::AccessorInfo info(&args[0]); | 1287 v8::AccessorInfo info(&args[0]); |
1289 HandleScope scope(isolate); | 1288 HandleScope scope(isolate); |
1290 v8::Handle<v8::Value> result; | 1289 v8::Handle<v8::Value> result; |
1291 { | 1290 { |
1292 // Leaving JavaScript. | 1291 // Leaving JavaScript. |
1293 VMState state(isolate, EXTERNAL); | 1292 VMState state(isolate, EXTERNAL); |
1294 ExternalCallbackScope call_scope(isolate, getter_address); | 1293 ExternalCallbackScope call_scope(isolate, getter_address); |
1295 result = fun(v8::Utils::ToLocal(args.at<String>(4)), info); | 1294 result = fun(v8::Utils::ToLocal(args.at<String>(4)), info); |
1296 } | 1295 } |
1297 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 1296 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
1298 if (result.IsEmpty()) return HEAP->undefined_value(); | 1297 if (result.IsEmpty()) return HEAP->undefined_value(); |
1299 return *v8::Utils::OpenHandle(*result); | 1298 return *v8::Utils::OpenHandle(*result); |
1300 } | 1299 } |
1301 | 1300 |
1302 | 1301 |
1303 MaybeObject* StoreCallbackProperty(RUNTIME_CALLING_CONVENTION) { | 1302 RUNTIME_FUNCTION(MaybeObject*, StoreCallbackProperty) { |
1304 RUNTIME_GET_ISOLATE; | |
1305 JSObject* recv = JSObject::cast(args[0]); | 1303 JSObject* recv = JSObject::cast(args[0]); |
1306 AccessorInfo* callback = AccessorInfo::cast(args[1]); | 1304 AccessorInfo* callback = AccessorInfo::cast(args[1]); |
1307 Address setter_address = v8::ToCData<Address>(callback->setter()); | 1305 Address setter_address = v8::ToCData<Address>(callback->setter()); |
1308 v8::AccessorSetter fun = FUNCTION_CAST<v8::AccessorSetter>(setter_address); | 1306 v8::AccessorSetter fun = FUNCTION_CAST<v8::AccessorSetter>(setter_address); |
1309 ASSERT(fun != NULL); | 1307 ASSERT(fun != NULL); |
1310 Handle<String> name = args.at<String>(2); | 1308 Handle<String> name = args.at<String>(2); |
1311 Handle<Object> value = args.at<Object>(3); | 1309 Handle<Object> value = args.at<Object>(3); |
1312 HandleScope scope(isolate); | 1310 HandleScope scope(isolate); |
1313 LOG(isolate, ApiNamedPropertyAccess("store", recv, *name)); | 1311 LOG(isolate, ApiNamedPropertyAccess("store", recv, *name)); |
1314 CustomArguments custom_args(isolate, callback->data(), recv, recv); | 1312 CustomArguments custom_args(isolate, callback->data(), recv, recv); |
(...skipping 12 matching lines...) Expand all Loading... |
1327 static const int kAccessorInfoOffsetInInterceptorArgs = 2; | 1325 static const int kAccessorInfoOffsetInInterceptorArgs = 2; |
1328 | 1326 |
1329 | 1327 |
1330 /** | 1328 /** |
1331 * Attempts to load a property with an interceptor (which must be present), | 1329 * Attempts to load a property with an interceptor (which must be present), |
1332 * but doesn't search the prototype chain. | 1330 * but doesn't search the prototype chain. |
1333 * | 1331 * |
1334 * Returns |Heap::no_interceptor_result_sentinel()| if interceptor doesn't | 1332 * Returns |Heap::no_interceptor_result_sentinel()| if interceptor doesn't |
1335 * provide any value for the given name. | 1333 * provide any value for the given name. |
1336 */ | 1334 */ |
1337 MaybeObject* LoadPropertyWithInterceptorOnly(RUNTIME_CALLING_CONVENTION) { | 1335 RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorOnly) { |
1338 RUNTIME_GET_ISOLATE; | |
1339 Handle<String> name_handle = args.at<String>(0); | 1336 Handle<String> name_handle = args.at<String>(0); |
1340 Handle<InterceptorInfo> interceptor_info = args.at<InterceptorInfo>(1); | 1337 Handle<InterceptorInfo> interceptor_info = args.at<InterceptorInfo>(1); |
1341 ASSERT(kAccessorInfoOffsetInInterceptorArgs == 2); | 1338 ASSERT(kAccessorInfoOffsetInInterceptorArgs == 2); |
1342 ASSERT(args[2]->IsJSObject()); // Receiver. | 1339 ASSERT(args[2]->IsJSObject()); // Receiver. |
1343 ASSERT(args[3]->IsJSObject()); // Holder. | 1340 ASSERT(args[3]->IsJSObject()); // Holder. |
1344 ASSERT(args.length() == 5); // Last arg is data object. | 1341 ASSERT(args.length() == 5); // Last arg is data object. |
1345 | 1342 |
1346 Address getter_address = v8::ToCData<Address>(interceptor_info->getter()); | 1343 Address getter_address = v8::ToCData<Address>(interceptor_info->getter()); |
1347 v8::NamedPropertyGetter getter = | 1344 v8::NamedPropertyGetter getter = |
1348 FUNCTION_CAST<v8::NamedPropertyGetter>(getter_address); | 1345 FUNCTION_CAST<v8::NamedPropertyGetter>(getter_address); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1427 attrs); | 1424 attrs); |
1428 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 1425 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
1429 return result; | 1426 return result; |
1430 } | 1427 } |
1431 | 1428 |
1432 | 1429 |
1433 /** | 1430 /** |
1434 * Loads a property with an interceptor performing post interceptor | 1431 * Loads a property with an interceptor performing post interceptor |
1435 * lookup if interceptor failed. | 1432 * lookup if interceptor failed. |
1436 */ | 1433 */ |
1437 MaybeObject* LoadPropertyWithInterceptorForLoad(RUNTIME_CALLING_CONVENTION) { | 1434 RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorForLoad) { |
1438 RUNTIME_GET_ISOLATE; | |
1439 PropertyAttributes attr = NONE; | 1435 PropertyAttributes attr = NONE; |
1440 Object* result; | 1436 Object* result; |
1441 { MaybeObject* maybe_result = LoadWithInterceptor(&args, &attr); | 1437 { MaybeObject* maybe_result = LoadWithInterceptor(&args, &attr); |
1442 if (!maybe_result->ToObject(&result)) return maybe_result; | 1438 if (!maybe_result->ToObject(&result)) return maybe_result; |
1443 } | 1439 } |
1444 | 1440 |
1445 // If the property is present, return it. | 1441 // If the property is present, return it. |
1446 if (attr != ABSENT) return result; | 1442 if (attr != ABSENT) return result; |
1447 return ThrowReferenceError(String::cast(args[0])); | 1443 return ThrowReferenceError(String::cast(args[0])); |
1448 } | 1444 } |
1449 | 1445 |
1450 | 1446 |
1451 MaybeObject* LoadPropertyWithInterceptorForCall(RUNTIME_CALLING_CONVENTION) { | 1447 RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorForCall) { |
1452 RUNTIME_GET_ISOLATE; | |
1453 PropertyAttributes attr; | 1448 PropertyAttributes attr; |
1454 MaybeObject* result = LoadWithInterceptor(&args, &attr); | 1449 MaybeObject* result = LoadWithInterceptor(&args, &attr); |
1455 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 1450 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
1456 // This is call IC. In this case, we simply return the undefined result which | 1451 // This is call IC. In this case, we simply return the undefined result which |
1457 // will lead to an exception when trying to invoke the result as a | 1452 // will lead to an exception when trying to invoke the result as a |
1458 // function. | 1453 // function. |
1459 return result; | 1454 return result; |
1460 } | 1455 } |
1461 | 1456 |
1462 | 1457 |
1463 MaybeObject* StoreInterceptorProperty(RUNTIME_CALLING_CONVENTION) { | 1458 RUNTIME_FUNCTION(MaybeObject*, StoreInterceptorProperty) { |
1464 RUNTIME_GET_ISOLATE; | |
1465 ASSERT(args.length() == 4); | 1459 ASSERT(args.length() == 4); |
1466 JSObject* recv = JSObject::cast(args[0]); | 1460 JSObject* recv = JSObject::cast(args[0]); |
1467 String* name = String::cast(args[1]); | 1461 String* name = String::cast(args[1]); |
1468 Object* value = args[2]; | 1462 Object* value = args[2]; |
1469 StrictModeFlag strict_mode = | 1463 StrictModeFlag strict_mode = |
1470 static_cast<StrictModeFlag>(Smi::cast(args[3])->value()); | 1464 static_cast<StrictModeFlag>(Smi::cast(args[3])->value()); |
1471 ASSERT(strict_mode == kStrictMode || strict_mode == kNonStrictMode); | 1465 ASSERT(strict_mode == kStrictMode || strict_mode == kNonStrictMode); |
1472 ASSERT(recv->HasNamedInterceptor()); | 1466 ASSERT(recv->HasNamedInterceptor()); |
1473 PropertyAttributes attr = NONE; | 1467 PropertyAttributes attr = NONE; |
1474 MaybeObject* result = recv->SetPropertyWithInterceptor( | 1468 MaybeObject* result = recv->SetPropertyWithInterceptor( |
1475 name, value, attr, strict_mode); | 1469 name, value, attr, strict_mode); |
1476 return result; | 1470 return result; |
1477 } | 1471 } |
1478 | 1472 |
1479 | 1473 |
1480 MaybeObject* KeyedLoadPropertyWithInterceptor(RUNTIME_CALLING_CONVENTION) { | 1474 RUNTIME_FUNCTION(MaybeObject*, KeyedLoadPropertyWithInterceptor) { |
1481 RUNTIME_GET_ISOLATE; | |
1482 JSObject* receiver = JSObject::cast(args[0]); | 1475 JSObject* receiver = JSObject::cast(args[0]); |
1483 ASSERT(Smi::cast(args[1])->value() >= 0); | 1476 ASSERT(Smi::cast(args[1])->value() >= 0); |
1484 uint32_t index = Smi::cast(args[1])->value(); | 1477 uint32_t index = Smi::cast(args[1])->value(); |
1485 return receiver->GetElementWithInterceptor(receiver, index); | 1478 return receiver->GetElementWithInterceptor(receiver, index); |
1486 } | 1479 } |
1487 | 1480 |
1488 | 1481 |
1489 MaybeObject* StubCompiler::CompileCallInitialize(Code::Flags flags) { | 1482 MaybeObject* StubCompiler::CompileCallInitialize(Code::Flags flags) { |
1490 HandleScope scope(isolate()); | 1483 HandleScope scope(isolate()); |
1491 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1484 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1937 } | 1930 } |
1938 Code* code = Code::cast(result); | 1931 Code* code = Code::cast(result); |
1939 USE(code); | 1932 USE(code); |
1940 PROFILE(isolate(), | 1933 PROFILE(isolate(), |
1941 CodeCreateEvent(Logger::STUB_TAG, code, "ExternalArrayStub")); | 1934 CodeCreateEvent(Logger::STUB_TAG, code, "ExternalArrayStub")); |
1942 return result; | 1935 return result; |
1943 } | 1936 } |
1944 | 1937 |
1945 | 1938 |
1946 } } // namespace v8::internal | 1939 } } // namespace v8::internal |
OLD | NEW |