@@ -89,7 +89,7 @@ namespace Pome {
8989
9090 void VM::markRoots () {
9191 for (int i = 0 ; i < stackTop; ++i) {
92- stack. at (i) .mark (gc);
92+ stack[i] .mark (gc);
9393 }
9494 for (auto & arg : args) {
9595 arg.mark (gc);
@@ -160,6 +160,7 @@ namespace Pome {
160160 PomeValue* K;
161161 uint32_t * ip;
162162 int frameBase;
163+ PomeValue* R;
163164
164165
165166 // Decoded operands (Must be local to prevent corruption in recursive calls)
@@ -175,9 +176,10 @@ namespace Pome {
175176 if (frameBase + 512 >= (int )stack.size ()) { \
176177 stack.resize (stack.size () * 2 ); \
177178 } \
179+ R = stack.data () + frameBase; \
178180 stackTop = frameBase + 256
179181
180- #define R (i ) stack.at(frameBase + (i))
182+ #define R (i ) R[(i)]
181183
182184 #define SAVE_FRAME () \
183185 currentFrame->ip = ip
@@ -1231,9 +1233,9 @@ namespace Pome {
12311233 nextFrame->ip = method->chunk ->code .data ();
12321234 nextFrame->base = frameBase + a + 3 ;
12331235 nextFrame->destReg = a;
1234- stack. at ( nextFrame->base ) = PomeValue (method);
1235- stack. at ( nextFrame->base + 1 ) = v1;
1236- stack. at ( nextFrame->base + 2 ) = v2;
1236+ stack[ nextFrame->base ] = PomeValue (method);
1237+ stack[ nextFrame->base + 1 ] = v1;
1238+ stack[ nextFrame->base + 2 ] = v2;
12371239 REFRESH_FRAME ();
12381240 DISPATCH ();
12391241 } else {
@@ -1290,9 +1292,9 @@ namespace Pome {
12901292 nextFrame->ip = method->chunk ->code .data ();
12911293 nextFrame->base = frameBase + a + 3 ;
12921294 nextFrame->destReg = a;
1293- stack. at ( nextFrame->base ) = PomeValue (method);
1294- stack. at ( nextFrame->base + 1 ) = v1;
1295- stack. at ( nextFrame->base + 2 ) = v2;
1295+ stack[ nextFrame->base ] = PomeValue (method);
1296+ stack[ nextFrame->base + 1 ] = v1;
1297+ stack[ nextFrame->base + 2 ] = v2;
12961298 REFRESH_FRAME ();
12971299 DISPATCH ();
12981300 } else {
@@ -1349,9 +1351,9 @@ namespace Pome {
13491351 nextFrame->ip = method->chunk ->code .data ();
13501352 nextFrame->base = frameBase + a + 3 ;
13511353 nextFrame->destReg = a;
1352- stack. at ( nextFrame->base ) = PomeValue (method);
1353- stack. at ( nextFrame->base + 1 ) = v1;
1354- stack. at ( nextFrame->base + 2 ) = v2;
1354+ stack[ nextFrame->base ] = PomeValue (method);
1355+ stack[ nextFrame->base + 1 ] = v1;
1356+ stack[ nextFrame->base + 2 ] = v2;
13551357 REFRESH_FRAME ();
13561358 DISPATCH ();
13571359 } else {
@@ -1413,9 +1415,9 @@ namespace Pome {
14131415 nextFrame->ip = method->chunk ->code .data ();
14141416 nextFrame->base = frameBase + a + 3 ;
14151417 nextFrame->destReg = a;
1416- stack. at ( nextFrame->base ) = PomeValue (method);
1417- stack. at ( nextFrame->base + 1 ) = v1;
1418- stack. at ( nextFrame->base + 2 ) = v2;
1418+ stack[ nextFrame->base ] = PomeValue (method);
1419+ stack[ nextFrame->base + 1 ] = v1;
1420+ stack[ nextFrame->base + 2 ] = v2;
14191421 REFRESH_FRAME ();
14201422 DISPATCH ();
14211423 } else {
@@ -1524,8 +1526,8 @@ namespace Pome {
15241526 nextFrame->ip = method->chunk ->code .data ();
15251527 nextFrame->base = frameBase + a + 2 ;
15261528 nextFrame->destReg = a;
1527- stack. at ( nextFrame->base ) = PomeValue (method);
1528- stack. at ( nextFrame->base + 1 ) = v1;
1529+ stack[ nextFrame->base ] = PomeValue (method);
1530+ stack[ nextFrame->base + 1 ] = v1;
15291531 REFRESH_FRAME ();
15301532 DISPATCH ();
15311533 } else {
@@ -1619,9 +1621,9 @@ namespace Pome {
16191621 nextFrame->ip = method->chunk ->code .data ();
16201622 nextFrame->base = frameBase + a + 3 ;
16211623 nextFrame->destReg = a;
1622- stack. at ( nextFrame->base ) = PomeValue (method);
1623- stack. at ( nextFrame->base + 1 ) = v1;
1624- stack. at ( nextFrame->base + 2 ) = v2;
1624+ stack[ nextFrame->base ] = PomeValue (method);
1625+ stack[ nextFrame->base + 1 ] = v1;
1626+ stack[ nextFrame->base + 2 ] = v2;
16251627 REFRESH_FRAME ();
16261628 DISPATCH ();
16271629 } else {
@@ -1773,14 +1775,15 @@ namespace Pome {
17731775 // Automatically strip 'self' for module functions called as methods
17741776 if (func->module && !func->klass && argCount == (int )func->parameters .size () + 1 ) {
17751777 for (int i = 0 ; i < (int )func->parameters .size (); ++i) {
1776- stack. at ( nextFrameBase + 1 + i) = stack. at ( nextFrameBase + 2 + i) ;
1778+ stack[ nextFrameBase + 1 + i] = stack[ nextFrameBase + 2 + i] ;
17771779 }
17781780 argCount--;
17791781 }
17801782
17811783 // Zero out registers for the new frame (avoid garbage from previous calls)
1782- for (int i = argCount + 1 ; i < 256 ; ++i) {
1783- stack.at (nextFrameBase + i) = PomeValue ();
1784+ int maxRegs = func->chunk ? func->chunk ->maxRegisters : 64 ;
1785+ for (int i = argCount + 1 ; i < maxRegs; ++i) {
1786+ stack[nextFrameBase + i] = PomeValue ();
17841787 }
17851788
17861789 if (argCount < (int )func->parameters .size ()) {
@@ -1886,7 +1889,8 @@ namespace Pome {
18861889 for (int i = 0 ; i <= nArgs; ++i) R (i) = R (a + i);
18871890
18881891 // Zero out remaining registers in the frame
1889- for (int i = nArgs + 1 ; i < 256 ; ++i) R (i) = PomeValue ();
1892+ int maxRegs = func->chunk ? func->chunk ->maxRegisters : 64 ;
1893+ for (int i = nArgs + 1 ; i < maxRegs; ++i) R (i) = PomeValue ();
18901894 currentFrame->function = func; currentFrame->module = func->module ;
18911895 currentFrame->chunk = func->chunk .get ();
18921896 currentFrame->ip = func->chunk ->code .data ();
@@ -2009,9 +2013,9 @@ namespace Pome {
20092013 nf->ip = nextMethod->chunk ->code .data ();
20102014 nf->base = stackTop;
20112015 nf->destReg = a;
2012- stack. at ( nf->base ) = PomeValue (nextMethod);
2013- stack. at ( nf->base + 1 ) = iterObj;
2014- stack. at ( nf->base + 2 ) = R (b + 1 );
2016+ stack[ nf->base ] = PomeValue (nextMethod);
2017+ stack[ nf->base + 1 ] = iterObj;
2018+ stack[ nf->base + 2 ] = R (b + 1 );
20152019 REFRESH_FRAME ();
20162020 DISPATCH ();
20172021 } else R (a) = PomeValue ();
@@ -2258,8 +2262,8 @@ namespace Pome {
22582262 nextFrame->ip = iterMethod->chunk ->code .data ();
22592263 nextFrame->base = stackTop;
22602264 nextFrame->destReg = a;
2261- stack. at ( nextFrame->base ) = PomeValue (iterMethod);
2262- stack. at ( nextFrame->base + 1 ) = obj;
2265+ stack[ nextFrame->base ] = PomeValue (iterMethod);
2266+ stack[ nextFrame->base + 1 ] = obj;
22632267 REFRESH_FRAME ();
22642268 DISPATCH ();
22652269 } else {
0 commit comments