Var AsmJsChangeHeapBuffer(RecyclableObject * function, CallInfo callInfo, ...) { PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault); ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); Assert(!(callInfo.Flags & CallFlags_New)); if (args.Info.Count < 1 || !ArrayBuffer::Is(args[1])) { JavascriptError::ThrowTypeError(scriptContext, JSERR_NeedArrayBufferObject); } ArrayBuffer* newArrayBuffer = ArrayBuffer::FromVar(args[1]); if (newArrayBuffer->IsDetached() || newArrayBuffer->GetByteLength() & 0xffffff || newArrayBuffer->GetByteLength() <= 0xffffff || newArrayBuffer->GetByteLength() > 0x80000000) { return JavascriptBoolean::ToVar(FALSE, scriptContext); } FrameDisplay* frame = ((ScriptFunction*)function)->GetEnvironment(); Var* moduleArrayBuffer = (Var*)frame->GetItem(0) + AsmJsModuleMemory::MemoryTableBeginOffset; *moduleArrayBuffer = newArrayBuffer; return JavascriptBoolean::ToVar(TRUE, scriptContext); }
Var CrossSite::MarshalFrameDisplay(ScriptContext* scriptContext, FrameDisplay *display) { TTD_XSITE_LOG(scriptContext, "MarshalFrameDisplay", nullptr); uint16 length = display->GetLength(); FrameDisplay *newDisplay = RecyclerNewPlus(scriptContext->GetRecycler(), length * sizeof(Var), FrameDisplay, length); for (uint16 i = 0; i < length; i++) { Var value = display->GetItem(i); if (WithScopeObject::Is(value)) { // Here we are marshalling the wrappedObject and then ReWrapping th object in the new context. RecyclableObject* wrappedObject = WithScopeObject::FromVar(value)->GetWrappedObject(); ScriptContext* wrappedObjectScriptContext = wrappedObject->GetScriptContext(); value = JavascriptOperators::ToWithObject(CrossSite::MarshalVar(scriptContext, wrappedObject, wrappedObjectScriptContext), scriptContext); } else { value = CrossSite::MarshalVar(scriptContext, value); } newDisplay->SetItem(i, value); } return (Var)newDisplay; }
Var DiagStackFrame::GetScopeObjectFromFrameDisplay(uint index) { FrameDisplay * display = GetFrameDisplay(); return (display != NULL && display->GetLength() > index) ? display->GetItem(index) : NULL; }