getconstant_hを入れてみた。
@@ -123,8 +123,8 @@ | ||
123 | 123 | { |
124 | 124 | const PObject *item = (*glocal)[goal.idx]; |
125 | 125 | if ( item == 0 ) { |
126 | - const PObject *p = horn.getval2(c, c->hl); | |
127 | - if ( p->isc() ) { | |
126 | + const PObject *p = horn.getconstant_h(c); | |
127 | + if ( p ) { | |
128 | 128 | (*glocal)[goal.idx] = p; |
129 | 129 | return true; |
130 | 130 | } |
@@ -171,9 +171,12 @@ | ||
171 | 171 | } |
172 | 172 | } |
173 | 173 | } else if ( hval != 0 ) { |
174 | - const PObject *p = hval->getval2(c, c->hl); | |
175 | - (*glocal)[goal.idx] = p; | |
176 | - if ( p->isc() ) return true; | |
174 | + const PObject *p = hval->getconstant_h(c); | |
175 | + if ( p ) { | |
176 | + // ホーン→ゴールは定数(またはワイルドカード)なら渡す。変数なら後で代入する。 | |
177 | + (*glocal)[goal.idx] = p; | |
178 | + return true; | |
179 | + } | |
177 | 180 | } |
178 | 181 | |
179 | 182 | c->afterunify.push_back(c->uidx); |
@@ -586,6 +589,21 @@ | ||
586 | 589 | return lo ? lo : this; |
587 | 590 | } |
588 | 591 | |
592 | +const PObject *PList::getconstant_h( ExecContext *c) const | |
593 | +{ | |
594 | + if ( constant ) return this; | |
595 | + PList *lo = 0; | |
596 | + const PObject *l = lvalue->getconstant_h(c); | |
597 | + const PObject *r = rvalue->getconstant_h(c); | |
598 | + | |
599 | + if ( !l || !r ) return 0; | |
600 | + if ( !l->isc() || !r->isc() ) return 0; | |
601 | + | |
602 | + assert( l != lvalue || r != rvalue); | |
603 | + lo = pmm.newPList(c->pobjs, const_cast<PObject*>(l), const_cast<PObject*>(r)); | |
604 | + return lo; | |
605 | +} | |
606 | + | |
589 | 607 | void PList::mark_hlocal(ExecContext *c, Array<bool> &marker) const |
590 | 608 | { |
591 | 609 | if ( constant ) return; |
@@ -630,6 +648,26 @@ | ||
630 | 648 | return po ? po : this; |
631 | 649 | } |
632 | 650 | |
651 | +const PObject *PArray::getconstant_h( ExecContext *c) const | |
652 | +{ | |
653 | + if ( constant ) return this; | |
654 | + PArray *po = 0; | |
655 | + for ( PObjectArray::const_iterator i = value.begin(); i < value.end(); i++ ) { | |
656 | + const PObject *p = (*i)->getconstant_h( c); | |
657 | + if ( p == 0 ) return 0; | |
658 | + if ( p != *i && po == 0 ) { | |
659 | + po = pmm.newPArray(c->pobjs, *this); | |
660 | + po->constant = true; | |
661 | + } | |
662 | + if ( po ) { | |
663 | + po->value[i - value.begin()] = p; | |
664 | + po->constant = po->constant && p->isc(); | |
665 | + if ( !po->constant ) return 0; | |
666 | + } | |
667 | + } | |
668 | + return po ? po : this; | |
669 | +} | |
670 | + | |
633 | 671 | void PArray::mark_hlocal(ExecContext *c, Array<bool> &marker) const |
634 | 672 | { |
635 | 673 | if ( constant ) return; |
@@ -670,6 +708,22 @@ | ||
670 | 708 | return this; |
671 | 709 | } |
672 | 710 | |
711 | +const PObject *PPredicate::getconstant_h( ExecContext *c) const | |
712 | +{ | |
713 | + if ( constant ) return this; | |
714 | + | |
715 | + const PObject *no = name->getconstant_h(c); | |
716 | + if ( !no ) return 0; | |
717 | + const PArray *ao = dynamic_cast<const PArray *>(arglist.getconstant_h( c)); | |
718 | + if ( !ao ) return 0; | |
719 | + if ( no != name || ao != &arglist ) { | |
720 | + PPredicate *po = pmm.newPPredicate(c->pobjs,nspace,no,ao,opt); | |
721 | + return po; | |
722 | + } | |
723 | + | |
724 | + return this; | |
725 | +} | |
726 | + | |
673 | 727 | void PPredicate::mark_hlocal(ExecContext *c, Array<bool> &marker) const |
674 | 728 | { |
675 | 729 | name->mark_hlocal(c, marker); |
@@ -700,6 +754,17 @@ | ||
700 | 754 | } |
701 | 755 | } |
702 | 756 | |
757 | +const PObject *PVeriable::getconstant_h( ExecContext *c) const | |
758 | +{ | |
759 | + assert( idx < c->gl->size()); | |
760 | + const PObject *item = (*c->hl)[idx]; | |
761 | + if ( item == 0 ) { | |
762 | + return 0; | |
763 | + } else { | |
764 | + return item->getval(c); | |
765 | + } | |
766 | +} | |
767 | + | |
703 | 768 | void PVeriable::mark_hlocal(ExecContext *c, Array<bool> &marker) const |
704 | 769 | { |
705 | 770 | marker[idx] = true; |
@@ -709,6 +774,17 @@ | ||
709 | 774 | const PObject *PEVeriable::getval( ExecContextRoot *c) const { return GetValsOne<const PObject *>( *this, c, vl, &PObject::getval, this); } |
710 | 775 | const PObject *PEVeriable::getval2( ExecContextRoot *c, VLocal *) const { return GetValsTwo<const PObject *>( *this, c, vl, vl, &PObject::getval2, this); } |
711 | 776 | |
777 | +const PObject *PEVeriable::getconstant_h( ExecContext *c) const | |
778 | +{ | |
779 | + assert( idx < c->gl->size()); | |
780 | + const PObject *item = (*vl)[idx]; | |
781 | + if ( item == 0 ) { | |
782 | + return 0; | |
783 | + } else { | |
784 | + return item->getval(c); | |
785 | + } | |
786 | +} | |
787 | + | |
712 | 788 | void PEVeriable::mark_hlocal(ExecContext *c, Array<bool> &marker) const |
713 | 789 | { |
714 | 790 | if ( vl == c->hl ) { |
@@ -199,6 +199,9 @@ | ||
199 | 199 | virtual const PObject *getval( ExecContextRoot *) const { return this; } |
200 | 200 | virtual const PObject *getval2( ExecContextRoot *, VLocal *) const { return this; } |
201 | 201 | |
202 | + // 値の取得(match時に使用、PEVariableは作成しない。その場合は0を返す。) | |
203 | + virtual const PObject *getconstant_h( ExecContext *c ) const { return this; }; | |
204 | + | |
202 | 205 | // 変数の追跡(cutで使用) |
203 | 206 | virtual void mark_hlocal( ExecContext *, Array<bool> &marker) const {}; |
204 | 207 |
@@ -912,6 +915,9 @@ | ||
912 | 915 | virtual const PObject *getval( ExecContextRoot *) const; |
913 | 916 | virtual const PObject *getval2( ExecContextRoot *c, VLocal *vlocal) const; |
914 | 917 | |
918 | + // 値の取得(match時に使用、PEVariableは作成しない。その場合は0を返す。) | |
919 | + virtual const PObject *getconstant_h( ExecContext *c ) const ; | |
920 | + | |
915 | 921 | // 変数の追跡(cutで使用) |
916 | 922 | virtual void mark_hlocal( ExecContext *c, Array<bool> &marker) const; |
917 | 923 |
@@ -1233,6 +1239,9 @@ | ||
1233 | 1239 | virtual const PObject *getval( ExecContextRoot *c) const; |
1234 | 1240 | virtual const PObject *getval2( ExecContextRoot *c, VLocal *vlocal) const; |
1235 | 1241 | |
1242 | + // 値の取得(match時に使用、PEVariableは作成しない。その場合は0を返す。) | |
1243 | + virtual const PObject *getconstant_h( ExecContext *c ) const ; | |
1244 | + | |
1236 | 1245 | // 変数の追跡(cutで使用) |
1237 | 1246 | virtual void mark_hlocal( ExecContext *c, Array<bool> &marker) const; |
1238 | 1247 |
@@ -1482,6 +1491,9 @@ | ||
1482 | 1491 | virtual const PObject *getval( ExecContextRoot *c) const; |
1483 | 1492 | virtual const PObject *getval2( ExecContextRoot *c, VLocal *vlocal) const; |
1484 | 1493 | |
1494 | + // 値の取得(match時に使用、PEVariableは作成しない。その場合は0を返す。) | |
1495 | + virtual const PObject *getconstant_h( ExecContext *c ) const ; | |
1496 | + | |
1485 | 1497 | // 変数の追跡(cutで使用) |
1486 | 1498 | virtual void mark_hlocal( ExecContext *c, Array<bool> &marker) const; |
1487 | 1499 |
@@ -1604,6 +1616,9 @@ | ||
1604 | 1616 | virtual const PObject *getval( ExecContextRoot *c) const ; |
1605 | 1617 | virtual const PObject *getval2( ExecContextRoot *c, VLocal *vlocal) const ; |
1606 | 1618 | |
1619 | + // 値の取得(match時に使用、PEVariableは作成しない。その場合は0を返す。) | |
1620 | + virtual const PObject *getconstant_h( ExecContext *c ) const ; | |
1621 | + | |
1607 | 1622 | // 変数の追跡(cutで使用) |
1608 | 1623 | virtual void mark_hlocal( ExecContext *c, Array<bool> &marker) const; |
1609 | 1624 |
@@ -1820,6 +1835,9 @@ | ||
1820 | 1835 | virtual const PObject *getval( ExecContextRoot *c) const; |
1821 | 1836 | virtual const PObject *getval2( ExecContextRoot *c, VLocal *) const; |
1822 | 1837 | |
1838 | + // 値の取得(match時に使用、PEVariableは作成しない。その場合は0を返す。) | |
1839 | + virtual const PObject *getconstant_h( ExecContext *c ) const ; | |
1840 | + | |
1823 | 1841 | // 変数の追跡(cutで使用) |
1824 | 1842 | virtual void mark_hlocal( ExecContext *c, Array<bool> &marker) const; |
1825 | 1843 |
@@ -23,12 +23,12 @@ | ||
23 | 23 | |
24 | 24 | // 定数 |
25 | 25 | #ifdef ___X64____ |
26 | -#define VERSION_TEXT "ADP Ver 0.82.0298 X64 (http://www.adp.la/)\nCopyright (C) 2010-2012 Katsuhisa Ohfuji. This progman is distributed under GPL.\n" | |
26 | +#define VERSION_TEXT "ADP Ver 0.82.0300 X64 (http://www.adp.la/)\nCopyright (C) 2010-2012 Katsuhisa Ohfuji. This progman is distributed under GPL.\n" | |
27 | 27 | #else |
28 | 28 | #if _WIN32 |
29 | -#define VERSION_TEXT "ADP Ver 0.82.0298 x86 (http://www.adp.la/)\nCopyright (C) 2010-2012 Katsuhisa Ohfuji. This progman is distributed under GPL.\n" | |
29 | +#define VERSION_TEXT "ADP Ver 0.82.0300 x86 (http://www.adp.la/)\nCopyright (C) 2010-2012 Katsuhisa Ohfuji. This progman is distributed under GPL.\n" | |
30 | 30 | #else |
31 | -#define VERSION_TEXT "ADP Ver 0.82.0298 (http://www.adp.la/)\nCopyright (C) 2010-2012 Katsuhisa Ohfuji. This progman is distributed under GPL.\n" | |
31 | +#define VERSION_TEXT "ADP Ver 0.82.0300 (http://www.adp.la/)\nCopyright (C) 2010-2012 Katsuhisa Ohfuji. This progman is distributed under GPL.\n" | |
32 | 32 | #endif |
33 | 33 | #endif |
34 | 34 |