Sat, 03 Jan 2015 20:18:00 +0100
Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.
michael@0 | 1 | /* |
michael@0 | 2 | * Copyright (C) 2012 Apple Inc. All rights reserved. |
michael@0 | 3 | * |
michael@0 | 4 | * Redistribution and use in source and binary forms, with or without |
michael@0 | 5 | * modification, are permitted provided that the following conditions |
michael@0 | 6 | * are met: |
michael@0 | 7 | * 1. Redistributions of source code must retain the above copyright |
michael@0 | 8 | * notice, this list of conditions and the following disclaimer. |
michael@0 | 9 | * 2. Redistributions in binary form must reproduce the above copyright |
michael@0 | 10 | * notice, this list of conditions and the following disclaimer in the |
michael@0 | 11 | * documentation and/or other materials provided with the distribution. |
michael@0 | 12 | * |
michael@0 | 13 | * THIS SOFTWARE IS PROVIDED BY APPLE, INC. ``AS IS'' AND ANY |
michael@0 | 14 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
michael@0 | 15 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
michael@0 | 16 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE, INC. OR |
michael@0 | 17 | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
michael@0 | 18 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
michael@0 | 19 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
michael@0 | 20 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
michael@0 | 21 | * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
michael@0 | 22 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
michael@0 | 23 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
michael@0 | 24 | */ |
michael@0 | 25 | |
michael@0 | 26 | #include "third_party/compiler/ArrayBoundsClamper.h" |
michael@0 | 27 | |
michael@0 | 28 | // The built-in 'clamp' instruction only accepts floats and returns a float. I |
michael@0 | 29 | // iterated a few times with our driver team who examined the output from our |
michael@0 | 30 | // compiler - they said the multiple casts generates more code than a single |
michael@0 | 31 | // function call. An inline ternary operator might have been better, but since |
michael@0 | 32 | // the index value might be an expression itself, we'd have to make temporary |
michael@0 | 33 | // variables to avoid evaluating the expression multiple times. And making |
michael@0 | 34 | // temporary variables was difficult because ANGLE would then need to make more |
michael@0 | 35 | // brutal changes to the expression tree. |
michael@0 | 36 | |
michael@0 | 37 | const char* kIntClampBegin = "// BEGIN: Generated code for array bounds clamping\n\n"; |
michael@0 | 38 | const char* kIntClampEnd = "// END: Generated code for array bounds clamping\n\n"; |
michael@0 | 39 | const char* kIntClampDefinition = "int webgl_int_clamp(int value, int minValue, int maxValue) { return ((value < minValue) ? minValue : ((value > maxValue) ? maxValue : value)); }\n\n"; |
michael@0 | 40 | |
michael@0 | 41 | namespace { |
michael@0 | 42 | |
michael@0 | 43 | class ArrayBoundsClamperMarker : public TIntermTraverser { |
michael@0 | 44 | public: |
michael@0 | 45 | ArrayBoundsClamperMarker() |
michael@0 | 46 | : mNeedsClamp(false) |
michael@0 | 47 | { |
michael@0 | 48 | } |
michael@0 | 49 | |
michael@0 | 50 | virtual bool visitBinary(Visit visit, TIntermBinary* node) |
michael@0 | 51 | { |
michael@0 | 52 | if (node->getOp() == EOpIndexIndirect) |
michael@0 | 53 | { |
michael@0 | 54 | TIntermTyped* left = node->getLeft(); |
michael@0 | 55 | if (left->isArray() || left->isVector() || left->isMatrix()) |
michael@0 | 56 | { |
michael@0 | 57 | node->setAddIndexClamp(); |
michael@0 | 58 | mNeedsClamp = true; |
michael@0 | 59 | } |
michael@0 | 60 | } |
michael@0 | 61 | return true; |
michael@0 | 62 | } |
michael@0 | 63 | |
michael@0 | 64 | bool GetNeedsClamp() { return mNeedsClamp; } |
michael@0 | 65 | |
michael@0 | 66 | private: |
michael@0 | 67 | bool mNeedsClamp; |
michael@0 | 68 | }; |
michael@0 | 69 | |
michael@0 | 70 | } // anonymous namespace |
michael@0 | 71 | |
michael@0 | 72 | ArrayBoundsClamper::ArrayBoundsClamper() |
michael@0 | 73 | : mClampingStrategy(SH_CLAMP_WITH_CLAMP_INTRINSIC) |
michael@0 | 74 | , mArrayBoundsClampDefinitionNeeded(false) |
michael@0 | 75 | { |
michael@0 | 76 | } |
michael@0 | 77 | |
michael@0 | 78 | void ArrayBoundsClamper::SetClampingStrategy(ShArrayIndexClampingStrategy clampingStrategy) |
michael@0 | 79 | { |
michael@0 | 80 | ASSERT(clampingStrategy == SH_CLAMP_WITH_CLAMP_INTRINSIC || |
michael@0 | 81 | clampingStrategy == SH_CLAMP_WITH_USER_DEFINED_INT_CLAMP_FUNCTION); |
michael@0 | 82 | |
michael@0 | 83 | mClampingStrategy = clampingStrategy; |
michael@0 | 84 | } |
michael@0 | 85 | |
michael@0 | 86 | void ArrayBoundsClamper::MarkIndirectArrayBoundsForClamping(TIntermNode* root) |
michael@0 | 87 | { |
michael@0 | 88 | ASSERT(root); |
michael@0 | 89 | |
michael@0 | 90 | ArrayBoundsClamperMarker clamper; |
michael@0 | 91 | root->traverse(&clamper); |
michael@0 | 92 | if (clamper.GetNeedsClamp()) |
michael@0 | 93 | { |
michael@0 | 94 | SetArrayBoundsClampDefinitionNeeded(); |
michael@0 | 95 | } |
michael@0 | 96 | } |
michael@0 | 97 | |
michael@0 | 98 | void ArrayBoundsClamper::OutputClampingFunctionDefinition(TInfoSinkBase& out) const |
michael@0 | 99 | { |
michael@0 | 100 | if (!mArrayBoundsClampDefinitionNeeded) |
michael@0 | 101 | { |
michael@0 | 102 | return; |
michael@0 | 103 | } |
michael@0 | 104 | if (mClampingStrategy != SH_CLAMP_WITH_USER_DEFINED_INT_CLAMP_FUNCTION) |
michael@0 | 105 | { |
michael@0 | 106 | return; |
michael@0 | 107 | } |
michael@0 | 108 | out << kIntClampBegin << kIntClampDefinition << kIntClampEnd; |
michael@0 | 109 | } |