11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkScript2.h"
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define TypeOpName(op) {SkScriptEngine2::op, #op }
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic const struct OpName {
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScriptEngine2::TypeOp fOp;
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const char* fName;
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} gOpNames[] = {
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kNop), // should never get generated
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kAccumulatorPop),
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kAccumulatorPush),
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kAddInt),
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kAddScalar),
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kAddString), // string concat
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kArrayIndex),
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kArrayParam),
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kArrayToken),
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kBitAndInt),
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kBitNotInt),
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kBitOrInt),
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kBoxToken),
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kCallback),
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kDivideInt),
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kDivideScalar),
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kDotOperator),
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kElseOp),
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kEnd),
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kEqualInt),
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kEqualScalar),
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kEqualString),
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kFunctionCall),
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kFlipOpsOp),
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kFunctionToken),
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kGreaterEqualInt),
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kGreaterEqualScalar),
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kGreaterEqualString),
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kIfOp),
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kIntToScalar),
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kIntToScalar2),
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kIntToString),
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kIntToString2),
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kIntegerAccumulator),
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kIntegerOperand),
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kLogicalAndInt),
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kLogicalNotInt),
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kLogicalOrInt),
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kMemberOp),
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kMinusInt),
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kMinusScalar),
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kModuloInt),
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kModuloScalar),
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kMultiplyInt),
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kMultiplyScalar),
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kPropertyOp),
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kScalarAccumulator),
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kScalarOperand),
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kScalarToInt),
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kScalarToInt2),
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kScalarToString),
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kScalarToString2),
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kShiftLeftInt),
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kShiftRightInt), // signed
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kStringAccumulator),
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kStringOperand),
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kStringToInt),
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kStringToScalar),
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kStringToScalar2),
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kStringTrack),
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kSubtractInt),
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kSubtractScalar),
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kToBool),
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kUnboxToken),
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kUnboxToken2),
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    TypeOpName(kXorInt)
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic size_t gOpNamesSize = sizeof(gOpNames) / sizeof(gOpNames[0]);
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define OperandName(op) {SkOperand2::op, #op }
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic const struct OperName {
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkOperand2::OpType fType;
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const char* fName;
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} gOperandNames[] = {
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    OperandName(kNoType),
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    OperandName(kS32),
980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    OperandName(kScalar),
990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    OperandName(kString),
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    OperandName(kArray),
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    OperandName(kObject)
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic size_t gOperandNamesSize = sizeof(gOperandNames) / sizeof(gOperandNames[0]);
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// check to see that there are no missing or duplicate entries
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkScriptEngine2::ValidateDecompileTable() {
1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkScriptEngine2::TypeOp op = SkScriptEngine2::kNop;
1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    size_t index;
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (index = 0; index < gOpNamesSize; index++) {
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(gOpNames[index].fOp == op);
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        op = (SkScriptEngine2::TypeOp) (op + 1);
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    index = 0;
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkOperand2::OpType type = SkOperand2::kNoType;
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(gOperandNames[index].fType == type);
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    for (; index < gOperandNamesSize - 1; ) {
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        type = (SkOperand2::OpType) (1 << index);
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkASSERT(gOperandNames[++index].fType == type);
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkScriptEngine2::decompile(const unsigned char* start, size_t length) {
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkASSERT(length > 0);
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    const unsigned char* opCode = start;
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    do {
1270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkASSERT((size_t)(opCode - start) < length);
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkScriptEngine2::TypeOp op = (SkScriptEngine2::TypeOp) *opCode++;
1290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkASSERT((size_t)op < gOpNamesSize);
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        SkDebugf("%d: %s", opCode - start - 1, gOpNames[op].fName);
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        switch (op) {
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScriptEngine2::kCallback: {
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int index;
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            memcpy(&index, opCode, sizeof(index));
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            opCode += sizeof(index);
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf(" index: %d", index);
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            } break;
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScriptEngine2::kFunctionCall:
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScriptEngine2::kMemberOp:
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScriptEngine2::kPropertyOp: {
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            size_t ref;
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            memcpy(&ref, opCode, sizeof(ref));
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            opCode += sizeof(ref);
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf(" ref: %d", ref);
1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            } break;
1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScriptEngine2::kIntegerAccumulator:
1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScriptEngine2::kIntegerOperand: {
1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int32_t integer;
1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            memcpy(&integer, opCode, sizeof(integer));
1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            opCode += sizeof(int32_t);
1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf(" integer: %d", integer);
1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            } break;
1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScriptEngine2::kScalarAccumulator:
1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScriptEngine2::kScalarOperand: {
1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkScalar scalar;
1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            memcpy(&scalar, opCode, sizeof(scalar));
1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            opCode += sizeof(SkScalar);
1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_CAN_USE_FLOAT
1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf(" scalar: %g", SkScalarToFloat(scalar));
1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else
1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf(" scalar: %x", scalar);
1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            } break;
1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScriptEngine2::kStringAccumulator:
1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScriptEngine2::kStringOperand: {
1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int size;
1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkString* strPtr = new SkString();
1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            memcpy(&size, opCode, sizeof(size));
1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            opCode += sizeof(size);
1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            strPtr->set((char*) opCode, size);
1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            opCode += size;
1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf(" string: %s", strPtr->c_str());
1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            delete strPtr;
1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            } break;
1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScriptEngine2::kBoxToken: {
1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkOperand2::OpType type;
1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            memcpy(&type, opCode, sizeof(type));
1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            opCode += sizeof(type);
1790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            size_t index = 0;
1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            if (type == 0)
1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkDebugf(" type: %s", gOperandNames[index].fName);
1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            else {
1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                while (type != 0) {
1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    SkASSERT(index + 1 < gOperandNamesSize);
1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    if (type & (1 << index)) {
1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        type = (SkOperand2::OpType) (type & ~(1 << index));
1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        SkDebugf(" type: %s", gOperandNames[index + 1].fName);
1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    }
1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                    index++;
1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                }
1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            }
1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            } break;
1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScriptEngine2::kIfOp:
1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScriptEngine2::kLogicalAndInt:
1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScriptEngine2::kElseOp:
1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScriptEngine2::kLogicalOrInt: {
1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            int size;
1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            memcpy(&size, opCode, sizeof(size));
1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            opCode += sizeof(size);
2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            SkDebugf(" offset (address): %d (%d)", size, opCode - start + size);
2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            } break;
2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScriptEngine2::kEnd:
2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            goto done;
2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        case SkScriptEngine2::kNop:
2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                SkASSERT(0);
2060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        default:
2070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            break;
2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDebugf("\n");
2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    } while (true);
2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectdone:
2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDebugf("\n");
2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}
2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
216