00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "v8.h"
00029
00030 #include "ic-inl.h"
00031 #include "codegen-inl.h"
00032 #include "stub-cache.h"
00033
00034 namespace v8 { namespace internal {
00035
00036 #define __ masm->
00037
00038
00039 static void ProbeTable(MacroAssembler* masm,
00040 Code::Flags flags,
00041 StubCache::Table table,
00042 Register name,
00043 Register offset) {
00044 ExternalReference key_offset(SCTableReference::keyReference(table));
00045 ExternalReference value_offset(SCTableReference::valueReference(table));
00046
00047 Label miss;
00048
00049
00050 __ push(offset);
00051
00052
00053 __ mov(ip, Operand(key_offset));
00054 __ ldr(ip, MemOperand(ip, offset, LSL, 1));
00055 __ cmp(name, Operand(ip));
00056 __ b(ne, &miss);
00057
00058
00059 __ mov(ip, Operand(value_offset));
00060 __ ldr(offset, MemOperand(ip, offset, LSL, 1));
00061
00062
00063 __ ldr(offset, FieldMemOperand(offset, Code::kFlagsOffset));
00064 __ and_(offset, offset, Operand(~Code::kFlagsTypeMask));
00065 __ cmp(offset, Operand(flags));
00066 __ b(ne, &miss);
00067
00068
00069 __ pop(offset);
00070 __ mov(ip, Operand(value_offset));
00071 __ ldr(offset, MemOperand(ip, offset, LSL, 1));
00072
00073
00074 __ add(offset, offset, Operand(Code::kHeaderSize - kHeapObjectTag));
00075 __ Jump(offset);
00076
00077
00078 __ bind(&miss);
00079 __ pop(offset);
00080 }
00081
00082
00083 void StubCache::GenerateProbe(MacroAssembler* masm,
00084 Code::Flags flags,
00085 Register receiver,
00086 Register name,
00087 Register scratch) {
00088 Label miss;
00089
00090
00091
00092 ASSERT(sizeof(Entry) == 8);
00093
00094
00095 ASSERT(Code::ExtractTypeFromFlags(flags) == 0);
00096
00097
00098 ASSERT(!scratch.is(receiver));
00099 ASSERT(!scratch.is(name));
00100
00101
00102 __ tst(receiver, Operand(kSmiTagMask));
00103 __ b(eq, &miss);
00104
00105
00106 __ ldr(scratch, FieldMemOperand(name, String::kLengthOffset));
00107 __ ldr(ip, FieldMemOperand(receiver, HeapObject::kMapOffset));
00108 __ add(scratch, scratch, Operand(ip));
00109 __ eor(scratch, scratch, Operand(flags));
00110 __ and_(scratch,
00111 scratch,
00112 Operand((kPrimaryTableSize - 1) << kHeapObjectTagSize));
00113
00114
00115 ProbeTable(masm, flags, kPrimary, name, scratch);
00116
00117
00118 __ sub(scratch, scratch, Operand(name));
00119 __ add(scratch, scratch, Operand(flags));
00120 __ and_(scratch,
00121 scratch,
00122 Operand((kSecondaryTableSize - 1) << kHeapObjectTagSize));
00123
00124
00125 ProbeTable(masm, flags, kSecondary, name, scratch);
00126
00127
00128
00129 __ bind(&miss);
00130 }
00131
00132
00133 void StubCompiler::GenerateLoadGlobalFunctionPrototype(MacroAssembler* masm,
00134 int index,
00135 Register prototype) {
00136
00137 __ ldr(prototype, MemOperand(cp, Context::SlotOffset(Context::GLOBAL_INDEX)));
00138
00139 __ ldr(prototype,
00140 FieldMemOperand(prototype, GlobalObject::kGlobalContextOffset));
00141
00142 __ ldr(prototype, MemOperand(prototype, Context::SlotOffset(index)));
00143
00144 __ ldr(prototype,
00145 FieldMemOperand(prototype, JSFunction::kPrototypeOrInitialMapOffset));
00146
00147 __ ldr(prototype, FieldMemOperand(prototype, Map::kPrototypeOffset));
00148 }
00149
00150
00151
00152
00153
00154 void StubCompiler::GenerateFastPropertyLoad(MacroAssembler* masm,
00155 Register dst, Register src,
00156 JSObject* holder, int index) {
00157
00158 index -= holder->map()->inobject_properties();
00159 if (index < 0) {
00160
00161 int offset = holder->map()->instance_size() + (index * kPointerSize);
00162 __ ldr(dst, FieldMemOperand(src, offset));
00163 } else {
00164
00165 int offset = index * kPointerSize + Array::kHeaderSize;
00166 __ ldr(dst, FieldMemOperand(src, JSObject::kPropertiesOffset));
00167 __ ldr(dst, FieldMemOperand(dst, offset));
00168 }
00169 }
00170
00171
00172 #undef __
00173
00174 #define __ masm()->
00175
00176
00177 Object* StubCompiler::CompileLazyCompile(Code::Flags flags) {
00178
00179
00180
00181
00182
00183 HandleScope scope;
00184
00185
00186 __ EnterInternalFrame();
00187
00188
00189 __ push(r1);
00190
00191
00192 __ push(r1);
00193 __ CallRuntime(Runtime::kLazyCompile, 1);
00194
00195
00196 __ add(r2, r0, Operand(Code::kHeaderSize - kHeapObjectTag));
00197
00198
00199 __ pop(r1);
00200
00201
00202 __ LeaveInternalFrame();
00203
00204
00205 __ Jump(r2);
00206
00207 return GetCodeWithFlags(flags);
00208 }
00209
00210
00211 Object* CallStubCompiler::CompileCallField(Object* object,
00212 JSObject* holder,
00213 int index) {
00214
00215
00216
00217
00218 HandleScope scope;
00219 Label miss;
00220
00221 const int argc = arguments().immediate();
00222
00223
00224 __ ldr(r0, MemOperand(sp, argc * kPointerSize));
00225
00226 __ tst(r0, Operand(kSmiTagMask));
00227 __ b(eq, &miss);
00228
00229
00230 Register reg =
00231 __ CheckMaps(JSObject::cast(object), r0, holder, r3, r2, &miss);
00232 GenerateFastPropertyLoad(masm(), r1, reg, holder, index);
00233
00234
00235 __ tst(r1, Operand(kSmiTagMask));
00236 __ b(eq, &miss);
00237
00238 __ ldr(r2, FieldMemOperand(r1, HeapObject::kMapOffset));
00239 __ ldrb(r2, FieldMemOperand(r2, Map::kInstanceTypeOffset));
00240 __ cmp(r2, Operand(JS_FUNCTION_TYPE));
00241 __ b(ne, &miss);
00242
00243
00244
00245 if (object->IsGlobalObject()) {
00246 __ ldr(r3, FieldMemOperand(r0, GlobalObject::kGlobalReceiverOffset));
00247 __ str(r3, MemOperand(sp, argc * kPointerSize));
00248 }
00249
00250
00251 __ InvokeFunction(r1, arguments(), JUMP_FUNCTION);
00252
00253
00254 __ bind(&miss);
00255 Handle<Code> ic = ComputeCallMiss(arguments().immediate());
00256 __ Jump(ic, RelocInfo::CODE_TARGET);
00257
00258
00259 return GetCode(FIELD);
00260 }
00261
00262
00263 Object* CallStubCompiler::CompileCallConstant(Object* object,
00264 JSObject* holder,
00265 JSFunction* function,
00266 CheckType check) {
00267
00268
00269
00270
00271 HandleScope scope;
00272 Label miss;
00273
00274
00275 const int argc = arguments().immediate();
00276 __ ldr(r1, MemOperand(sp, argc * kPointerSize));
00277
00278
00279 if (check != NUMBER_CHECK) {
00280 __ tst(r1, Operand(kSmiTagMask));
00281 __ b(eq, &miss);
00282 }
00283
00284
00285
00286 ASSERT(!object->IsGlobalObject() || check == RECEIVER_MAP_CHECK);
00287
00288 switch (check) {
00289 case RECEIVER_MAP_CHECK:
00290
00291 __ CheckMaps(JSObject::cast(object), r1, holder, r3, r2, &miss);
00292
00293
00294
00295 if (object->IsGlobalObject()) {
00296 __ ldr(r3, FieldMemOperand(r1, GlobalObject::kGlobalReceiverOffset));
00297 __ str(r3, MemOperand(sp, argc * kPointerSize));
00298 }
00299 break;
00300
00301 case STRING_CHECK:
00302
00303 __ ldr(r2, FieldMemOperand(r1, HeapObject::kMapOffset));
00304 __ ldrb(r2, FieldMemOperand(r2, Map::kInstanceTypeOffset));
00305 __ cmp(r2, Operand(FIRST_NONSTRING_TYPE));
00306 __ b(hs, &miss);
00307
00308 GenerateLoadGlobalFunctionPrototype(masm(),
00309 Context::STRING_FUNCTION_INDEX,
00310 r2);
00311 __ CheckMaps(JSObject::cast(object->GetPrototype()),
00312 r2, holder, r3, r1, &miss);
00313 break;
00314
00315 case NUMBER_CHECK: {
00316 Label fast;
00317
00318 __ tst(r1, Operand(kSmiTagMask));
00319 __ b(eq, &fast);
00320 __ ldr(r2, FieldMemOperand(r1, HeapObject::kMapOffset));
00321 __ ldrb(r2, FieldMemOperand(r2, Map::kInstanceTypeOffset));
00322 __ cmp(r2, Operand(HEAP_NUMBER_TYPE));
00323 __ b(ne, &miss);
00324 __ bind(&fast);
00325
00326 GenerateLoadGlobalFunctionPrototype(masm(),
00327 Context::NUMBER_FUNCTION_INDEX,
00328 r2);
00329 __ CheckMaps(JSObject::cast(object->GetPrototype()),
00330 r2, holder, r3, r1, &miss);
00331 break;
00332 }
00333
00334 case BOOLEAN_CHECK: {
00335 Label fast;
00336
00337 __ cmp(r1, Operand(Factory::true_value()));
00338 __ b(eq, &fast);
00339 __ cmp(r1, Operand(Factory::false_value()));
00340 __ b(ne, &miss);
00341 __ bind(&fast);
00342
00343 GenerateLoadGlobalFunctionPrototype(masm(),
00344 Context::BOOLEAN_FUNCTION_INDEX,
00345 r2);
00346 __ CheckMaps(JSObject::cast(object->GetPrototype()),
00347 r2, holder, r3, r1, &miss);
00348 break;
00349 }
00350
00351 case JSARRAY_HAS_FAST_ELEMENTS_CHECK:
00352 __ CheckMaps(JSObject::cast(object), r1, holder, r3, r2, &miss);
00353
00354
00355 __ ldr(r3, FieldMemOperand(r1, JSObject::kElementsOffset));
00356
00357 __ ldr(r2, FieldMemOperand(r3, HeapObject::kMapOffset));
00358 __ cmp(r2, Operand(Factory::hash_table_map()));
00359 __ b(eq, &miss);
00360 break;
00361
00362 default:
00363 UNREACHABLE();
00364 }
00365
00366
00367 __ mov(r1, Operand(Handle<JSFunction>(function)));
00368 __ ldr(cp, FieldMemOperand(r1, JSFunction::kContextOffset));
00369
00370
00371 Handle<Code> code(function->code());
00372 ParameterCount expected(function->shared()->formal_parameter_count());
00373 __ InvokeCode(code, expected, arguments(),
00374 RelocInfo::CODE_TARGET, JUMP_FUNCTION);
00375
00376
00377 __ bind(&miss);
00378 Handle<Code> ic = ComputeCallMiss(arguments().immediate());
00379 __ Jump(ic, RelocInfo::CODE_TARGET);
00380
00381
00382 return GetCode(CONSTANT_FUNCTION);
00383 }
00384
00385
00386 Object* CallStubCompiler::CompileCallInterceptor(Object* object,
00387 JSObject* holder,
00388 String* name) {
00389
00390
00391
00392
00393 HandleScope scope;
00394 Label miss;
00395
00396
00397
00398
00399 __ bind(&miss);
00400 Handle<Code> ic = ComputeCallMiss(arguments().immediate());
00401 __ Jump(ic, RelocInfo::CODE_TARGET);
00402
00403
00404 return GetCode(INTERCEPTOR);
00405 }
00406
00407
00408 Object* StoreStubCompiler::CompileStoreField(JSObject* object,
00409 int index,
00410 Map* transition,
00411 String* name) {
00412
00413
00414
00415
00416
00417
00418
00419 HandleScope scope;
00420 Label miss, exit;
00421
00422
00423 __ ldr(r3, MemOperand(sp, 0 * kPointerSize));
00424
00425
00426 __ tst(r3, Operand(kSmiTagMask));
00427 __ b(eq, &miss);
00428
00429
00430 __ ldr(r1, FieldMemOperand(r3, HeapObject::kMapOffset));
00431 __ cmp(r1, Operand(Handle<Map>(object->map())));
00432 __ b(ne, &miss);
00433
00434
00435 if (object->IsJSGlobalProxy()) {
00436 __ CheckAccessGlobalProxy(r3, r1, &miss);
00437 }
00438
00439
00440
00441 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
00442
00443
00444 if ((transition != NULL) && (object->map()->unused_property_fields() == 0)) {
00445
00446
00447 __ mov(r2, Operand(Handle<Map>(transition)));
00448
00449
00450 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_ExtendStorage));
00451 __ Jump(ic, RelocInfo::CODE_TARGET);
00452 } else {
00453
00454
00455
00456 index -= object->map()->inobject_properties();
00457
00458 if (index >= 0) {
00459
00460 __ ldr(r1, FieldMemOperand(r3, JSObject::kPropertiesOffset));
00461 }
00462
00463 if (transition != NULL) {
00464
00465
00466 __ mov(ip, Operand(Handle<Map>(transition)));
00467 __ str(ip, FieldMemOperand(r3, HeapObject::kMapOffset));
00468 }
00469
00470 if (index < 0) {
00471
00472 int offset = object->map()->instance_size() + (index * kPointerSize);
00473 __ str(r0, FieldMemOperand(r3, offset));
00474
00475
00476 __ tst(r0, Operand(kSmiTagMask));
00477 __ b(eq, &exit);
00478
00479
00480 __ mov(r1, Operand(offset));
00481 __ RecordWrite(r3, r1, r2);
00482 } else {
00483
00484 int offset = index * kPointerSize + Array::kHeaderSize;
00485 __ str(r0, FieldMemOperand(r1, offset));
00486
00487
00488 __ tst(r0, Operand(kSmiTagMask));
00489 __ b(eq, &exit);
00490
00491
00492 __ mov(r3, Operand(offset));
00493 __ RecordWrite(r1, r3, r2);
00494 }
00495
00496
00497 __ bind(&exit);
00498 __ Ret();
00499 }
00500
00501 __ bind(&miss);
00502 __ mov(r2, Operand(Handle<String>(name)));
00503 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss));
00504 __ Jump(ic, RelocInfo::CODE_TARGET);
00505
00506
00507 return GetCode(transition == NULL ? FIELD : MAP_TRANSITION);
00508 }
00509
00510
00511 Object* StoreStubCompiler::CompileStoreCallback(JSObject* object,
00512 AccessorInfo* callback,
00513 String* name) {
00514
00515
00516
00517
00518
00519
00520
00521 HandleScope scope;
00522 Label miss;
00523
00524
00525 __ ldr(r3, MemOperand(sp, 0 * kPointerSize));
00526
00527
00528 __ tst(r3, Operand(kSmiTagMask));
00529 __ b(eq, &miss);
00530
00531
00532 __ ldr(r1, FieldMemOperand(r3, HeapObject::kMapOffset));
00533 __ cmp(r1, Operand(Handle<Map>(object->map())));
00534 __ b(ne, &miss);
00535
00536
00537 if (object->IsJSGlobalProxy()) {
00538 __ CheckAccessGlobalProxy(r3, r1, &miss);
00539 }
00540
00541
00542
00543 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
00544
00545 __ ldr(ip, MemOperand(sp));
00546 __ push(ip);
00547 __ mov(ip, Operand(Handle<AccessorInfo>(callback)));
00548 __ push(ip);
00549 __ push(r2);
00550 __ push(r0);
00551
00552
00553 ExternalReference store_callback_property =
00554 ExternalReference(IC_Utility(IC::kStoreCallbackProperty));
00555 __ TailCallRuntime(store_callback_property, 4);
00556
00557
00558 __ bind(&miss);
00559 __ mov(r2, Operand(Handle<String>(name)));
00560 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss));
00561 __ Jump(ic, RelocInfo::CODE_TARGET);
00562
00563
00564 return GetCode(CALLBACKS);
00565 }
00566
00567
00568 Object* StoreStubCompiler::CompileStoreInterceptor(JSObject* receiver,
00569 String* name) {
00570
00571
00572
00573
00574
00575
00576
00577 HandleScope scope;
00578 Label miss;
00579
00580
00581 __ ldr(r3, MemOperand(sp, 0 * kPointerSize));
00582
00583
00584 __ tst(r3, Operand(kSmiTagMask));
00585 __ b(eq, &miss);
00586
00587
00588 __ ldr(r1, FieldMemOperand(r3, HeapObject::kMapOffset));
00589 __ cmp(r1, Operand(Handle<Map>(receiver->map())));
00590 __ b(ne, &miss);
00591
00592
00593 if (receiver->IsJSGlobalProxy()) {
00594 __ CheckAccessGlobalProxy(r3, r1, &miss);
00595 }
00596
00597
00598
00599 ASSERT(receiver->IsJSGlobalProxy() || !receiver->IsAccessCheckNeeded());
00600
00601 __ ldr(ip, MemOperand(sp));
00602 __ push(ip);
00603 __ push(r2);
00604 __ push(r0);
00605
00606
00607 ExternalReference store_ic_property =
00608 ExternalReference(IC_Utility(IC::kStoreInterceptorProperty));
00609 __ TailCallRuntime(store_ic_property, 3);
00610
00611
00612 __ bind(&miss);
00613 __ mov(r2, Operand(Handle<String>(name)));
00614 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Miss));
00615 __ Jump(ic, RelocInfo::CODE_TARGET);
00616
00617
00618 return GetCode(INTERCEPTOR);
00619 }
00620
00621
00622 Object* LoadStubCompiler::CompileLoadField(JSObject* object,
00623 JSObject* holder,
00624 int index) {
00625
00626
00627
00628
00629
00630
00631 HandleScope scope;
00632 Label miss;
00633
00634 __ ldr(r0, MemOperand(sp, 0));
00635
00636
00637 __ tst(r0, Operand(kSmiTagMask));
00638 __ b(eq, &miss);
00639
00640
00641 Register reg = __ CheckMaps(object, r0, holder, r3, r1, &miss);
00642 GenerateFastPropertyLoad(masm(), r0, reg, holder, index);
00643 __ Ret();
00644
00645
00646 __ bind(&miss);
00647 __ ldr(r0, MemOperand(sp));
00648 Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Miss));
00649 __ Jump(ic, RelocInfo::CODE_TARGET);
00650
00651
00652 return GetCode(FIELD);
00653 }
00654
00655
00656 Object* LoadStubCompiler::CompileLoadCallback(JSObject* object,
00657 JSObject* holder,
00658 AccessorInfo* callback) {
00659
00660
00661
00662
00663
00664
00665 HandleScope scope;
00666 Label miss;
00667
00668 __ ldr(r0, MemOperand(sp, 0));
00669
00670 __ tst(r0, Operand(kSmiTagMask));
00671 __ b(eq, &miss);
00672
00673
00674 Register reg = __ CheckMaps(object, r0, holder, r3, r1, &miss);
00675
00676
00677 __ push(r0);
00678 __ mov(ip, Operand(Handle<AccessorInfo>(callback)));
00679 __ push(ip);
00680 __ push(r2);
00681 __ push(reg);
00682
00683
00684 ExternalReference load_callback_property =
00685 ExternalReference(IC_Utility(IC::kLoadCallbackProperty));
00686 __ TailCallRuntime(load_callback_property, 4);
00687
00688
00689 __ bind(&miss);
00690 Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Miss));
00691 __ Jump(ic, RelocInfo::CODE_TARGET);
00692
00693
00694 return GetCode(CALLBACKS);
00695 }
00696
00697
00698 Object* LoadStubCompiler::CompileLoadConstant(JSObject* object,
00699 JSObject* holder,
00700 Object* value) {
00701
00702
00703
00704
00705
00706
00707 HandleScope scope;
00708 Label miss;
00709
00710 __ ldr(r0, MemOperand(sp, 0));
00711
00712 __ tst(r0, Operand(kSmiTagMask));
00713 __ b(eq, &miss);
00714
00715
00716 Register reg = __ CheckMaps(object, r0, holder, r3, r1, &miss);
00717
00718
00719 __ mov(r0, Operand(Handle<Object>(value)));
00720 __ Ret();
00721
00722
00723 __ bind(&miss);
00724 Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Miss));
00725 __ Jump(ic, RelocInfo::CODE_TARGET);
00726
00727
00728 return GetCode(CONSTANT_FUNCTION);
00729 }
00730
00731
00732 Object* LoadStubCompiler::CompileLoadInterceptor(JSObject* object,
00733 JSObject* holder,
00734 String* name) {
00735
00736
00737
00738
00739
00740
00741 HandleScope scope;
00742 Label miss;
00743
00744 __ ldr(r0, MemOperand(sp, 0));
00745
00746 __ tst(r0, Operand(kSmiTagMask));
00747 __ b(eq, &miss);
00748
00749
00750 Register reg = __ CheckMaps(object, r0, holder, r3, r1, &miss);
00751
00752
00753 __ push(r0);
00754 __ push(reg);
00755 __ push(r2);
00756
00757
00758 ExternalReference load_ic_property =
00759 ExternalReference(IC_Utility(IC::kLoadInterceptorProperty));
00760 __ TailCallRuntime(load_ic_property, 3);
00761
00762
00763 __ bind(&miss);
00764 Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Miss));
00765 __ Jump(ic, RelocInfo::CODE_TARGET);
00766
00767
00768 return GetCode(INTERCEPTOR);
00769 }
00770
00771
00772
00773
00774 Object* KeyedLoadStubCompiler::CompileLoadField(String* name,
00775 JSObject* receiver,
00776 JSObject* holder,
00777 int index) {
00778 UNIMPLEMENTED();
00779 return Heap::undefined_value();
00780 }
00781
00782
00783 Object* KeyedLoadStubCompiler::CompileLoadCallback(String* name,
00784 JSObject* receiver,
00785 JSObject* holder,
00786 AccessorInfo* callback) {
00787 UNIMPLEMENTED();
00788 return Heap::undefined_value();
00789 }
00790
00791
00792 Object* KeyedLoadStubCompiler::CompileLoadConstant(String* name,
00793 JSObject* receiver,
00794 JSObject* holder,
00795 Object* value) {
00796 UNIMPLEMENTED();
00797 return Heap::undefined_value();
00798 }
00799
00800
00801 Object* KeyedLoadStubCompiler::CompileLoadInterceptor(JSObject* receiver,
00802 JSObject* holder,
00803 String* name) {
00804 UNIMPLEMENTED();
00805 return Heap::undefined_value();
00806 }
00807
00808
00809 Object* KeyedLoadStubCompiler::CompileLoadArrayLength(String* name) {
00810 UNIMPLEMENTED();
00811 return Heap::undefined_value();
00812 }
00813
00814
00815 Object* KeyedLoadStubCompiler::CompileLoadStringLength(String* name) {
00816 UNIMPLEMENTED();
00817 return Heap::undefined_value();
00818 }
00819
00820
00821 Object* KeyedLoadStubCompiler::CompileLoadFunctionPrototype(String* name) {
00822 UNIMPLEMENTED();
00823 return Heap::undefined_value();
00824 }
00825
00826
00827 Object* KeyedStoreStubCompiler::CompileStoreField(JSObject* object,
00828 int index,
00829 Map* transition,
00830 String* name) {
00831 UNIMPLEMENTED();
00832 return Heap::undefined_value();
00833 }
00834
00835
00836
00837 #undef __
00838
00839 } }