1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/jit/RematerializedFrame.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,148 @@ 1.4 +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- 1.5 + * vim: set ts=8 sts=4 et sw=4 tw=99: 1.6 + * This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +#include "jit/RematerializedFrame.h" 1.11 +#include "jit/IonFrames.h" 1.12 + 1.13 +#include "vm/ArgumentsObject.h" 1.14 + 1.15 +#include "jsscriptinlines.h" 1.16 +#include "jit/IonFrames-inl.h" 1.17 + 1.18 +using namespace js; 1.19 +using namespace jit; 1.20 + 1.21 +struct CopyValueToRematerializedFrame 1.22 +{ 1.23 + Value *slots; 1.24 + 1.25 + CopyValueToRematerializedFrame(Value *slots) 1.26 + : slots(slots) 1.27 + { } 1.28 + 1.29 + void operator()(const Value &v) { 1.30 + *slots++ = v; 1.31 + } 1.32 +}; 1.33 + 1.34 +RematerializedFrame::RematerializedFrame(JSContext *cx, uint8_t *top, InlineFrameIterator &iter) 1.35 + : prevUpToDate_(false), 1.36 + top_(top), 1.37 + frameNo_(iter.frameNo()), 1.38 + numActualArgs_(iter.numActualArgs()), 1.39 + script_(iter.script()) 1.40 +{ 1.41 + CopyValueToRematerializedFrame op(slots_); 1.42 + iter.readFrameArgsAndLocals(cx, op, op, &scopeChain_, &returnValue_, 1.43 + &argsObj_, &thisValue_, ReadFrame_Actuals); 1.44 +} 1.45 + 1.46 +/* static */ RematerializedFrame * 1.47 +RematerializedFrame::New(JSContext *cx, uint8_t *top, InlineFrameIterator &iter) 1.48 +{ 1.49 + unsigned numFormals = iter.isFunctionFrame() ? iter.callee()->nargs() : 0; 1.50 + size_t numBytes = sizeof(RematerializedFrame) + 1.51 + (Max(numFormals, iter.numActualArgs()) + 1.52 + iter.script()->nfixed()) * sizeof(Value) - 1.53 + sizeof(Value); // 1 Value included in sizeof(RematerializedFrame) 1.54 + 1.55 + void *buf = cx->calloc_(numBytes); 1.56 + if (!buf) 1.57 + return nullptr; 1.58 + 1.59 + return new (buf) RematerializedFrame(cx, top, iter); 1.60 +} 1.61 + 1.62 +CallObject & 1.63 +RematerializedFrame::callObj() const 1.64 +{ 1.65 + JS_ASSERT(hasCallObj()); 1.66 + 1.67 + JSObject *scope = scopeChain(); 1.68 + while (!scope->is<CallObject>()) 1.69 + scope = scope->enclosingScope(); 1.70 + return scope->as<CallObject>(); 1.71 +} 1.72 + 1.73 +void 1.74 +RematerializedFrame::mark(JSTracer *trc) 1.75 +{ 1.76 + gc::MarkScriptRoot(trc, &script_, "remat ion frame script"); 1.77 + gc::MarkObjectRoot(trc, &scopeChain_, "remat ion frame scope chain"); 1.78 + gc::MarkValueRoot(trc, &returnValue_, "remat ion frame return value"); 1.79 + gc::MarkValueRoot(trc, &thisValue_, "remat ion frame this"); 1.80 + gc::MarkValueRootRange(trc, slots_, slots_ + numActualArgs_ + script_->nfixed(), 1.81 + "remat ion frame stack"); 1.82 +} 1.83 + 1.84 +void 1.85 +RematerializedFrame::dump() 1.86 +{ 1.87 + fprintf(stderr, " Rematerialized Optimized Frame%s\n", inlined() ? " (inlined)" : ""); 1.88 + if (isFunctionFrame()) { 1.89 + fprintf(stderr, " callee fun: "); 1.90 +#ifdef DEBUG 1.91 + js_DumpObject(callee()); 1.92 +#else 1.93 + fprintf(stderr, "?\n"); 1.94 +#endif 1.95 + } else { 1.96 + fprintf(stderr, " global frame, no callee\n"); 1.97 + } 1.98 + 1.99 + fprintf(stderr, " file %s line %u\n", 1.100 + script()->filename(), (unsigned) script()->lineno()); 1.101 + 1.102 + fprintf(stderr, " script = %p\n", (void*) script()); 1.103 + 1.104 + if (isFunctionFrame()) { 1.105 + fprintf(stderr, " scope chain: "); 1.106 +#ifdef DEBUG 1.107 + js_DumpObject(scopeChain()); 1.108 +#else 1.109 + fprintf(stderr, "?\n"); 1.110 +#endif 1.111 + 1.112 + if (hasArgsObj()) { 1.113 + fprintf(stderr, " args obj: "); 1.114 +#ifdef DEBUG 1.115 + js_DumpObject(&argsObj()); 1.116 +#else 1.117 + fprintf(stderr, "?\n"); 1.118 +#endif 1.119 + } 1.120 + 1.121 + fprintf(stderr, " this: "); 1.122 +#ifdef DEBUG 1.123 + js_DumpValue(thisValue()); 1.124 +#else 1.125 + fprintf(stderr, "?\n"); 1.126 +#endif 1.127 + 1.128 + for (unsigned i = 0; i < numActualArgs(); i++) { 1.129 + if (i < numFormalArgs()) 1.130 + fprintf(stderr, " formal (arg %d): ", i); 1.131 + else 1.132 + fprintf(stderr, " overflown (arg %d): ", i); 1.133 +#ifdef DEBUG 1.134 + js_DumpValue(argv()[i]); 1.135 +#else 1.136 + fprintf(stderr, "?\n"); 1.137 +#endif 1.138 + } 1.139 + 1.140 + for (unsigned i = 0; i < script()->nfixed(); i++) { 1.141 + fprintf(stderr, " local %d: ", i); 1.142 +#ifdef DEBUG 1.143 + js_DumpValue(locals()[i]); 1.144 +#else 1.145 + fprintf(stderr, "?\n"); 1.146 +#endif 1.147 + } 1.148 + } 1.149 + 1.150 + fputc('\n', stderr); 1.151 +}