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

Side by Side Diff: src/accessors.cc

Issue 23824002: thread isolate in accessors.cc (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 3 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/accessors.h ('k') | src/objects.cc » ('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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 template <class C> 44 template <class C>
45 static C* FindInstanceOf(Isolate* isolate, Object* obj) { 45 static C* FindInstanceOf(Isolate* isolate, Object* obj) {
46 for (Object* cur = obj; !cur->IsNull(); cur = cur->GetPrototype(isolate)) { 46 for (Object* cur = obj; !cur->IsNull(); cur = cur->GetPrototype(isolate)) {
47 if (Is<C>(cur)) return C::cast(cur); 47 if (Is<C>(cur)) return C::cast(cur);
48 } 48 }
49 return NULL; 49 return NULL;
50 } 50 }
51 51
52 52
53 // Entry point that never should be called. 53 // Entry point that never should be called.
54 MaybeObject* Accessors::IllegalSetter(JSObject*, Object*, void*) { 54 MaybeObject* Accessors::IllegalSetter(Isolate* isolate,
55 JSObject*,
56 Object*,
57 void*) {
55 UNREACHABLE(); 58 UNREACHABLE();
56 return NULL; 59 return NULL;
57 } 60 }
58 61
59 62
60 Object* Accessors::IllegalGetAccessor(Object* object, void*) { 63 Object* Accessors::IllegalGetAccessor(Isolate* isolate,
64 Object* object,
65 void*) {
61 UNREACHABLE(); 66 UNREACHABLE();
62 return object; 67 return object;
63 } 68 }
64 69
65 70
66 MaybeObject* Accessors::ReadOnlySetAccessor(JSObject*, Object* value, void*) { 71 MaybeObject* Accessors::ReadOnlySetAccessor(Isolate* isolate,
72 JSObject*,
73 Object* value,
74 void*) {
67 // According to ECMA-262, section 8.6.2.2, page 28, setting 75 // According to ECMA-262, section 8.6.2.2, page 28, setting
68 // read-only properties must be silently ignored. 76 // read-only properties must be silently ignored.
69 return value; 77 return value;
70 } 78 }
71 79
72 80
73 // 81 //
74 // Accessors::ArrayLength 82 // Accessors::ArrayLength
75 // 83 //
76 84
77 85
78 MaybeObject* Accessors::ArrayGetLength(Object* object, void*) { 86 MaybeObject* Accessors::ArrayGetLength(Isolate* isolate,
87 Object* object,
88 void*) {
79 // Traverse the prototype chain until we reach an array. 89 // Traverse the prototype chain until we reach an array.
80 JSArray* holder = FindInstanceOf<JSArray>(Isolate::Current(), object); 90 JSArray* holder = FindInstanceOf<JSArray>(isolate, object);
81 return holder == NULL ? Smi::FromInt(0) : holder->length(); 91 return holder == NULL ? Smi::FromInt(0) : holder->length();
82 } 92 }
83 93
84 94
85 // The helper function will 'flatten' Number objects. 95 // The helper function will 'flatten' Number objects.
86 Object* Accessors::FlattenNumber(Object* value) { 96 Object* Accessors::FlattenNumber(Isolate* isolate, Object* value) {
87 if (value->IsNumber() || !value->IsJSValue()) return value; 97 if (value->IsNumber() || !value->IsJSValue()) return value;
88 JSValue* wrapper = JSValue::cast(value); 98 JSValue* wrapper = JSValue::cast(value);
89 ASSERT(Isolate::Current()->context()->native_context()->number_function()-> 99 ASSERT(wrapper->GetIsolate()->context()->native_context()->number_function()->
90 has_initial_map()); 100 has_initial_map());
91 Map* number_map = Isolate::Current()->context()->native_context()-> 101 Map* number_map = isolate->context()->native_context()->
92 number_function()->initial_map(); 102 number_function()->initial_map();
93 if (wrapper->map() == number_map) return wrapper->value(); 103 if (wrapper->map() == number_map) return wrapper->value();
94 return value; 104 return value;
95 } 105 }
96 106
97 107
98 MaybeObject* Accessors::ArraySetLength(JSObject* object, Object* value, void*) { 108 MaybeObject* Accessors::ArraySetLength(Isolate* isolate,
99 Isolate* isolate = object->GetIsolate(); 109 JSObject* object,
100 110 Object* value,
111 void*) {
101 // This means one of the object's prototypes is a JSArray and the 112 // This means one of the object's prototypes is a JSArray and the
102 // object does not have a 'length' property. Calling SetProperty 113 // object does not have a 'length' property. Calling SetProperty
103 // causes an infinite loop. 114 // causes an infinite loop.
104 if (!object->IsJSArray()) { 115 if (!object->IsJSArray()) {
105 return object->SetLocalPropertyIgnoreAttributes( 116 return object->SetLocalPropertyIgnoreAttributes(
106 isolate->heap()->length_string(), value, NONE); 117 isolate->heap()->length_string(), value, NONE);
107 } 118 }
108 119
109 value = FlattenNumber(value); 120 value = FlattenNumber(isolate, value);
110 121
111 // Need to call methods that may trigger GC. 122 // Need to call methods that may trigger GC.
112 HandleScope scope(isolate); 123 HandleScope scope(isolate);
113 124
114 // Protect raw pointers. 125 // Protect raw pointers.
115 Handle<JSArray> array_handle(JSArray::cast(object), isolate); 126 Handle<JSArray> array_handle(JSArray::cast(object), isolate);
116 Handle<Object> value_handle(value, isolate); 127 Handle<Object> value_handle(value, isolate);
117 128
118 bool has_exception; 129 bool has_exception;
119 Handle<Object> uint32_v = Execution::ToUint32(value_handle, &has_exception); 130 Handle<Object> uint32_v = Execution::ToUint32(value_handle, &has_exception);
(...skipping 15 matching lines...) Expand all
135 ArraySetLength, 146 ArraySetLength,
136 0 147 0
137 }; 148 };
138 149
139 150
140 // 151 //
141 // Accessors::StringLength 152 // Accessors::StringLength
142 // 153 //
143 154
144 155
145 MaybeObject* Accessors::StringGetLength(Object* object, void*) { 156 MaybeObject* Accessors::StringGetLength(Isolate* isolate,
157 Object* object,
158 void*) {
146 Object* value = object; 159 Object* value = object;
147 if (object->IsJSValue()) value = JSValue::cast(object)->value(); 160 if (object->IsJSValue()) value = JSValue::cast(object)->value();
148 if (value->IsString()) return Smi::FromInt(String::cast(value)->length()); 161 if (value->IsString()) return Smi::FromInt(String::cast(value)->length());
149 // If object is not a string we return 0 to be compatible with WebKit. 162 // If object is not a string we return 0 to be compatible with WebKit.
150 // Note: Firefox returns the length of ToString(object). 163 // Note: Firefox returns the length of ToString(object).
151 return Smi::FromInt(0); 164 return Smi::FromInt(0);
152 } 165 }
153 166
154 167
155 const AccessorDescriptor Accessors::StringLength = { 168 const AccessorDescriptor Accessors::StringLength = {
156 StringGetLength, 169 StringGetLength,
157 IllegalSetter, 170 IllegalSetter,
158 0 171 0
159 }; 172 };
160 173
161 174
162 // 175 //
163 // Accessors::ScriptSource 176 // Accessors::ScriptSource
164 // 177 //
165 178
166 179
167 MaybeObject* Accessors::ScriptGetSource(Object* object, void*) { 180 MaybeObject* Accessors::ScriptGetSource(Isolate* isolate,
181 Object* object,
182 void*) {
168 Object* script = JSValue::cast(object)->value(); 183 Object* script = JSValue::cast(object)->value();
169 return Script::cast(script)->source(); 184 return Script::cast(script)->source();
170 } 185 }
171 186
172 187
173 const AccessorDescriptor Accessors::ScriptSource = { 188 const AccessorDescriptor Accessors::ScriptSource = {
174 ScriptGetSource, 189 ScriptGetSource,
175 IllegalSetter, 190 IllegalSetter,
176 0 191 0
177 }; 192 };
178 193
179 194
180 // 195 //
181 // Accessors::ScriptName 196 // Accessors::ScriptName
182 // 197 //
183 198
184 199
185 MaybeObject* Accessors::ScriptGetName(Object* object, void*) { 200 MaybeObject* Accessors::ScriptGetName(Isolate* isolate,
201 Object* object,
202 void*) {
186 Object* script = JSValue::cast(object)->value(); 203 Object* script = JSValue::cast(object)->value();
187 return Script::cast(script)->name(); 204 return Script::cast(script)->name();
188 } 205 }
189 206
190 207
191 const AccessorDescriptor Accessors::ScriptName = { 208 const AccessorDescriptor Accessors::ScriptName = {
192 ScriptGetName, 209 ScriptGetName,
193 IllegalSetter, 210 IllegalSetter,
194 0 211 0
195 }; 212 };
196 213
197 214
198 // 215 //
199 // Accessors::ScriptId 216 // Accessors::ScriptId
200 // 217 //
201 218
202 219
203 MaybeObject* Accessors::ScriptGetId(Object* object, void*) { 220 MaybeObject* Accessors::ScriptGetId(Isolate* isolate, Object* object, void*) {
204 Object* script = JSValue::cast(object)->value(); 221 Object* script = JSValue::cast(object)->value();
205 return Script::cast(script)->id(); 222 return Script::cast(script)->id();
206 } 223 }
207 224
208 225
209 const AccessorDescriptor Accessors::ScriptId = { 226 const AccessorDescriptor Accessors::ScriptId = {
210 ScriptGetId, 227 ScriptGetId,
211 IllegalSetter, 228 IllegalSetter,
212 0 229 0
213 }; 230 };
214 231
215 232
216 // 233 //
217 // Accessors::ScriptLineOffset 234 // Accessors::ScriptLineOffset
218 // 235 //
219 236
220 237
221 MaybeObject* Accessors::ScriptGetLineOffset(Object* object, void*) { 238 MaybeObject* Accessors::ScriptGetLineOffset(Isolate* isolate,
239 Object* object,
240 void*) {
222 Object* script = JSValue::cast(object)->value(); 241 Object* script = JSValue::cast(object)->value();
223 return Script::cast(script)->line_offset(); 242 return Script::cast(script)->line_offset();
224 } 243 }
225 244
226 245
227 const AccessorDescriptor Accessors::ScriptLineOffset = { 246 const AccessorDescriptor Accessors::ScriptLineOffset = {
228 ScriptGetLineOffset, 247 ScriptGetLineOffset,
229 IllegalSetter, 248 IllegalSetter,
230 0 249 0
231 }; 250 };
232 251
233 252
234 // 253 //
235 // Accessors::ScriptColumnOffset 254 // Accessors::ScriptColumnOffset
236 // 255 //
237 256
238 257
239 MaybeObject* Accessors::ScriptGetColumnOffset(Object* object, void*) { 258 MaybeObject* Accessors::ScriptGetColumnOffset(Isolate* isolate,
259 Object* object,
260 void*) {
240 Object* script = JSValue::cast(object)->value(); 261 Object* script = JSValue::cast(object)->value();
241 return Script::cast(script)->column_offset(); 262 return Script::cast(script)->column_offset();
242 } 263 }
243 264
244 265
245 const AccessorDescriptor Accessors::ScriptColumnOffset = { 266 const AccessorDescriptor Accessors::ScriptColumnOffset = {
246 ScriptGetColumnOffset, 267 ScriptGetColumnOffset,
247 IllegalSetter, 268 IllegalSetter,
248 0 269 0
249 }; 270 };
250 271
251 272
252 // 273 //
253 // Accessors::ScriptData 274 // Accessors::ScriptData
254 // 275 //
255 276
256 277
257 MaybeObject* Accessors::ScriptGetData(Object* object, void*) { 278 MaybeObject* Accessors::ScriptGetData(Isolate* isolate,
279 Object* object,
280 void*) {
258 Object* script = JSValue::cast(object)->value(); 281 Object* script = JSValue::cast(object)->value();
259 return Script::cast(script)->data(); 282 return Script::cast(script)->data();
260 } 283 }
261 284
262 285
263 const AccessorDescriptor Accessors::ScriptData = { 286 const AccessorDescriptor Accessors::ScriptData = {
264 ScriptGetData, 287 ScriptGetData,
265 IllegalSetter, 288 IllegalSetter,
266 0 289 0
267 }; 290 };
268 291
269 292
270 // 293 //
271 // Accessors::ScriptType 294 // Accessors::ScriptType
272 // 295 //
273 296
274 297
275 MaybeObject* Accessors::ScriptGetType(Object* object, void*) { 298 MaybeObject* Accessors::ScriptGetType(Isolate* isolate,
299 Object* object,
300 void*) {
276 Object* script = JSValue::cast(object)->value(); 301 Object* script = JSValue::cast(object)->value();
277 return Script::cast(script)->type(); 302 return Script::cast(script)->type();
278 } 303 }
279 304
280 305
281 const AccessorDescriptor Accessors::ScriptType = { 306 const AccessorDescriptor Accessors::ScriptType = {
282 ScriptGetType, 307 ScriptGetType,
283 IllegalSetter, 308 IllegalSetter,
284 0 309 0
285 }; 310 };
286 311
287 312
288 // 313 //
289 // Accessors::ScriptCompilationType 314 // Accessors::ScriptCompilationType
290 // 315 //
291 316
292 317
293 MaybeObject* Accessors::ScriptGetCompilationType(Object* object, void*) { 318 MaybeObject* Accessors::ScriptGetCompilationType(Isolate* isolate,
319 Object* object,
320 void*) {
294 Object* script = JSValue::cast(object)->value(); 321 Object* script = JSValue::cast(object)->value();
295 return Smi::FromInt(Script::cast(script)->compilation_type()); 322 return Smi::FromInt(Script::cast(script)->compilation_type());
296 } 323 }
297 324
298 325
299 const AccessorDescriptor Accessors::ScriptCompilationType = { 326 const AccessorDescriptor Accessors::ScriptCompilationType = {
300 ScriptGetCompilationType, 327 ScriptGetCompilationType,
301 IllegalSetter, 328 IllegalSetter,
302 0 329 0
303 }; 330 };
304 331
305 332
306 // 333 //
307 // Accessors::ScriptGetLineEnds 334 // Accessors::ScriptGetLineEnds
308 // 335 //
309 336
310 337
311 MaybeObject* Accessors::ScriptGetLineEnds(Object* object, void*) { 338 MaybeObject* Accessors::ScriptGetLineEnds(Isolate* isolate,
339 Object* object,
340 void*) {
312 JSValue* wrapper = JSValue::cast(object); 341 JSValue* wrapper = JSValue::cast(object);
313 Isolate* isolate = wrapper->GetIsolate();
314 HandleScope scope(isolate); 342 HandleScope scope(isolate);
315 Handle<Script> script(Script::cast(wrapper->value()), isolate); 343 Handle<Script> script(Script::cast(wrapper->value()), isolate);
316 InitScriptLineEnds(script); 344 InitScriptLineEnds(script);
317 ASSERT(script->line_ends()->IsFixedArray()); 345 ASSERT(script->line_ends()->IsFixedArray());
318 Handle<FixedArray> line_ends(FixedArray::cast(script->line_ends())); 346 Handle<FixedArray> line_ends(FixedArray::cast(script->line_ends()));
319 // We do not want anyone to modify this array from JS. 347 // We do not want anyone to modify this array from JS.
320 ASSERT(*line_ends == isolate->heap()->empty_fixed_array() || 348 ASSERT(*line_ends == isolate->heap()->empty_fixed_array() ||
321 line_ends->map() == isolate->heap()->fixed_cow_array_map()); 349 line_ends->map() == isolate->heap()->fixed_cow_array_map());
322 Handle<JSArray> js_array = 350 Handle<JSArray> js_array =
323 isolate->factory()->NewJSArrayWithElements(line_ends); 351 isolate->factory()->NewJSArrayWithElements(line_ends);
324 return *js_array; 352 return *js_array;
325 } 353 }
326 354
327 355
328 const AccessorDescriptor Accessors::ScriptLineEnds = { 356 const AccessorDescriptor Accessors::ScriptLineEnds = {
329 ScriptGetLineEnds, 357 ScriptGetLineEnds,
330 IllegalSetter, 358 IllegalSetter,
331 0 359 0
332 }; 360 };
333 361
334 362
335 // 363 //
336 // Accessors::ScriptGetContextData 364 // Accessors::ScriptGetContextData
337 // 365 //
338 366
339 367
340 MaybeObject* Accessors::ScriptGetContextData(Object* object, void*) { 368 MaybeObject* Accessors::ScriptGetContextData(Isolate* isolate,
369 Object* object,
370 void*) {
341 Object* script = JSValue::cast(object)->value(); 371 Object* script = JSValue::cast(object)->value();
342 return Script::cast(script)->context_data(); 372 return Script::cast(script)->context_data();
343 } 373 }
344 374
345 375
346 const AccessorDescriptor Accessors::ScriptContextData = { 376 const AccessorDescriptor Accessors::ScriptContextData = {
347 ScriptGetContextData, 377 ScriptGetContextData,
348 IllegalSetter, 378 IllegalSetter,
349 0 379 0
350 }; 380 };
351 381
352 382
353 // 383 //
354 // Accessors::ScriptGetEvalFromScript 384 // Accessors::ScriptGetEvalFromScript
355 // 385 //
356 386
357 387
358 MaybeObject* Accessors::ScriptGetEvalFromScript(Object* object, void*) { 388 MaybeObject* Accessors::ScriptGetEvalFromScript(Isolate* isolate,
389 Object* object,
390 void*) {
359 Object* script = JSValue::cast(object)->value(); 391 Object* script = JSValue::cast(object)->value();
360 if (!Script::cast(script)->eval_from_shared()->IsUndefined()) { 392 if (!Script::cast(script)->eval_from_shared()->IsUndefined()) {
361 Handle<SharedFunctionInfo> eval_from_shared( 393 Handle<SharedFunctionInfo> eval_from_shared(
362 SharedFunctionInfo::cast(Script::cast(script)->eval_from_shared())); 394 SharedFunctionInfo::cast(Script::cast(script)->eval_from_shared()));
363 395
364 if (eval_from_shared->script()->IsScript()) { 396 if (eval_from_shared->script()->IsScript()) {
365 Handle<Script> eval_from_script(Script::cast(eval_from_shared->script())); 397 Handle<Script> eval_from_script(Script::cast(eval_from_shared->script()));
366 return *GetScriptWrapper(eval_from_script); 398 return *GetScriptWrapper(eval_from_script);
367 } 399 }
368 } 400 }
369 return HEAP->undefined_value(); 401 return HEAP->undefined_value();
370 } 402 }
371 403
372 404
373 const AccessorDescriptor Accessors::ScriptEvalFromScript = { 405 const AccessorDescriptor Accessors::ScriptEvalFromScript = {
374 ScriptGetEvalFromScript, 406 ScriptGetEvalFromScript,
375 IllegalSetter, 407 IllegalSetter,
376 0 408 0
377 }; 409 };
378 410
379 411
380 // 412 //
381 // Accessors::ScriptGetEvalFromScriptPosition 413 // Accessors::ScriptGetEvalFromScriptPosition
382 // 414 //
383 415
384 416
385 MaybeObject* Accessors::ScriptGetEvalFromScriptPosition(Object* object, void*) { 417 MaybeObject* Accessors::ScriptGetEvalFromScriptPosition(Isolate* isolate,
418 Object* object,
419 void*) {
386 Script* raw_script = Script::cast(JSValue::cast(object)->value()); 420 Script* raw_script = Script::cast(JSValue::cast(object)->value());
387 HandleScope scope(raw_script->GetIsolate()); 421 HandleScope scope(isolate);
388 Handle<Script> script(raw_script); 422 Handle<Script> script(raw_script);
389 423
390 // If this is not a script compiled through eval there is no eval position. 424 // If this is not a script compiled through eval there is no eval position.
391 if (script->compilation_type() != Script::COMPILATION_TYPE_EVAL) { 425 if (script->compilation_type() != Script::COMPILATION_TYPE_EVAL) {
392 return script->GetHeap()->undefined_value(); 426 return script->GetHeap()->undefined_value();
393 } 427 }
394 428
395 // Get the function from where eval was called and find the source position 429 // Get the function from where eval was called and find the source position
396 // from the instruction offset. 430 // from the instruction offset.
397 Handle<Code> code(SharedFunctionInfo::cast( 431 Handle<Code> code(SharedFunctionInfo::cast(
398 script->eval_from_shared())->code()); 432 script->eval_from_shared())->code());
399 return Smi::FromInt(code->SourcePosition(code->instruction_start() + 433 return Smi::FromInt(code->SourcePosition(code->instruction_start() +
400 script->eval_from_instructions_offset()->value())); 434 script->eval_from_instructions_offset()->value()));
401 } 435 }
402 436
403 437
404 const AccessorDescriptor Accessors::ScriptEvalFromScriptPosition = { 438 const AccessorDescriptor Accessors::ScriptEvalFromScriptPosition = {
405 ScriptGetEvalFromScriptPosition, 439 ScriptGetEvalFromScriptPosition,
406 IllegalSetter, 440 IllegalSetter,
407 0 441 0
408 }; 442 };
409 443
410 444
411 // 445 //
412 // Accessors::ScriptGetEvalFromFunctionName 446 // Accessors::ScriptGetEvalFromFunctionName
413 // 447 //
414 448
415 449
416 MaybeObject* Accessors::ScriptGetEvalFromFunctionName(Object* object, void*) { 450 MaybeObject* Accessors::ScriptGetEvalFromFunctionName(Isolate* isolate,
451 Object* object,
452 void*) {
417 Object* script = JSValue::cast(object)->value(); 453 Object* script = JSValue::cast(object)->value();
418 Handle<SharedFunctionInfo> shared(SharedFunctionInfo::cast( 454 Handle<SharedFunctionInfo> shared(SharedFunctionInfo::cast(
419 Script::cast(script)->eval_from_shared())); 455 Script::cast(script)->eval_from_shared()));
420 456
421 457
422 // Find the name of the function calling eval. 458 // Find the name of the function calling eval.
423 if (!shared->name()->IsUndefined()) { 459 if (!shared->name()->IsUndefined()) {
424 return shared->name(); 460 return shared->name();
425 } else { 461 } else {
426 return shared->inferred_name(); 462 return shared->inferred_name();
427 } 463 }
428 } 464 }
429 465
430 466
431 const AccessorDescriptor Accessors::ScriptEvalFromFunctionName = { 467 const AccessorDescriptor Accessors::ScriptEvalFromFunctionName = {
432 ScriptGetEvalFromFunctionName, 468 ScriptGetEvalFromFunctionName,
433 IllegalSetter, 469 IllegalSetter,
434 0 470 0
435 }; 471 };
436 472
437 473
438 // 474 //
439 // Accessors::FunctionPrototype 475 // Accessors::FunctionPrototype
440 // 476 //
441 477
442 478
443 Handle<Object> Accessors::FunctionGetPrototype(Handle<JSFunction> function) { 479 Handle<Object> Accessors::FunctionGetPrototype(Handle<JSFunction> function) {
444 CALL_HEAP_FUNCTION(function->GetIsolate(), 480 CALL_HEAP_FUNCTION(function->GetIsolate(),
445 Accessors::FunctionGetPrototype(*function, NULL), 481 Accessors::FunctionGetPrototype(function->GetIsolate(),
482 *function,
483 NULL),
446 Object); 484 Object);
447 } 485 }
448 486
449 487
450 Handle<Object> Accessors::FunctionSetPrototype(Handle<JSFunction> function, 488 Handle<Object> Accessors::FunctionSetPrototype(Handle<JSFunction> function,
451 Handle<Object> prototype) { 489 Handle<Object> prototype) {
452 ASSERT(function->should_have_prototype()); 490 ASSERT(function->should_have_prototype());
453 CALL_HEAP_FUNCTION(function->GetIsolate(), 491 CALL_HEAP_FUNCTION(function->GetIsolate(),
454 Accessors::FunctionSetPrototype(*function, 492 Accessors::FunctionSetPrototype(function->GetIsolate(),
493 *function,
455 *prototype, 494 *prototype,
456 NULL), 495 NULL),
457 Object); 496 Object);
458 } 497 }
459 498
460 499
461 MaybeObject* Accessors::FunctionGetPrototype(Object* object, void*) { 500 MaybeObject* Accessors::FunctionGetPrototype(Isolate* isolate,
462 Isolate* isolate = Isolate::Current(); 501 Object* object,
502 void*) {
463 JSFunction* function_raw = FindInstanceOf<JSFunction>(isolate, object); 503 JSFunction* function_raw = FindInstanceOf<JSFunction>(isolate, object);
464 if (function_raw == NULL) return isolate->heap()->undefined_value(); 504 if (function_raw == NULL) return isolate->heap()->undefined_value();
465 while (!function_raw->should_have_prototype()) { 505 while (!function_raw->should_have_prototype()) {
466 function_raw = FindInstanceOf<JSFunction>(isolate, 506 function_raw = FindInstanceOf<JSFunction>(isolate,
467 function_raw->GetPrototype()); 507 function_raw->GetPrototype());
468 // There has to be one because we hit the getter. 508 // There has to be one because we hit the getter.
469 ASSERT(function_raw != NULL); 509 ASSERT(function_raw != NULL);
470 } 510 }
471 511
472 if (!function_raw->has_prototype()) { 512 if (!function_raw->has_prototype()) {
473 HandleScope scope(isolate); 513 HandleScope scope(isolate);
474 Handle<JSFunction> function(function_raw); 514 Handle<JSFunction> function(function_raw);
475 Handle<Object> proto = isolate->factory()->NewFunctionPrototype(function); 515 Handle<Object> proto = isolate->factory()->NewFunctionPrototype(function);
476 JSFunction::SetPrototype(function, proto); 516 JSFunction::SetPrototype(function, proto);
477 function_raw = *function; 517 function_raw = *function;
478 } 518 }
479 return function_raw->prototype(); 519 return function_raw->prototype();
480 } 520 }
481 521
482 522
483 MaybeObject* Accessors::FunctionSetPrototype(JSObject* object, 523 MaybeObject* Accessors::FunctionSetPrototype(Isolate* isolate,
524 JSObject* object,
484 Object* value_raw, 525 Object* value_raw,
485 void*) { 526 void*) {
486 Isolate* isolate = object->GetIsolate();
487 Heap* heap = isolate->heap(); 527 Heap* heap = isolate->heap();
488 JSFunction* function_raw = FindInstanceOf<JSFunction>(isolate, object); 528 JSFunction* function_raw = FindInstanceOf<JSFunction>(isolate, object);
489 if (function_raw == NULL) return heap->undefined_value(); 529 if (function_raw == NULL) return heap->undefined_value();
490 if (!function_raw->should_have_prototype()) { 530 if (!function_raw->should_have_prototype()) {
491 // Since we hit this accessor, object will have no prototype property. 531 // Since we hit this accessor, object will have no prototype property.
492 return object->SetLocalPropertyIgnoreAttributes(heap->prototype_string(), 532 return object->SetLocalPropertyIgnoreAttributes(heap->prototype_string(),
493 value_raw, 533 value_raw,
494 NONE); 534 NONE);
495 } 535 }
496 536
(...skipping 30 matching lines...) Expand all
527 FunctionSetPrototype, 567 FunctionSetPrototype,
528 0 568 0
529 }; 569 };
530 570
531 571
532 // 572 //
533 // Accessors::FunctionLength 573 // Accessors::FunctionLength
534 // 574 //
535 575
536 576
537 MaybeObject* Accessors::FunctionGetLength(Object* object, void*) { 577 MaybeObject* Accessors::FunctionGetLength(Isolate* isolate,
538 Isolate* isolate = Isolate::Current(); 578 Object* object,
579 void*) {
539 JSFunction* function = FindInstanceOf<JSFunction>(isolate, object); 580 JSFunction* function = FindInstanceOf<JSFunction>(isolate, object);
540 if (function == NULL) return Smi::FromInt(0); 581 if (function == NULL) return Smi::FromInt(0);
541 // Check if already compiled. 582 // Check if already compiled.
542 if (function->shared()->is_compiled()) { 583 if (function->shared()->is_compiled()) {
543 return Smi::FromInt(function->shared()->length()); 584 return Smi::FromInt(function->shared()->length());
544 } 585 }
545 // If the function isn't compiled yet, the length is not computed correctly 586 // If the function isn't compiled yet, the length is not computed correctly
546 // yet. Compile it now and return the right length. 587 // yet. Compile it now and return the right length.
547 HandleScope scope(isolate); 588 HandleScope scope(isolate);
548 Handle<JSFunction> handle(function); 589 Handle<JSFunction> handle(function);
549 if (JSFunction::CompileLazy(handle, KEEP_EXCEPTION)) { 590 if (JSFunction::CompileLazy(handle, KEEP_EXCEPTION)) {
550 return Smi::FromInt(handle->shared()->length()); 591 return Smi::FromInt(handle->shared()->length());
551 } 592 }
552 return Failure::Exception(); 593 return Failure::Exception();
553 } 594 }
554 595
555 596
556 const AccessorDescriptor Accessors::FunctionLength = { 597 const AccessorDescriptor Accessors::FunctionLength = {
557 FunctionGetLength, 598 FunctionGetLength,
558 ReadOnlySetAccessor, 599 ReadOnlySetAccessor,
559 0 600 0
560 }; 601 };
561 602
562 603
563 // 604 //
564 // Accessors::FunctionName 605 // Accessors::FunctionName
565 // 606 //
566 607
567 608
568 MaybeObject* Accessors::FunctionGetName(Object* object, void*) { 609 MaybeObject* Accessors::FunctionGetName(Isolate* isolate,
569 Isolate* isolate = Isolate::Current(); 610 Object* object,
611 void*) {
570 JSFunction* holder = FindInstanceOf<JSFunction>(isolate, object); 612 JSFunction* holder = FindInstanceOf<JSFunction>(isolate, object);
571 return holder == NULL 613 return holder == NULL
572 ? isolate->heap()->undefined_value() 614 ? isolate->heap()->undefined_value()
573 : holder->shared()->name(); 615 : holder->shared()->name();
574 } 616 }
575 617
576 618
577 const AccessorDescriptor Accessors::FunctionName = { 619 const AccessorDescriptor Accessors::FunctionName = {
578 FunctionGetName, 620 FunctionGetName,
579 ReadOnlySetAccessor, 621 ReadOnlySetAccessor,
580 0 622 0
581 }; 623 };
582 624
583 625
584 // 626 //
585 // Accessors::FunctionArguments 627 // Accessors::FunctionArguments
586 // 628 //
587 629
588 630
589 Handle<Object> Accessors::FunctionGetArguments(Handle<JSFunction> function) { 631 Handle<Object> Accessors::FunctionGetArguments(Handle<JSFunction> function) {
590 CALL_HEAP_FUNCTION(function->GetIsolate(), 632 CALL_HEAP_FUNCTION(function->GetIsolate(),
591 Accessors::FunctionGetArguments(*function, NULL), 633 Accessors::FunctionGetArguments(function->GetIsolate(),
634 *function,
635 NULL),
592 Object); 636 Object);
593 } 637 }
594 638
595 639
596 static MaybeObject* ConstructArgumentsObjectForInlinedFunction( 640 static MaybeObject* ConstructArgumentsObjectForInlinedFunction(
597 JavaScriptFrame* frame, 641 JavaScriptFrame* frame,
598 Handle<JSFunction> inlined_function, 642 Handle<JSFunction> inlined_function,
599 int inlined_frame_index) { 643 int inlined_frame_index) {
600 Isolate* isolate = inlined_function->GetIsolate(); 644 Isolate* isolate = inlined_function->GetIsolate();
601 Factory* factory = isolate->factory(); 645 Factory* factory = isolate->factory();
(...skipping 11 matching lines...) Expand all
613 array->set(i, *value); 657 array->set(i, *value);
614 } 658 }
615 arguments->set_elements(*array); 659 arguments->set_elements(*array);
616 args_slots.Dispose(); 660 args_slots.Dispose();
617 661
618 // Return the freshly allocated arguments object. 662 // Return the freshly allocated arguments object.
619 return *arguments; 663 return *arguments;
620 } 664 }
621 665
622 666
623 MaybeObject* Accessors::FunctionGetArguments(Object* object, void*) { 667 MaybeObject* Accessors::FunctionGetArguments(Isolate* isolate,
624 Isolate* isolate = Isolate::Current(); 668 Object* object,
669 void*) {
625 HandleScope scope(isolate); 670 HandleScope scope(isolate);
626 JSFunction* holder = FindInstanceOf<JSFunction>(isolate, object); 671 JSFunction* holder = FindInstanceOf<JSFunction>(isolate, object);
627 if (holder == NULL) return isolate->heap()->undefined_value(); 672 if (holder == NULL) return isolate->heap()->undefined_value();
628 Handle<JSFunction> function(holder, isolate); 673 Handle<JSFunction> function(holder, isolate);
629 674
630 if (function->shared()->native()) return isolate->heap()->null_value(); 675 if (function->shared()->native()) return isolate->heap()->null_value();
631 // Find the top invocation of the function by traversing frames. 676 // Find the top invocation of the function by traversing frames.
632 List<JSFunction*> functions(2); 677 List<JSFunction*> functions(2);
633 for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) { 678 for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) {
634 JavaScriptFrame* frame = it.frame(); 679 JavaScriptFrame* frame = it.frame();
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
736 ASSERT(functions_.length() > 0); 781 ASSERT(functions_.length() > 0);
737 frame_iterator_.Advance(); 782 frame_iterator_.Advance();
738 index_ = functions_.length() - 1; 783 index_ = functions_.length() - 1;
739 } 784 }
740 JavaScriptFrameIterator frame_iterator_; 785 JavaScriptFrameIterator frame_iterator_;
741 List<JSFunction*> functions_; 786 List<JSFunction*> functions_;
742 int index_; 787 int index_;
743 }; 788 };
744 789
745 790
746 MaybeObject* Accessors::FunctionGetCaller(Object* object, void*) { 791 MaybeObject* Accessors::FunctionGetCaller(Isolate* isolate,
747 Isolate* isolate = Isolate::Current(); 792 Object* object,
793 void*) {
748 HandleScope scope(isolate); 794 HandleScope scope(isolate);
749 DisallowHeapAllocation no_allocation; 795 DisallowHeapAllocation no_allocation;
750 JSFunction* holder = FindInstanceOf<JSFunction>(isolate, object); 796 JSFunction* holder = FindInstanceOf<JSFunction>(isolate, object);
751 if (holder == NULL) return isolate->heap()->undefined_value(); 797 if (holder == NULL) return isolate->heap()->undefined_value();
752 if (holder->shared()->native()) return isolate->heap()->null_value(); 798 if (holder->shared()->native()) return isolate->heap()->null_value();
753 Handle<JSFunction> function(holder, isolate); 799 Handle<JSFunction> function(holder, isolate);
754 800
755 FrameFunctionIterator it(isolate, no_allocation); 801 FrameFunctionIterator it(isolate, no_allocation);
756 802
757 // Find the function from the frames. 803 // Find the function from the frames.
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
859 info->set_data(Smi::FromInt(index)); 905 info->set_data(Smi::FromInt(index));
860 Handle<Object> getter = v8::FromCData(&ModuleGetExport); 906 Handle<Object> getter = v8::FromCData(&ModuleGetExport);
861 Handle<Object> setter = v8::FromCData(&ModuleSetExport); 907 Handle<Object> setter = v8::FromCData(&ModuleSetExport);
862 info->set_getter(*getter); 908 info->set_getter(*getter);
863 if (!(attributes & ReadOnly)) info->set_setter(*setter); 909 if (!(attributes & ReadOnly)) info->set_setter(*setter);
864 return info; 910 return info;
865 } 911 }
866 912
867 913
868 } } // namespace v8::internal 914 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/accessors.h ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698