Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(756)

Unified Diff: deps/third_party/ragel/01-ragel-6.7.GT2.patch

Issue 10383152: Add ragel to third_party. (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/third_party/
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | deps/third_party/ragel/COPYING » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: deps/third_party/ragel/01-ragel-6.7.GT2.patch
===================================================================
--- deps/third_party/ragel/01-ragel-6.7.GT2.patch (revision 0)
+++ deps/third_party/ragel/01-ragel-6.7.GT2.patch (revision 0)
@@ -0,0 +1,276 @@
+GT2 patch as found in ragel-6-gt2 branch.
+
+More info: http://www.complang.org/pipermail/ragel-users/2012-May/002831.html
+
+--- ragel/cdgoto.cpp
++++ ragel/cdgoto.cpp
+@@ -34,6 +34,11 @@
+ return out;
+ }
+
++int GotoCodeGen::TRANS_NR( RedTransAp *trans )
++{
++ return trans->id;
++}
++
+ std::ostream &GotoCodeGen::TO_STATE_ACTION_SWITCH()
+ {
+ /* Walk the list of functions, printing the cases. */
+@@ -109,6 +114,86 @@
+ }
+
+
++void GotoCodeGen::emitTableSwitch( RedStateAp *state )
++{
++ /* Load up the singles. */
++ int numSingles = state->outSingle.length();
++ RedTransEl *sdata = state->outSingle.data;
++
++ /* Load up the ranges. */
++ int numRanges = state->outRange.length();
++ RedTransEl *rdata = state->outRange.data;
++
++ int minId = INT_MAX;
++ int maxId = INT_MIN;
++
++ for ( Key i = keyOps->minKey; i <= keyOps->maxKey; i.increment() ) {
++ RedTransAp *trans = state->defTrans;
++ for ( int j = 0; j < numRanges; j++ )
++ if ( ( rdata[j].lowKey.getVal() <= i ) && ( i <= rdata[j].highKey.getVal() ) )
++ trans = rdata[j].value;
++ for ( int j = 0; j < numSingles; j++ )
++ if ( i == sdata[j].lowKey.getVal() )
++ trans = sdata[j].value;
++ if ( minId > TRANS_NR(trans) )
++ minId = TRANS_NR(trans);
++ if ( maxId < TRANS_NR(trans) )
++ maxId = TRANS_NR(trans);
++ }
++
++ if ( (maxId - minId) <= UCHAR_MAX )
++ out << "\t{\n" <<
++ "\t\tstatic const unsigned char jump_table[] = ";
++ else if ( (maxId - minId) <= USHRT_MAX )
++ out << "\t{\n" <<
++ "\t\tstatic const unsigned short jump_table[] = ";
++ else
++ out << "\t{\n" <<
++ "\t\tstatic const int jump_table[] = ";
++
++ char delimiter = '{';
++ for ( Key i = keyOps->minKey; i <= keyOps->maxKey; i.increment() ) {
++ RedTransAp *trans = state->defTrans;
++ for ( int j = 0; j < numRanges; j++ )
++ if ( ( rdata[j].lowKey.getVal() <= i ) && ( i <= rdata[j].highKey.getVal() ) )
++ trans = rdata[j].value;
++ for ( int j = 0; j < numSingles; j++ )
++ if ( i == sdata[j].lowKey.getVal() )
++ trans = sdata[j].value;
++ if ( minId >= 0 && maxId <= UCHAR_MAX )
++ out << delimiter << " " << TRANS_NR(trans);
++ else if ( (maxId - minId) <= UCHAR_MAX )
++ out << delimiter << " " << (TRANS_NR(trans) - minId);
++ else if ( minId >= 0 && maxId <= USHRT_MAX )
++ out << delimiter << " " << TRANS_NR(trans);
++ else if ( (maxId - minId) <= USHRT_MAX )
++ out << delimiter << " " << (TRANS_NR(trans) - minId);
++ else
++ out << delimiter << " " << TRANS_NR(trans);
++ delimiter = ',';
++ }
++ out << " };\n";
++
++ if (keyOps->minKey != 0 )
++ out << "\t\t" << vCS() << " = jump_table[" << GET_WIDE_KEY(state) << "-" <<
++ WIDE_KEY(state, keyOps->minKey) << "]";
++ else
++ out << "\t\t" << vCS() << " = jump_table[" << GET_WIDE_KEY(state) << "]";
++ if ( minId >= 0 && maxId <= UCHAR_MAX )
++ out << ";\n";
++ else if ( (maxId - minId) <= UCHAR_MAX )
++ out << " + " << minId << ";\n";
++ else if ( minId >= 0 && maxId <= USHRT_MAX )
++ out << ";\n";
++ else if ( (maxId - minId) <= USHRT_MAX )
++ out << " + " << minId << ";\n";
++ else
++ out << ";\n";
++
++ out << "\t\tgoto _again;\n"
++ "\t}\n";
++}
++
+ void GotoCodeGen::emitSingleSwitch( RedStateAp *state )
+ {
+ /* Load up the singles. */
+@@ -361,16 +446,24 @@
+ emitCondBSearch( st, 1, 0, st->stateCondVect.length() - 1 );
+ }
+
+- /* Try singles. */
+- if ( st->outSingle.length() > 0 )
+- emitSingleSwitch( st );
+-
+- /* Default case is to binary search for the ranges, if that fails then */
+- if ( st->outRange.length() > 0 )
+- emitRangeBSearch( st, 1, 0, st->outRange.length() - 1 );
++ if ( (st->outSingle.length() + st->outRange.length() * 2) > maxTransitions) {
++
++ emitTableSwitch( st );
++
++ } else {
+
+- /* Write the default transition. */
+- TRANS_GOTO( st->defTrans, 1 ) << "\n";
++ /* Try singles. */
++ if ( st->outSingle.length() > 0 )
++ emitSingleSwitch( st );
++
++ /* Default case is to binary search for the ranges, if that fails then */
++ if ( st->outRange.length() > 0 )
++ emitRangeBSearch( st, 1, 0, st->outRange.length() - 1 );
++
++ /* Write the default transition. */
++ TRANS_GOTO( st->defTrans, 1 ) << "\n";
++
++ }
+ }
+ }
+ return out;
+--- ragel/cdgoto.h
++++ ragel/cdgoto.h
+@@ -74,7 +74,9 @@
+ void STATE_CONDS( RedStateAp *state, bool genDefault );
+
+ virtual std::ostream &TRANS_GOTO( RedTransAp *trans, int level );
++ virtual int TRANS_NR( RedTransAp *trans );
+
++ void emitTableSwitch( RedStateAp *state );
+ void emitSingleSwitch( RedStateAp *state );
+ void emitRangeBSearch( RedStateAp *state, int level, int low, int high );
+
+--- ragel/cdipgoto.cpp 2011-02-11 07:14:43.000000000 +0300
++++ ragel/cdipgoto.cpp 2012-05-13 15:20:11.433272943 +0400
+@@ -27,9 +27,20 @@
+ #include "gendata.h"
+ #include "bstmap.h"
+
++bool IpGotoCodeGen::useTransInAgainLabel()
++{
++ for ( RedStateList::Iter st = redFsm->stateList; st.lte(); st++ )
++ if ( st == redFsm->errState )
++ continue;
++ else if ( (st->outSingle.length() + st->outRange.length() * 2) > maxTransitions)
++ return true;
++ return false;
++}
++
+ bool IpGotoCodeGen::useAgainLabel()
+ {
+- return redFsm->anyRegActionRets() ||
++ return useTransInAgainLabel() ||
++ redFsm->anyRegActionRets() ||
+ redFsm->anyRegActionByValControl() ||
+ redFsm->anyRegNextStmt();
+ }
+@@ -243,6 +254,18 @@
+ return out;
+ }
+
++int IpGotoCodeGen::TRANS_NR( RedTransAp *trans )
++{
++ if ( trans->action != 0 ) {
++ /* Go to the transition which will go to the state. */
++ return trans->id + redFsm->stateList.length();
++ }
++ else {
++ /* Go directly to the target state. */
++ return trans->targ->id;
++ }
++}
++
+ std::ostream &IpGotoCodeGen::EXIT_STATES()
+ {
+ for ( RedStateList::Iter st = redFsm->stateList; st.lte(); st++ ) {
+@@ -258,6 +281,13 @@
+ std::ostream &IpGotoCodeGen::AGAIN_CASES()
+ {
+ for ( RedStateList::Iter st = redFsm->stateList; st.lte(); st++ ) {
++ if ( useTransInAgainLabel() )
++ for ( int it = 0; it < st->numInTrans; it++ ) {
++ RedTransAp *trans = st->inTrans[it];
++ if ( trans->action != 0 && trans->labelNeeded )
++ out <<
++ "\t\tcase " << (trans->id + redFsm->stateList.length()) << ": goto tr" << trans->id << ";\n";
++ }
+ out <<
+ " case " << st->id << ": goto st" << st->id << ";\n";
+ }
+@@ -409,7 +439,6 @@
+ out <<
+ " " << P() << " += 1;\n";
+ }
+-
+ out << "_resume:\n";
+ }
+
+--- ragel/cdipgoto.h
++++ ragel/cdipgoto.h
+@@ -40,6 +40,7 @@
+
+ std::ostream &EXIT_STATES();
+ std::ostream &TRANS_GOTO( RedTransAp *trans, int level );
++ int TRANS_NR( RedTransAp *trans );
+ std::ostream &FINISH_CASES();
+ std::ostream &AGAIN_CASES();
+
+@@ -58,6 +59,7 @@
+ virtual void writeExec();
+
+ protected:
++ bool useTransInAgainLabel();
+ bool useAgainLabel();
+
+ /* Called from GotoCodeGen::STATE_GOTOS just before writing the gotos for
+--- ragel/main.cpp
++++ ragel/main.cpp
+@@ -83,6 +83,8 @@
+ /* Target language and output style. */
+ CodeStyle codeStyle = GenTables;
+
++long maxTransitions = LONG_MAX;
++
+ int numSplitPartitions = 0;
+ bool noLineDirectives = false;
+
+@@ -139,6 +140,7 @@
+ " -G1 Faster goto-driven FSM\n"
+ "code style: (C/D)\n"
+ " -G2 Really fast goto-driven FSM\n"
++" -GT2 Really fast goto-driven FSM with table-driven fallback\n"
+ " -P<N> N-Way Split really fast goto-driven FSM\n"
+ ;
+
+@@ -407,7 +409,10 @@
+ codeStyle = GenFGoto;
+ else if ( pc.paramArg[0] == '2' )
+ codeStyle = GenIpGoto;
+- else {
++ else if ( pc.paramArg[0] == 'T' && pc.paramArg[1] == '2' ) {
++ codeStyle = GenIpGoto;
++ maxTransitions = 32;
++ } else {
+ error() << "-G" << pc.paramArg[0] <<
+ " is an invalid argument" << endl;
+ exit(1);
+--- ragel/ragel.h
++++ ragel/ragel.h
+@@ -109,6 +109,8 @@
+ extern int numSplitPartitions;
+ extern bool noLineDirectives;
+
++extern long maxTransitions;
++
+ std::ostream &error();
+
+ /* Target language and output style. */
Property changes on: deps/third_party/ragel/01-ragel-6.7.GT2.patch
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « no previous file | deps/third_party/ragel/COPYING » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698