Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(341)

Side by Side Diff: src/api.cc

Issue 18096: Experimental: merge from bleeding_edge. Merge up to and including... (Closed) Base URL: http://v8.googlecode.com/svn/branches/experimental/toiger/
Patch Set: Created 11 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/api.h ('k') | src/apinatives.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2007-2008 the V8 project authors. All rights reserved. 1 // Copyright 2007-2008 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 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 static inline bool IsDeadCheck(const char* location) { 167 static inline bool IsDeadCheck(const char* location) {
168 return has_shut_down ? ReportV8Dead(location) : false; 168 return has_shut_down ? ReportV8Dead(location) : false;
169 } 169 }
170 170
171 171
172 static inline bool EmptyCheck(const char* location, v8::Handle<v8::Data> obj) { 172 static inline bool EmptyCheck(const char* location, v8::Handle<v8::Data> obj) {
173 return obj.IsEmpty() ? ReportEmptyHandle(location) : false; 173 return obj.IsEmpty() ? ReportEmptyHandle(location) : false;
174 } 174 }
175 175
176 176
177 static inline bool EmptyCheck(const char* location, v8::Data* obj) { 177 static inline bool EmptyCheck(const char* location, const v8::Data* obj) {
178 return (obj == 0) ? ReportEmptyHandle(location) : false; 178 return (obj == 0) ? ReportEmptyHandle(location) : false;
179 } 179 }
180 180
181 // --- S t a t i c s --- 181 // --- S t a t i c s ---
182 182
183 183
184 static i::StringInputBuffer write_input_buffer; 184 static i::StringInputBuffer write_input_buffer;
185 185
186 186
187 static void EnsureInitialized(const char* location) { 187 static void EnsureInitialized(const char* location) {
(...skipping 942 matching lines...) Expand 10 before | Expand all | Expand 10 after
1130 1130
1131 1131
1132 void v8::TryCatch::SetCaptureMessage(bool value) { 1132 void v8::TryCatch::SetCaptureMessage(bool value) {
1133 capture_message_ = value; 1133 capture_message_ = value;
1134 } 1134 }
1135 1135
1136 1136
1137 // --- M e s s a g e --- 1137 // --- M e s s a g e ---
1138 1138
1139 1139
1140 Local<String> Message::Get() { 1140 Local<String> Message::Get() const {
1141 ON_BAILOUT("v8::Message::Get()", return Local<String>()); 1141 ON_BAILOUT("v8::Message::Get()", return Local<String>());
1142 HandleScope scope; 1142 HandleScope scope;
1143 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1143 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1144 i::Handle<i::String> raw_result = i::MessageHandler::GetMessage(obj); 1144 i::Handle<i::String> raw_result = i::MessageHandler::GetMessage(obj);
1145 Local<String> result = Utils::ToLocal(raw_result); 1145 Local<String> result = Utils::ToLocal(raw_result);
1146 return scope.Close(result); 1146 return scope.Close(result);
1147 } 1147 }
1148 1148
1149 1149
1150 v8::Handle<Value> Message::GetScriptResourceName() { 1150 v8::Handle<Value> Message::GetScriptResourceName() const {
1151 if (IsDeadCheck("v8::Message::GetScriptResourceName()")) { 1151 if (IsDeadCheck("v8::Message::GetScriptResourceName()")) {
1152 return Local<String>(); 1152 return Local<String>();
1153 } 1153 }
1154 HandleScope scope; 1154 HandleScope scope;
1155 i::Handle<i::JSObject> obj = 1155 i::Handle<i::JSObject> obj =
1156 i::Handle<i::JSObject>::cast(Utils::OpenHandle(this)); 1156 i::Handle<i::JSObject>::cast(Utils::OpenHandle(this));
1157 // Return this.script.name. 1157 // Return this.script.name.
1158 i::Handle<i::JSValue> script = 1158 i::Handle<i::JSValue> script =
1159 i::Handle<i::JSValue>::cast(GetProperty(obj, "script")); 1159 i::Handle<i::JSValue>::cast(GetProperty(obj, "script"));
1160 i::Handle<i::Object> resource_name(i::Script::cast(script->value())->name()); 1160 i::Handle<i::Object> resource_name(i::Script::cast(script->value())->name());
(...skipping 21 matching lines...) Expand all
1182 bool* has_pending_exception) { 1182 bool* has_pending_exception) {
1183 i::Object** argv[1] = { data.location() }; 1183 i::Object** argv[1] = { data.location() };
1184 return CallV8HeapFunction(name, 1184 return CallV8HeapFunction(name,
1185 i::Top::builtins(), 1185 i::Top::builtins(),
1186 1, 1186 1,
1187 argv, 1187 argv,
1188 has_pending_exception); 1188 has_pending_exception);
1189 } 1189 }
1190 1190
1191 1191
1192 int Message::GetLineNumber() { 1192 int Message::GetLineNumber() const {
1193 ON_BAILOUT("v8::Message::GetLineNumber()", return -1); 1193 ON_BAILOUT("v8::Message::GetLineNumber()", return -1);
1194 HandleScope scope; 1194 HandleScope scope;
1195 EXCEPTION_PREAMBLE(); 1195 EXCEPTION_PREAMBLE();
1196 i::Handle<i::Object> result = CallV8HeapFunction("GetLineNumber", 1196 i::Handle<i::Object> result = CallV8HeapFunction("GetLineNumber",
1197 Utils::OpenHandle(this), 1197 Utils::OpenHandle(this),
1198 &has_pending_exception); 1198 &has_pending_exception);
1199 EXCEPTION_BAILOUT_CHECK(0); 1199 EXCEPTION_BAILOUT_CHECK(0);
1200 return static_cast<int>(result->Number()); 1200 return static_cast<int>(result->Number());
1201 } 1201 }
1202 1202
1203 1203
1204 int Message::GetStartPosition() { 1204 int Message::GetStartPosition() const {
1205 if (IsDeadCheck("v8::Message::GetStartPosition()")) return 0; 1205 if (IsDeadCheck("v8::Message::GetStartPosition()")) return 0;
1206 HandleScope scope; 1206 HandleScope scope;
1207 1207
1208 i::Handle<i::JSObject> data_obj = Utils::OpenHandle(this); 1208 i::Handle<i::JSObject> data_obj = Utils::OpenHandle(this);
1209 return static_cast<int>(GetProperty(data_obj, "startPos")->Number()); 1209 return static_cast<int>(GetProperty(data_obj, "startPos")->Number());
1210 } 1210 }
1211 1211
1212 1212
1213 int Message::GetEndPosition() { 1213 int Message::GetEndPosition() const {
1214 if (IsDeadCheck("v8::Message::GetEndPosition()")) return 0; 1214 if (IsDeadCheck("v8::Message::GetEndPosition()")) return 0;
1215 HandleScope scope; 1215 HandleScope scope;
1216 i::Handle<i::JSObject> data_obj = Utils::OpenHandle(this); 1216 i::Handle<i::JSObject> data_obj = Utils::OpenHandle(this);
1217 return static_cast<int>(GetProperty(data_obj, "endPos")->Number()); 1217 return static_cast<int>(GetProperty(data_obj, "endPos")->Number());
1218 } 1218 }
1219 1219
1220 1220
1221 int Message::GetStartColumn() { 1221 int Message::GetStartColumn() const {
1222 if (IsDeadCheck("v8::Message::GetStartColumn()")) return 0; 1222 if (IsDeadCheck("v8::Message::GetStartColumn()")) return 0;
1223 HandleScope scope; 1223 HandleScope scope;
1224 i::Handle<i::JSObject> data_obj = Utils::OpenHandle(this); 1224 i::Handle<i::JSObject> data_obj = Utils::OpenHandle(this);
1225 EXCEPTION_PREAMBLE(); 1225 EXCEPTION_PREAMBLE();
1226 i::Handle<i::Object> start_col_obj = CallV8HeapFunction( 1226 i::Handle<i::Object> start_col_obj = CallV8HeapFunction(
1227 "GetPositionInLine", 1227 "GetPositionInLine",
1228 data_obj, 1228 data_obj,
1229 &has_pending_exception); 1229 &has_pending_exception);
1230 EXCEPTION_BAILOUT_CHECK(0); 1230 EXCEPTION_BAILOUT_CHECK(0);
1231 return static_cast<int>(start_col_obj->Number()); 1231 return static_cast<int>(start_col_obj->Number());
1232 } 1232 }
1233 1233
1234 1234
1235 int Message::GetEndColumn() { 1235 int Message::GetEndColumn() const {
1236 if (IsDeadCheck("v8::Message::GetEndColumn()")) return 0; 1236 if (IsDeadCheck("v8::Message::GetEndColumn()")) return 0;
1237 HandleScope scope; 1237 HandleScope scope;
1238 i::Handle<i::JSObject> data_obj = Utils::OpenHandle(this); 1238 i::Handle<i::JSObject> data_obj = Utils::OpenHandle(this);
1239 EXCEPTION_PREAMBLE(); 1239 EXCEPTION_PREAMBLE();
1240 i::Handle<i::Object> start_col_obj = CallV8HeapFunction( 1240 i::Handle<i::Object> start_col_obj = CallV8HeapFunction(
1241 "GetPositionInLine", 1241 "GetPositionInLine",
1242 data_obj, 1242 data_obj,
1243 &has_pending_exception); 1243 &has_pending_exception);
1244 EXCEPTION_BAILOUT_CHECK(0); 1244 EXCEPTION_BAILOUT_CHECK(0);
1245 int start = static_cast<int>(GetProperty(data_obj, "startPos")->Number()); 1245 int start = static_cast<int>(GetProperty(data_obj, "startPos")->Number());
1246 int end = static_cast<int>(GetProperty(data_obj, "endPos")->Number()); 1246 int end = static_cast<int>(GetProperty(data_obj, "endPos")->Number());
1247 return static_cast<int>(start_col_obj->Number()) + (end - start); 1247 return static_cast<int>(start_col_obj->Number()) + (end - start);
1248 } 1248 }
1249 1249
1250 1250
1251 Local<String> Message::GetSourceLine() { 1251 Local<String> Message::GetSourceLine() const {
1252 ON_BAILOUT("v8::Message::GetSourceLine()", return Local<String>()); 1252 ON_BAILOUT("v8::Message::GetSourceLine()", return Local<String>());
1253 HandleScope scope; 1253 HandleScope scope;
1254 EXCEPTION_PREAMBLE(); 1254 EXCEPTION_PREAMBLE();
1255 i::Handle<i::Object> result = CallV8HeapFunction("GetSourceLine", 1255 i::Handle<i::Object> result = CallV8HeapFunction("GetSourceLine",
1256 Utils::OpenHandle(this), 1256 Utils::OpenHandle(this),
1257 &has_pending_exception); 1257 &has_pending_exception);
1258 EXCEPTION_BAILOUT_CHECK(Local<v8::String>()); 1258 EXCEPTION_BAILOUT_CHECK(Local<v8::String>());
1259 if (result->IsString()) { 1259 if (result->IsString()) {
1260 return scope.Close(Utils::ToLocal(i::Handle<i::String>::cast(result))); 1260 return scope.Close(Utils::ToLocal(i::Handle<i::String>::cast(result)));
1261 } else { 1261 } else {
1262 return Local<String>(); 1262 return Local<String>();
1263 } 1263 }
1264 } 1264 }
1265 1265
1266 1266
1267 void Message::PrintCurrentStackTrace(FILE* out) { 1267 void Message::PrintCurrentStackTrace(FILE* out) {
1268 if (IsDeadCheck("v8::Message::PrintCurrentStackTrace()")) return; 1268 if (IsDeadCheck("v8::Message::PrintCurrentStackTrace()")) return;
1269 i::Top::PrintCurrentStackTrace(out); 1269 i::Top::PrintCurrentStackTrace(out);
1270 } 1270 }
1271 1271
1272 1272
1273 // --- D a t a --- 1273 // --- D a t a ---
1274 1274
1275 bool Value::IsUndefined() { 1275 bool Value::IsUndefined() const {
1276 if (IsDeadCheck("v8::Value::IsUndefined()")) return false; 1276 if (IsDeadCheck("v8::Value::IsUndefined()")) return false;
1277 return Utils::OpenHandle(this)->IsUndefined(); 1277 return Utils::OpenHandle(this)->IsUndefined();
1278 } 1278 }
1279 1279
1280 1280
1281 bool Value::IsNull() { 1281 bool Value::IsNull() const {
1282 if (IsDeadCheck("v8::Value::IsNull()")) return false; 1282 if (IsDeadCheck("v8::Value::IsNull()")) return false;
1283 return Utils::OpenHandle(this)->IsNull(); 1283 return Utils::OpenHandle(this)->IsNull();
1284 } 1284 }
1285 1285
1286 1286
1287 bool Value::IsTrue() { 1287 bool Value::IsTrue() const {
1288 if (IsDeadCheck("v8::Value::IsTrue()")) return false; 1288 if (IsDeadCheck("v8::Value::IsTrue()")) return false;
1289 return Utils::OpenHandle(this)->IsTrue(); 1289 return Utils::OpenHandle(this)->IsTrue();
1290 } 1290 }
1291 1291
1292 1292
1293 bool Value::IsFalse() { 1293 bool Value::IsFalse() const {
1294 if (IsDeadCheck("v8::Value::IsFalse()")) return false; 1294 if (IsDeadCheck("v8::Value::IsFalse()")) return false;
1295 return Utils::OpenHandle(this)->IsFalse(); 1295 return Utils::OpenHandle(this)->IsFalse();
1296 } 1296 }
1297 1297
1298 1298
1299 bool Value::IsFunction() { 1299 bool Value::IsFunction() const {
1300 if (IsDeadCheck("v8::Value::IsFunction()")) return false; 1300 if (IsDeadCheck("v8::Value::IsFunction()")) return false;
1301 return Utils::OpenHandle(this)->IsJSFunction(); 1301 return Utils::OpenHandle(this)->IsJSFunction();
1302 } 1302 }
1303 1303
1304 1304
1305 bool Value::IsString() { 1305 bool Value::IsString() const {
1306 if (IsDeadCheck("v8::Value::IsString()")) return false; 1306 if (IsDeadCheck("v8::Value::IsString()")) return false;
1307 return Utils::OpenHandle(this)->IsString(); 1307 return Utils::OpenHandle(this)->IsString();
1308 } 1308 }
1309 1309
1310 1310
1311 bool Value::IsArray() { 1311 bool Value::IsArray() const {
1312 if (IsDeadCheck("v8::Value::IsArray()")) return false; 1312 if (IsDeadCheck("v8::Value::IsArray()")) return false;
1313 return Utils::OpenHandle(this)->IsJSArray(); 1313 return Utils::OpenHandle(this)->IsJSArray();
1314 } 1314 }
1315 1315
1316 1316
1317 bool Value::IsObject() { 1317 bool Value::IsObject() const {
1318 if (IsDeadCheck("v8::Value::IsObject()")) return false; 1318 if (IsDeadCheck("v8::Value::IsObject()")) return false;
1319 return Utils::OpenHandle(this)->IsJSObject(); 1319 return Utils::OpenHandle(this)->IsJSObject();
1320 } 1320 }
1321 1321
1322 1322
1323 bool Value::IsNumber() { 1323 bool Value::IsNumber() const {
1324 if (IsDeadCheck("v8::Value::IsNumber()")) return false; 1324 if (IsDeadCheck("v8::Value::IsNumber()")) return false;
1325 return Utils::OpenHandle(this)->IsNumber(); 1325 return Utils::OpenHandle(this)->IsNumber();
1326 } 1326 }
1327 1327
1328 1328
1329 bool Value::IsBoolean() { 1329 bool Value::IsBoolean() const {
1330 if (IsDeadCheck("v8::Value::IsBoolean()")) return false; 1330 if (IsDeadCheck("v8::Value::IsBoolean()")) return false;
1331 return Utils::OpenHandle(this)->IsBoolean(); 1331 return Utils::OpenHandle(this)->IsBoolean();
1332 } 1332 }
1333 1333
1334 1334
1335 bool Value::IsExternal() { 1335 bool Value::IsExternal() const {
1336 if (IsDeadCheck("v8::Value::IsExternal()")) return false; 1336 if (IsDeadCheck("v8::Value::IsExternal()")) return false;
1337 return Utils::OpenHandle(this)->IsProxy(); 1337 return Utils::OpenHandle(this)->IsProxy();
1338 } 1338 }
1339 1339
1340 1340
1341 bool Value::IsInt32() { 1341 bool Value::IsInt32() const {
1342 if (IsDeadCheck("v8::Value::IsInt32()")) return false; 1342 if (IsDeadCheck("v8::Value::IsInt32()")) return false;
1343 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1343 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1344 if (obj->IsSmi()) return true; 1344 if (obj->IsSmi()) return true;
1345 if (obj->IsNumber()) { 1345 if (obj->IsNumber()) {
1346 double value = obj->Number(); 1346 double value = obj->Number();
1347 return i::FastI2D(i::FastD2I(value)) == value; 1347 return i::FastI2D(i::FastD2I(value)) == value;
1348 } 1348 }
1349 return false; 1349 return false;
1350 } 1350 }
1351 1351
1352 1352
1353 bool Value::IsDate() { 1353 bool Value::IsDate() const {
1354 if (IsDeadCheck("v8::Value::IsDate()")) return false; 1354 if (IsDeadCheck("v8::Value::IsDate()")) return false;
1355 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1355 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1356 return obj->HasSpecificClassOf(i::Heap::Date_symbol()); 1356 return obj->HasSpecificClassOf(i::Heap::Date_symbol());
1357 } 1357 }
1358 1358
1359 1359
1360 Local<String> Value::ToString() { 1360 Local<String> Value::ToString() const {
1361 if (IsDeadCheck("v8::Value::ToString()")) return Local<String>(); 1361 if (IsDeadCheck("v8::Value::ToString()")) return Local<String>();
1362 LOG_API("ToString"); 1362 LOG_API("ToString");
1363 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1363 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1364 i::Handle<i::Object> str; 1364 i::Handle<i::Object> str;
1365 if (obj->IsString()) { 1365 if (obj->IsString()) {
1366 str = obj; 1366 str = obj;
1367 } else { 1367 } else {
1368 EXCEPTION_PREAMBLE(); 1368 EXCEPTION_PREAMBLE();
1369 str = i::Execution::ToString(obj, &has_pending_exception); 1369 str = i::Execution::ToString(obj, &has_pending_exception);
1370 EXCEPTION_BAILOUT_CHECK(Local<String>()); 1370 EXCEPTION_BAILOUT_CHECK(Local<String>());
1371 } 1371 }
1372 return Local<String>(ToApi<String>(str)); 1372 return Local<String>(ToApi<String>(str));
1373 } 1373 }
1374 1374
1375 1375
1376 Local<String> Value::ToDetailString() { 1376 Local<String> Value::ToDetailString() const {
1377 if (IsDeadCheck("v8::Value::ToDetailString()")) return Local<String>(); 1377 if (IsDeadCheck("v8::Value::ToDetailString()")) return Local<String>();
1378 LOG_API("ToDetailString"); 1378 LOG_API("ToDetailString");
1379 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1379 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1380 i::Handle<i::Object> str; 1380 i::Handle<i::Object> str;
1381 if (obj->IsString()) { 1381 if (obj->IsString()) {
1382 str = obj; 1382 str = obj;
1383 } else { 1383 } else {
1384 EXCEPTION_PREAMBLE(); 1384 EXCEPTION_PREAMBLE();
1385 str = i::Execution::ToDetailString(obj, &has_pending_exception); 1385 str = i::Execution::ToDetailString(obj, &has_pending_exception);
1386 EXCEPTION_BAILOUT_CHECK(Local<String>()); 1386 EXCEPTION_BAILOUT_CHECK(Local<String>());
1387 } 1387 }
1388 return Local<String>(ToApi<String>(str)); 1388 return Local<String>(ToApi<String>(str));
1389 } 1389 }
1390 1390
1391 1391
1392 Local<v8::Object> Value::ToObject() { 1392 Local<v8::Object> Value::ToObject() const {
1393 if (IsDeadCheck("v8::Value::ToObject()")) return Local<v8::Object>(); 1393 if (IsDeadCheck("v8::Value::ToObject()")) return Local<v8::Object>();
1394 LOG_API("ToObject"); 1394 LOG_API("ToObject");
1395 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1395 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1396 i::Handle<i::Object> val; 1396 i::Handle<i::Object> val;
1397 if (obj->IsJSObject()) { 1397 if (obj->IsJSObject()) {
1398 val = obj; 1398 val = obj;
1399 } else { 1399 } else {
1400 EXCEPTION_PREAMBLE(); 1400 EXCEPTION_PREAMBLE();
1401 val = i::Execution::ToObject(obj, &has_pending_exception); 1401 val = i::Execution::ToObject(obj, &has_pending_exception);
1402 EXCEPTION_BAILOUT_CHECK(Local<v8::Object>()); 1402 EXCEPTION_BAILOUT_CHECK(Local<v8::Object>());
1403 } 1403 }
1404 return Local<v8::Object>(ToApi<Object>(val)); 1404 return Local<v8::Object>(ToApi<Object>(val));
1405 } 1405 }
1406 1406
1407 1407
1408 Local<Boolean> Value::ToBoolean() { 1408 Local<Boolean> Value::ToBoolean() const {
1409 if (IsDeadCheck("v8::Value::ToBoolean()")) return Local<Boolean>(); 1409 if (IsDeadCheck("v8::Value::ToBoolean()")) return Local<Boolean>();
1410 LOG_API("ToBoolean"); 1410 LOG_API("ToBoolean");
1411 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1411 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1412 i::Handle<i::Object> val = 1412 i::Handle<i::Object> val =
1413 obj->IsBoolean() ? obj : i::Execution::ToBoolean(obj); 1413 obj->IsBoolean() ? obj : i::Execution::ToBoolean(obj);
1414 return Local<Boolean>(ToApi<Boolean>(val)); 1414 return Local<Boolean>(ToApi<Boolean>(val));
1415 } 1415 }
1416 1416
1417 1417
1418 Local<Number> Value::ToNumber() { 1418 Local<Number> Value::ToNumber() const {
1419 if (IsDeadCheck("v8::Value::ToNumber()")) return Local<Number>(); 1419 if (IsDeadCheck("v8::Value::ToNumber()")) return Local<Number>();
1420 LOG_API("ToNumber"); 1420 LOG_API("ToNumber");
1421 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1421 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1422 i::Handle<i::Object> num; 1422 i::Handle<i::Object> num;
1423 if (obj->IsNumber()) { 1423 if (obj->IsNumber()) {
1424 num = obj; 1424 num = obj;
1425 } else { 1425 } else {
1426 EXCEPTION_PREAMBLE(); 1426 EXCEPTION_PREAMBLE();
1427 num = i::Execution::ToNumber(obj, &has_pending_exception); 1427 num = i::Execution::ToNumber(obj, &has_pending_exception);
1428 EXCEPTION_BAILOUT_CHECK(Local<Number>()); 1428 EXCEPTION_BAILOUT_CHECK(Local<Number>());
1429 } 1429 }
1430 return Local<Number>(ToApi<Number>(num)); 1430 return Local<Number>(ToApi<Number>(num));
1431 } 1431 }
1432 1432
1433 1433
1434 Local<Integer> Value::ToInteger() { 1434 Local<Integer> Value::ToInteger() const {
1435 if (IsDeadCheck("v8::Value::ToInteger()")) return Local<Integer>(); 1435 if (IsDeadCheck("v8::Value::ToInteger()")) return Local<Integer>();
1436 LOG_API("ToInteger"); 1436 LOG_API("ToInteger");
1437 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1437 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1438 i::Handle<i::Object> num; 1438 i::Handle<i::Object> num;
1439 if (obj->IsSmi()) { 1439 if (obj->IsSmi()) {
1440 num = obj; 1440 num = obj;
1441 } else { 1441 } else {
1442 EXCEPTION_PREAMBLE(); 1442 EXCEPTION_PREAMBLE();
1443 num = i::Execution::ToInteger(obj, &has_pending_exception); 1443 num = i::Execution::ToInteger(obj, &has_pending_exception);
1444 EXCEPTION_BAILOUT_CHECK(Local<Integer>()); 1444 EXCEPTION_BAILOUT_CHECK(Local<Integer>());
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1520 v8::Date* v8::Date::Cast(v8::Value* that) { 1520 v8::Date* v8::Date::Cast(v8::Value* that) {
1521 if (IsDeadCheck("v8::Date::Cast()")) return 0; 1521 if (IsDeadCheck("v8::Date::Cast()")) return 0;
1522 i::Handle<i::Object> obj = Utils::OpenHandle(that); 1522 i::Handle<i::Object> obj = Utils::OpenHandle(that);
1523 ApiCheck(obj->HasSpecificClassOf(i::Heap::Date_symbol()), 1523 ApiCheck(obj->HasSpecificClassOf(i::Heap::Date_symbol()),
1524 "v8::Date::Cast()", 1524 "v8::Date::Cast()",
1525 "Could not convert to date"); 1525 "Could not convert to date");
1526 return static_cast<v8::Date*>(that); 1526 return static_cast<v8::Date*>(that);
1527 } 1527 }
1528 1528
1529 1529
1530 bool Value::BooleanValue() { 1530 bool Value::BooleanValue() const {
1531 if (IsDeadCheck("v8::Value::BooleanValue()")) return false; 1531 if (IsDeadCheck("v8::Value::BooleanValue()")) return false;
1532 LOG_API("BooleanValue"); 1532 LOG_API("BooleanValue");
1533 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1533 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1534 i::Handle<i::Object> value = 1534 i::Handle<i::Object> value =
1535 obj->IsBoolean() ? obj : i::Execution::ToBoolean(obj); 1535 obj->IsBoolean() ? obj : i::Execution::ToBoolean(obj);
1536 return value->IsTrue(); 1536 return value->IsTrue();
1537 } 1537 }
1538 1538
1539 1539
1540 double Value::NumberValue() { 1540 double Value::NumberValue() const {
1541 if (IsDeadCheck("v8::Value::NumberValue()")) return i::OS::nan_value(); 1541 if (IsDeadCheck("v8::Value::NumberValue()")) return i::OS::nan_value();
1542 LOG_API("NumberValue"); 1542 LOG_API("NumberValue");
1543 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1543 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1544 i::Handle<i::Object> num; 1544 i::Handle<i::Object> num;
1545 if (obj->IsNumber()) { 1545 if (obj->IsNumber()) {
1546 num = obj; 1546 num = obj;
1547 } else { 1547 } else {
1548 EXCEPTION_PREAMBLE(); 1548 EXCEPTION_PREAMBLE();
1549 num = i::Execution::ToNumber(obj, &has_pending_exception); 1549 num = i::Execution::ToNumber(obj, &has_pending_exception);
1550 EXCEPTION_BAILOUT_CHECK(i::OS::nan_value()); 1550 EXCEPTION_BAILOUT_CHECK(i::OS::nan_value());
1551 } 1551 }
1552 return num->Number(); 1552 return num->Number();
1553 } 1553 }
1554 1554
1555 1555
1556 int64_t Value::IntegerValue() { 1556 int64_t Value::IntegerValue() const {
1557 if (IsDeadCheck("v8::Value::IntegerValue()")) return 0; 1557 if (IsDeadCheck("v8::Value::IntegerValue()")) return 0;
1558 LOG_API("IntegerValue"); 1558 LOG_API("IntegerValue");
1559 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1559 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1560 i::Handle<i::Object> num; 1560 i::Handle<i::Object> num;
1561 if (obj->IsNumber()) { 1561 if (obj->IsNumber()) {
1562 num = obj; 1562 num = obj;
1563 } else { 1563 } else {
1564 EXCEPTION_PREAMBLE(); 1564 EXCEPTION_PREAMBLE();
1565 num = i::Execution::ToInteger(obj, &has_pending_exception); 1565 num = i::Execution::ToInteger(obj, &has_pending_exception);
1566 EXCEPTION_BAILOUT_CHECK(0); 1566 EXCEPTION_BAILOUT_CHECK(0);
1567 } 1567 }
1568 if (num->IsSmi()) { 1568 if (num->IsSmi()) {
1569 return i::Smi::cast(*num)->value(); 1569 return i::Smi::cast(*num)->value();
1570 } else { 1570 } else {
1571 return static_cast<int64_t>(num->Number()); 1571 return static_cast<int64_t>(num->Number());
1572 } 1572 }
1573 } 1573 }
1574 1574
1575 1575
1576 Local<Int32> Value::ToInt32() { 1576 Local<Int32> Value::ToInt32() const {
1577 if (IsDeadCheck("v8::Value::ToInt32()")) return Local<Int32>(); 1577 if (IsDeadCheck("v8::Value::ToInt32()")) return Local<Int32>();
1578 LOG_API("ToInt32"); 1578 LOG_API("ToInt32");
1579 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1579 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1580 i::Handle<i::Object> num; 1580 i::Handle<i::Object> num;
1581 if (obj->IsSmi()) { 1581 if (obj->IsSmi()) {
1582 num = obj; 1582 num = obj;
1583 } else { 1583 } else {
1584 EXCEPTION_PREAMBLE(); 1584 EXCEPTION_PREAMBLE();
1585 num = i::Execution::ToInt32(obj, &has_pending_exception); 1585 num = i::Execution::ToInt32(obj, &has_pending_exception);
1586 EXCEPTION_BAILOUT_CHECK(Local<Int32>()); 1586 EXCEPTION_BAILOUT_CHECK(Local<Int32>());
1587 } 1587 }
1588 return Local<Int32>(ToApi<Int32>(num)); 1588 return Local<Int32>(ToApi<Int32>(num));
1589 } 1589 }
1590 1590
1591 1591
1592 Local<Uint32> Value::ToUint32() { 1592 Local<Uint32> Value::ToUint32() const {
1593 if (IsDeadCheck("v8::Value::ToUint32()")) return Local<Uint32>(); 1593 if (IsDeadCheck("v8::Value::ToUint32()")) return Local<Uint32>();
1594 LOG_API("ToUInt32"); 1594 LOG_API("ToUInt32");
1595 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1595 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1596 i::Handle<i::Object> num; 1596 i::Handle<i::Object> num;
1597 if (obj->IsSmi()) { 1597 if (obj->IsSmi()) {
1598 num = obj; 1598 num = obj;
1599 } else { 1599 } else {
1600 EXCEPTION_PREAMBLE(); 1600 EXCEPTION_PREAMBLE();
1601 num = i::Execution::ToUint32(obj, &has_pending_exception); 1601 num = i::Execution::ToUint32(obj, &has_pending_exception);
1602 EXCEPTION_BAILOUT_CHECK(Local<Uint32>()); 1602 EXCEPTION_BAILOUT_CHECK(Local<Uint32>());
1603 } 1603 }
1604 return Local<Uint32>(ToApi<Uint32>(num)); 1604 return Local<Uint32>(ToApi<Uint32>(num));
1605 } 1605 }
1606 1606
1607 1607
1608 Local<Uint32> Value::ToArrayIndex() { 1608 Local<Uint32> Value::ToArrayIndex() const {
1609 if (IsDeadCheck("v8::Value::ToArrayIndex()")) return Local<Uint32>(); 1609 if (IsDeadCheck("v8::Value::ToArrayIndex()")) return Local<Uint32>();
1610 LOG_API("ToArrayIndex"); 1610 LOG_API("ToArrayIndex");
1611 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1611 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1612 if (obj->IsSmi()) { 1612 if (obj->IsSmi()) {
1613 if (i::Smi::cast(*obj)->value() >= 0) return Utils::Uint32ToLocal(obj); 1613 if (i::Smi::cast(*obj)->value() >= 0) return Utils::Uint32ToLocal(obj);
1614 return Local<Uint32>(); 1614 return Local<Uint32>();
1615 } 1615 }
1616 EXCEPTION_PREAMBLE(); 1616 EXCEPTION_PREAMBLE();
1617 i::Handle<i::Object> string_obj = 1617 i::Handle<i::Object> string_obj =
1618 i::Execution::ToString(obj, &has_pending_exception); 1618 i::Execution::ToString(obj, &has_pending_exception);
1619 EXCEPTION_BAILOUT_CHECK(Local<Uint32>()); 1619 EXCEPTION_BAILOUT_CHECK(Local<Uint32>());
1620 i::Handle<i::String> str = i::Handle<i::String>::cast(string_obj); 1620 i::Handle<i::String> str = i::Handle<i::String>::cast(string_obj);
1621 uint32_t index; 1621 uint32_t index;
1622 if (str->AsArrayIndex(&index)) { 1622 if (str->AsArrayIndex(&index)) {
1623 i::Handle<i::Object> value; 1623 i::Handle<i::Object> value;
1624 if (index <= static_cast<uint32_t>(i::Smi::kMaxValue)) { 1624 if (index <= static_cast<uint32_t>(i::Smi::kMaxValue)) {
1625 value = i::Handle<i::Object>(i::Smi::FromInt(index)); 1625 value = i::Handle<i::Object>(i::Smi::FromInt(index));
1626 } else { 1626 } else {
1627 value = i::Factory::NewNumber(index); 1627 value = i::Factory::NewNumber(index);
1628 } 1628 }
1629 return Utils::Uint32ToLocal(value); 1629 return Utils::Uint32ToLocal(value);
1630 } 1630 }
1631 return Local<Uint32>(); 1631 return Local<Uint32>();
1632 } 1632 }
1633 1633
1634 1634
1635 int32_t Value::Int32Value() { 1635 int32_t Value::Int32Value() const {
1636 if (IsDeadCheck("v8::Value::Int32Value()")) return 0; 1636 if (IsDeadCheck("v8::Value::Int32Value()")) return 0;
1637 LOG_API("Int32Value"); 1637 LOG_API("Int32Value");
1638 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1638 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1639 if (obj->IsSmi()) { 1639 if (obj->IsSmi()) {
1640 return i::Smi::cast(*obj)->value(); 1640 return i::Smi::cast(*obj)->value();
1641 } else { 1641 } else {
1642 LOG_API("Int32Value (slow)"); 1642 LOG_API("Int32Value (slow)");
1643 EXCEPTION_PREAMBLE(); 1643 EXCEPTION_PREAMBLE();
1644 i::Handle<i::Object> num = 1644 i::Handle<i::Object> num =
1645 i::Execution::ToInt32(obj, &has_pending_exception); 1645 i::Execution::ToInt32(obj, &has_pending_exception);
1646 EXCEPTION_BAILOUT_CHECK(0); 1646 EXCEPTION_BAILOUT_CHECK(0);
1647 if (num->IsSmi()) { 1647 if (num->IsSmi()) {
1648 return i::Smi::cast(*num)->value(); 1648 return i::Smi::cast(*num)->value();
1649 } else { 1649 } else {
1650 return static_cast<int32_t>(num->Number()); 1650 return static_cast<int32_t>(num->Number());
1651 } 1651 }
1652 } 1652 }
1653 } 1653 }
1654 1654
1655 1655
1656 bool Value::Equals(Handle<Value> that) { 1656 bool Value::Equals(Handle<Value> that) const {
1657 if (IsDeadCheck("v8::Value::Equals()") 1657 if (IsDeadCheck("v8::Value::Equals()")
1658 || EmptyCheck("v8::Value::Equals()", this) 1658 || EmptyCheck("v8::Value::Equals()", this)
1659 || EmptyCheck("v8::Value::Equals()", that)) 1659 || EmptyCheck("v8::Value::Equals()", that))
1660 return false; 1660 return false;
1661 LOG_API("Equals"); 1661 LOG_API("Equals");
1662 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1662 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1663 i::Handle<i::Object> other = Utils::OpenHandle(*that); 1663 i::Handle<i::Object> other = Utils::OpenHandle(*that);
1664 i::Object** args[1] = { other.location() }; 1664 i::Object** args[1] = { other.location() };
1665 EXCEPTION_PREAMBLE(); 1665 EXCEPTION_PREAMBLE();
1666 i::Handle<i::Object> result = 1666 i::Handle<i::Object> result =
1667 CallV8HeapFunction("EQUALS", obj, 1, args, &has_pending_exception); 1667 CallV8HeapFunction("EQUALS", obj, 1, args, &has_pending_exception);
1668 EXCEPTION_BAILOUT_CHECK(false); 1668 EXCEPTION_BAILOUT_CHECK(false);
1669 return *result == i::Smi::FromInt(i::EQUAL); 1669 return *result == i::Smi::FromInt(i::EQUAL);
1670 } 1670 }
1671 1671
1672 1672
1673 bool Value::StrictEquals(Handle<Value> that) { 1673 bool Value::StrictEquals(Handle<Value> that) const {
1674 if (IsDeadCheck("v8::Value::StrictEquals()") 1674 if (IsDeadCheck("v8::Value::StrictEquals()")
1675 || EmptyCheck("v8::Value::StrictEquals()", this) 1675 || EmptyCheck("v8::Value::StrictEquals()", this)
1676 || EmptyCheck("v8::Value::StrictEquals()", that)) 1676 || EmptyCheck("v8::Value::StrictEquals()", that))
1677 return false; 1677 return false;
1678 LOG_API("StrictEquals"); 1678 LOG_API("StrictEquals");
1679 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1679 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1680 i::Handle<i::Object> other = Utils::OpenHandle(*that); 1680 i::Handle<i::Object> other = Utils::OpenHandle(*that);
1681 // Must check HeapNumber first, since NaN !== NaN. 1681 // Must check HeapNumber first, since NaN !== NaN.
1682 if (obj->IsHeapNumber()) { 1682 if (obj->IsHeapNumber()) {
1683 if (!other->IsNumber()) return false; 1683 if (!other->IsNumber()) return false;
1684 double x = obj->Number(); 1684 double x = obj->Number();
1685 double y = other->Number(); 1685 double y = other->Number();
1686 // Must check explicitly for NaN:s on Windows, but -0 works fine. 1686 // Must check explicitly for NaN:s on Windows, but -0 works fine.
1687 return x == y && !isnan(x) && !isnan(y); 1687 return x == y && !isnan(x) && !isnan(y);
1688 } else if (*obj == *other) { // Also covers Booleans. 1688 } else if (*obj == *other) { // Also covers Booleans.
1689 return true; 1689 return true;
1690 } else if (obj->IsSmi()) { 1690 } else if (obj->IsSmi()) {
1691 return other->IsNumber() && obj->Number() == other->Number(); 1691 return other->IsNumber() && obj->Number() == other->Number();
1692 } else if (obj->IsString()) { 1692 } else if (obj->IsString()) {
1693 return other->IsString() && 1693 return other->IsString() &&
1694 i::String::cast(*obj)->Equals(i::String::cast(*other)); 1694 i::String::cast(*obj)->Equals(i::String::cast(*other));
1695 } else if (obj->IsUndefined() || obj->IsUndetectableObject()) { 1695 } else if (obj->IsUndefined() || obj->IsUndetectableObject()) {
1696 return other->IsUndefined() || other->IsUndetectableObject(); 1696 return other->IsUndefined() || other->IsUndetectableObject();
1697 } else { 1697 } else {
1698 return false; 1698 return false;
1699 } 1699 }
1700 } 1700 }
1701 1701
1702 1702
1703 uint32_t Value::Uint32Value() { 1703 uint32_t Value::Uint32Value() const {
1704 if (IsDeadCheck("v8::Value::Uint32Value()")) return 0; 1704 if (IsDeadCheck("v8::Value::Uint32Value()")) return 0;
1705 LOG_API("Uint32Value"); 1705 LOG_API("Uint32Value");
1706 i::Handle<i::Object> obj = Utils::OpenHandle(this); 1706 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1707 if (obj->IsSmi()) { 1707 if (obj->IsSmi()) {
1708 return i::Smi::cast(*obj)->value(); 1708 return i::Smi::cast(*obj)->value();
1709 } else { 1709 } else {
1710 EXCEPTION_PREAMBLE(); 1710 EXCEPTION_PREAMBLE();
1711 i::Handle<i::Object> num = 1711 i::Handle<i::Object> num =
1712 i::Execution::ToUint32(obj, &has_pending_exception); 1712 i::Execution::ToUint32(obj, &has_pending_exception);
1713 EXCEPTION_BAILOUT_CHECK(0); 1713 EXCEPTION_BAILOUT_CHECK(0);
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
1915 ON_BAILOUT("v8::Object::TurnOnAccessCheck()", return); 1915 ON_BAILOUT("v8::Object::TurnOnAccessCheck()", return);
1916 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); 1916 i::Handle<i::JSObject> obj = Utils::OpenHandle(this);
1917 1917
1918 i::Handle<i::Map> new_map = 1918 i::Handle<i::Map> new_map =
1919 i::Factory::CopyMapDropTransitions(i::Handle<i::Map>(obj->map())); 1919 i::Factory::CopyMapDropTransitions(i::Handle<i::Map>(obj->map()));
1920 new_map->set_is_access_check_needed(true); 1920 new_map->set_is_access_check_needed(true);
1921 obj->set_map(*new_map); 1921 obj->set_map(*new_map);
1922 } 1922 }
1923 1923
1924 1924
1925 Local<v8::Object> Function::NewInstance() { 1925 Local<v8::Object> Function::NewInstance() const {
1926 return NewInstance(0, NULL); 1926 return NewInstance(0, NULL);
1927 } 1927 }
1928 1928
1929 1929
1930 Local<v8::Object> Function::NewInstance(int argc, 1930 Local<v8::Object> Function::NewInstance(int argc,
1931 v8::Handle<v8::Value> argv[]) { 1931 v8::Handle<v8::Value> argv[]) const {
1932 ON_BAILOUT("v8::Function::NewInstance()", return Local<v8::Object>()); 1932 ON_BAILOUT("v8::Function::NewInstance()", return Local<v8::Object>());
1933 LOG_API("Function::NewInstance"); 1933 LOG_API("Function::NewInstance");
1934 HandleScope scope; 1934 HandleScope scope;
1935 i::Handle<i::JSFunction> function = Utils::OpenHandle(this); 1935 i::Handle<i::JSFunction> function = Utils::OpenHandle(this);
1936 STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**)); 1936 STATIC_ASSERT(sizeof(v8::Handle<v8::Value>) == sizeof(i::Object**));
1937 i::Object*** args = reinterpret_cast<i::Object***>(argv); 1937 i::Object*** args = reinterpret_cast<i::Object***>(argv);
1938 EXCEPTION_PREAMBLE(); 1938 EXCEPTION_PREAMBLE();
1939 i::Handle<i::Object> returned = 1939 i::Handle<i::Object> returned =
1940 i::Execution::New(function, argc, args, &has_pending_exception); 1940 i::Execution::New(function, argc, args, &has_pending_exception);
1941 EXCEPTION_BAILOUT_CHECK(Local<v8::Object>()); 1941 EXCEPTION_BAILOUT_CHECK(Local<v8::Object>());
(...skipping 22 matching lines...) Expand all
1964 return Utils::ToLocal(result); 1964 return Utils::ToLocal(result);
1965 } 1965 }
1966 1966
1967 1967
1968 void Function::SetName(v8::Handle<v8::String> name) { 1968 void Function::SetName(v8::Handle<v8::String> name) {
1969 i::Handle<i::JSFunction> func = Utils::OpenHandle(this); 1969 i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
1970 func->shared()->set_name(*Utils::OpenHandle(*name)); 1970 func->shared()->set_name(*Utils::OpenHandle(*name));
1971 } 1971 }
1972 1972
1973 1973
1974 Handle<Value> Function::GetName() { 1974 Handle<Value> Function::GetName() const {
1975 i::Handle<i::JSFunction> func = Utils::OpenHandle(this); 1975 i::Handle<i::JSFunction> func = Utils::OpenHandle(this);
1976 return Utils::ToLocal(i::Handle<i::Object>(func->shared()->name())); 1976 return Utils::ToLocal(i::Handle<i::Object>(func->shared()->name()));
1977 } 1977 }
1978 1978
1979 1979
1980 int String::Length() { 1980 int String::Length() const {
1981 if (IsDeadCheck("v8::String::Length()")) return 0; 1981 if (IsDeadCheck("v8::String::Length()")) return 0;
1982 return Utils::OpenHandle(this)->length(); 1982 return Utils::OpenHandle(this)->length();
1983 } 1983 }
1984 1984
1985 1985
1986 int String::Utf8Length() { 1986 int String::Utf8Length() const {
1987 if (IsDeadCheck("v8::String::Utf8Length()")) return 0; 1987 if (IsDeadCheck("v8::String::Utf8Length()")) return 0;
1988 return Utils::OpenHandle(this)->Utf8Length(); 1988 return Utils::OpenHandle(this)->Utf8Length();
1989 } 1989 }
1990 1990
1991 1991
1992 int String::WriteUtf8(char* buffer, int capacity) { 1992 int String::WriteUtf8(char* buffer, int capacity) const {
1993 if (IsDeadCheck("v8::String::WriteUtf8()")) return 0; 1993 if (IsDeadCheck("v8::String::WriteUtf8()")) return 0;
1994 LOG_API("String::WriteUtf8"); 1994 LOG_API("String::WriteUtf8");
1995 i::Handle<i::String> str = Utils::OpenHandle(this); 1995 i::Handle<i::String> str = Utils::OpenHandle(this);
1996 write_input_buffer.Reset(0, *str); 1996 write_input_buffer.Reset(0, *str);
1997 int len = str->length(); 1997 int len = str->length();
1998 // Encode the first K - 3 bytes directly into the buffer since we 1998 // Encode the first K - 3 bytes directly into the buffer since we
1999 // know there's room for them. If no capacity is given we copy all 1999 // know there's room for them. If no capacity is given we copy all
2000 // of them here. 2000 // of them here.
2001 int fast_end = capacity - (unibrow::Utf8::kMaxEncodedSize - 1); 2001 int fast_end = capacity - (unibrow::Utf8::kMaxEncodedSize - 1);
2002 int i; 2002 int i;
(...skipping 20 matching lines...) Expand all
2023 break; 2023 break;
2024 } 2024 }
2025 } 2025 }
2026 } 2026 }
2027 if (i == len && (capacity == -1 || pos < capacity)) 2027 if (i == len && (capacity == -1 || pos < capacity))
2028 buffer[pos++] = '\0'; 2028 buffer[pos++] = '\0';
2029 return pos; 2029 return pos;
2030 } 2030 }
2031 2031
2032 2032
2033 int String::WriteAscii(char* buffer, int start, int length) { 2033 int String::WriteAscii(char* buffer, int start, int length) const {
2034 if (IsDeadCheck("v8::String::WriteAscii()")) return 0; 2034 if (IsDeadCheck("v8::String::WriteAscii()")) return 0;
2035 LOG_API("String::WriteAscii"); 2035 LOG_API("String::WriteAscii");
2036 ASSERT(start >= 0 && length >= -1); 2036 ASSERT(start >= 0 && length >= -1);
2037 i::Handle<i::String> str = Utils::OpenHandle(this); 2037 i::Handle<i::String> str = Utils::OpenHandle(this);
2038 // Flatten the string for efficiency. This applies whether we are 2038 // Flatten the string for efficiency. This applies whether we are
2039 // using StringInputBuffer or Get(i) to access the characters. 2039 // using StringInputBuffer or Get(i) to access the characters.
2040 str->TryFlatten(i::StringShape(*str)); 2040 str->TryFlatten(i::StringShape(*str));
2041 int end = length; 2041 int end = length;
2042 if ( (length == -1) || (length > str->length() - start) ) 2042 if ( (length == -1) || (length > str->length() - start) )
2043 end = str->length() - start; 2043 end = str->length() - start;
2044 if (end < 0) return 0; 2044 if (end < 0) return 0;
2045 write_input_buffer.Reset(start, *str); 2045 write_input_buffer.Reset(start, *str);
2046 int i; 2046 int i;
2047 for (i = 0; i < end; i++) { 2047 for (i = 0; i < end; i++) {
2048 char c = static_cast<char>(write_input_buffer.GetNext()); 2048 char c = static_cast<char>(write_input_buffer.GetNext());
2049 if (c == '\0') c = ' '; 2049 if (c == '\0') c = ' ';
2050 buffer[i] = c; 2050 buffer[i] = c;
2051 } 2051 }
2052 if (length == -1 || i < length) 2052 if (length == -1 || i < length)
2053 buffer[i] = '\0'; 2053 buffer[i] = '\0';
2054 return i; 2054 return i;
2055 } 2055 }
2056 2056
2057 2057
2058 int String::Write(uint16_t* buffer, int start, int length) { 2058 int String::Write(uint16_t* buffer, int start, int length) const {
2059 if (IsDeadCheck("v8::String::Write()")) return 0; 2059 if (IsDeadCheck("v8::String::Write()")) return 0;
2060 LOG_API("String::Write"); 2060 LOG_API("String::Write");
2061 ASSERT(start >= 0 && length >= -1); 2061 ASSERT(start >= 0 && length >= -1);
2062 i::Handle<i::String> str = Utils::OpenHandle(this); 2062 i::Handle<i::String> str = Utils::OpenHandle(this);
2063 // Flatten the string for efficiency. This applies whether we are 2063 // Flatten the string for efficiency. This applies whether we are
2064 // using StringInputBuffer or Get(i) to access the characters. 2064 // using StringInputBuffer or Get(i) to access the characters.
2065 str->TryFlatten(i::StringShape(*str)); 2065 str->TryFlatten(i::StringShape(*str));
2066 int end = length; 2066 int end = length;
2067 if ( (length == -1) || (length > str->length() - start) ) 2067 if ( (length == -1) || (length > str->length() - start) )
2068 end = str->length() - start; 2068 end = str->length() - start;
2069 if (end < 0) return 0; 2069 if (end < 0) return 0;
2070 write_input_buffer.Reset(start, *str); 2070 write_input_buffer.Reset(start, *str);
2071 int i; 2071 int i;
2072 for (i = 0; i < end; i++) 2072 for (i = 0; i < end; i++)
2073 buffer[i] = write_input_buffer.GetNext(); 2073 buffer[i] = write_input_buffer.GetNext();
2074 if (length == -1 || i < length) 2074 if (length == -1 || i < length)
2075 buffer[i] = '\0'; 2075 buffer[i] = '\0';
2076 return i; 2076 return i;
2077 } 2077 }
2078 2078
2079 2079
2080 bool v8::String::IsExternal() { 2080 bool v8::String::IsExternal() const {
2081 EnsureInitialized("v8::String::IsExternal()"); 2081 EnsureInitialized("v8::String::IsExternal()");
2082 i::Handle<i::String> str = Utils::OpenHandle(this); 2082 i::Handle<i::String> str = Utils::OpenHandle(this);
2083 i::StringShape shape(*str); 2083 i::StringShape shape(*str);
2084 return shape.IsExternalTwoByte(); 2084 return shape.IsExternalTwoByte();
2085 } 2085 }
2086 2086
2087 2087
2088 bool v8::String::IsExternalAscii() { 2088 bool v8::String::IsExternalAscii() const {
2089 EnsureInitialized("v8::String::IsExternalAscii()"); 2089 EnsureInitialized("v8::String::IsExternalAscii()");
2090 i::Handle<i::String> str = Utils::OpenHandle(this); 2090 i::Handle<i::String> str = Utils::OpenHandle(this);
2091 i::StringShape shape(*str); 2091 i::StringShape shape(*str);
2092 return shape.IsExternalAscii(); 2092 return shape.IsExternalAscii();
2093 } 2093 }
2094 2094
2095 2095
2096 v8::String::ExternalStringResource* v8::String::GetExternalStringResource() { 2096 v8::String::ExternalStringResource*
2097 v8::String::GetExternalStringResource() const {
2097 EnsureInitialized("v8::String::GetExternalStringResource()"); 2098 EnsureInitialized("v8::String::GetExternalStringResource()");
2098 i::Handle<i::String> str = Utils::OpenHandle(this); 2099 i::Handle<i::String> str = Utils::OpenHandle(this);
2099 ASSERT(str->IsExternalTwoByteString()); 2100 ASSERT(str->IsExternalTwoByteString());
2100 void* resource = i::Handle<i::ExternalTwoByteString>::cast(str)->resource(); 2101 void* resource = i::Handle<i::ExternalTwoByteString>::cast(str)->resource();
2101 return reinterpret_cast<ExternalStringResource*>(resource); 2102 return reinterpret_cast<ExternalStringResource*>(resource);
2102 } 2103 }
2103 2104
2104 2105
2105 v8::String::ExternalAsciiStringResource* 2106 v8::String::ExternalAsciiStringResource*
2106 v8::String::GetExternalAsciiStringResource() { 2107 v8::String::GetExternalAsciiStringResource() const {
2107 EnsureInitialized("v8::String::GetExternalAsciiStringResource()"); 2108 EnsureInitialized("v8::String::GetExternalAsciiStringResource()");
2108 i::Handle<i::String> str = Utils::OpenHandle(this); 2109 i::Handle<i::String> str = Utils::OpenHandle(this);
2109 ASSERT(str->IsExternalAsciiString()); 2110 ASSERT(str->IsExternalAsciiString());
2110 void* resource = i::Handle<i::ExternalAsciiString>::cast(str)->resource(); 2111 void* resource = i::Handle<i::ExternalAsciiString>::cast(str)->resource();
2111 return reinterpret_cast<ExternalAsciiStringResource*>(resource); 2112 return reinterpret_cast<ExternalAsciiStringResource*>(resource);
2112 } 2113 }
2113 2114
2114 2115
2115 double Number::Value() { 2116 double Number::Value() const {
2116 if (IsDeadCheck("v8::Number::Value()")) return 0; 2117 if (IsDeadCheck("v8::Number::Value()")) return 0;
2117 i::Handle<i::Object> obj = Utils::OpenHandle(this); 2118 i::Handle<i::Object> obj = Utils::OpenHandle(this);
2118 return obj->Number(); 2119 return obj->Number();
2119 } 2120 }
2120 2121
2121 2122
2122 bool Boolean::Value() { 2123 bool Boolean::Value() const {
2123 if (IsDeadCheck("v8::Boolean::Value()")) return false; 2124 if (IsDeadCheck("v8::Boolean::Value()")) return false;
2124 i::Handle<i::Object> obj = Utils::OpenHandle(this); 2125 i::Handle<i::Object> obj = Utils::OpenHandle(this);
2125 return obj->IsTrue(); 2126 return obj->IsTrue();
2126 } 2127 }
2127 2128
2128 2129
2129 int64_t Integer::Value() { 2130 int64_t Integer::Value() const {
2130 if (IsDeadCheck("v8::Integer::Value()")) return 0; 2131 if (IsDeadCheck("v8::Integer::Value()")) return 0;
2131 i::Handle<i::Object> obj = Utils::OpenHandle(this); 2132 i::Handle<i::Object> obj = Utils::OpenHandle(this);
2132 if (obj->IsSmi()) { 2133 if (obj->IsSmi()) {
2133 return i::Smi::cast(*obj)->value(); 2134 return i::Smi::cast(*obj)->value();
2134 } else { 2135 } else {
2135 return static_cast<int64_t>(obj->Number()); 2136 return static_cast<int64_t>(obj->Number());
2136 } 2137 }
2137 } 2138 }
2138 2139
2139 2140
2140 int32_t Int32::Value() { 2141 int32_t Int32::Value() const {
2141 if (IsDeadCheck("v8::Int32::Value()")) return 0; 2142 if (IsDeadCheck("v8::Int32::Value()")) return 0;
2142 i::Handle<i::Object> obj = Utils::OpenHandle(this); 2143 i::Handle<i::Object> obj = Utils::OpenHandle(this);
2143 if (obj->IsSmi()) { 2144 if (obj->IsSmi()) {
2144 return i::Smi::cast(*obj)->value(); 2145 return i::Smi::cast(*obj)->value();
2145 } else { 2146 } else {
2146 return static_cast<int32_t>(obj->Number()); 2147 return static_cast<int32_t>(obj->Number());
2147 } 2148 }
2148 } 2149 }
2149 2150
2150 2151
2151 void* External::Value() { 2152 void* External::Value() const {
2152 if (IsDeadCheck("v8::External::Value()")) return 0; 2153 if (IsDeadCheck("v8::External::Value()")) return 0;
2153 i::Handle<i::Object> obj = Utils::OpenHandle(this); 2154 i::Handle<i::Object> obj = Utils::OpenHandle(this);
2154 return reinterpret_cast<void*>(i::Proxy::cast(*obj)->proxy()); 2155 return reinterpret_cast<void*>(i::Proxy::cast(*obj)->proxy());
2155 } 2156 }
2156 2157
2157 2158
2158 int v8::Object::InternalFieldCount() { 2159 int v8::Object::InternalFieldCount() {
2159 if (IsDeadCheck("v8::Object::InternalFieldCount()")) return 0; 2160 if (IsDeadCheck("v8::Object::InternalFieldCount()")) return 0;
2160 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); 2161 i::Handle<i::JSObject> obj = Utils::OpenHandle(this);
2161 return obj->GetInternalFieldCount(); 2162 return obj->GetInternalFieldCount();
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after
2522 EnsureInitialized("v8::Date::New()"); 2523 EnsureInitialized("v8::Date::New()");
2523 LOG_API("Date::New"); 2524 LOG_API("Date::New");
2524 EXCEPTION_PREAMBLE(); 2525 EXCEPTION_PREAMBLE();
2525 i::Handle<i::Object> obj = 2526 i::Handle<i::Object> obj =
2526 i::Execution::NewDate(time, &has_pending_exception); 2527 i::Execution::NewDate(time, &has_pending_exception);
2527 EXCEPTION_BAILOUT_CHECK(Local<v8::Value>()); 2528 EXCEPTION_BAILOUT_CHECK(Local<v8::Value>());
2528 return Utils::ToLocal(obj); 2529 return Utils::ToLocal(obj);
2529 } 2530 }
2530 2531
2531 2532
2532 double v8::Date::NumberValue() { 2533 double v8::Date::NumberValue() const {
2533 if (IsDeadCheck("v8::Date::NumberValue()")) return 0; 2534 if (IsDeadCheck("v8::Date::NumberValue()")) return 0;
2534 LOG_API("Date::NumberValue"); 2535 LOG_API("Date::NumberValue");
2535 i::Handle<i::Object> obj = Utils::OpenHandle(this); 2536 i::Handle<i::Object> obj = Utils::OpenHandle(this);
2536 i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); 2537 i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj);
2537 return jsvalue->value()->Number(); 2538 return jsvalue->value()->Number();
2538 } 2539 }
2539 2540
2540 2541
2541 Local<v8::Array> v8::Array::New(int length) { 2542 Local<v8::Array> v8::Array::New(int length) {
2542 EnsureInitialized("v8::Array::New()"); 2543 EnsureInitialized("v8::Array::New()");
2543 LOG_API("Array::New"); 2544 LOG_API("Array::New");
2544 i::Handle<i::JSArray> obj = i::Factory::NewJSArray(length); 2545 i::Handle<i::JSArray> obj = i::Factory::NewJSArray(length);
2545 return Utils::ToLocal(obj); 2546 return Utils::ToLocal(obj);
2546 } 2547 }
2547 2548
2548 2549
2549 uint32_t v8::Array::Length() { 2550 uint32_t v8::Array::Length() const {
2550 if (IsDeadCheck("v8::Array::Length()")) return 0; 2551 if (IsDeadCheck("v8::Array::Length()")) return 0;
2551 i::Handle<i::JSArray> obj = Utils::OpenHandle(this); 2552 i::Handle<i::JSArray> obj = Utils::OpenHandle(this);
2552 i::Object* length = obj->length(); 2553 i::Object* length = obj->length();
2553 if (length->IsSmi()) { 2554 if (length->IsSmi()) {
2554 return i::Smi::cast(length)->value(); 2555 return i::Smi::cast(length)->value();
2555 } else { 2556 } else {
2556 return static_cast<uint32_t>(length->Number()); 2557 return static_cast<uint32_t>(length->Number());
2557 } 2558 }
2558 } 2559 }
2559 2560
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after
3010 reinterpret_cast<HandleScopeImplementer*>(storage); 3011 reinterpret_cast<HandleScopeImplementer*>(storage);
3011 List<void**>* blocks_of_archived_thread = thread_local->Blocks(); 3012 List<void**>* blocks_of_archived_thread = thread_local->Blocks();
3012 ImplementationUtilities::HandleScopeData* handle_data_of_archived_thread = 3013 ImplementationUtilities::HandleScopeData* handle_data_of_archived_thread =
3013 &thread_local->handle_scope_data_; 3014 &thread_local->handle_scope_data_;
3014 Iterate(v, blocks_of_archived_thread, handle_data_of_archived_thread); 3015 Iterate(v, blocks_of_archived_thread, handle_data_of_archived_thread);
3015 3016
3016 return storage + ArchiveSpacePerThread(); 3017 return storage + ArchiveSpacePerThread();
3017 } 3018 }
3018 3019
3019 } } // namespace v8::internal 3020 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/api.h ('k') | src/apinatives.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698