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