blob: 3e5999c34b96208d17228592fb4b747bdd5e00fe [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Alexander Astapchuk
*/
#include "jframe.h"
/**
* @file
* @brief Implementation of JFrame.
*/
namespace Jitrino {
namespace Jet {
void JFrame::push(jtype jt)
{
assert(m_top<(int)max_size());
if (jt < i32) {
jt = i32;
}
switch (jt) {
case i8:
case i16:
case u16:
case i32:
case jobj:
m_stack[++m_top] = Val(jt);
break;
case i64:
m_stack[++m_top] = Val(jt);
m_stack[++m_top] = Val(jt);
break;
case flt32:
m_stack[++m_top] = Val(jt);
break;
case dbl64:
m_stack[++m_top] = Val(jt);
m_stack[++m_top] = Val(jt);
break;
default:
assert( jt == jretAddr );
m_stack[++m_top] = Val(jt);
break;
}
}
void JFrame::pop(jtype jt)
{
// cant pop on empty stack
assert(m_top>=0);
if (jt < i32) {
jt = i32;
}
assert(top() == jt);
switch(jt) {
case i8:
case i16:
case u16:
case i32:
case jobj: --m_top; break;
case flt32: --m_top; break;
case i64: m_top -= 2; break;
case dbl64: m_top -= 2; break;
default:
assert(jt == jretAddr);
--m_top;
break;
}
}
void JFrame::pop2(void)
{
if (top() == i64 || top() == dbl64) {
pop(top());
}
else {
pop(top());
assert(top() != i64 && top() != dbl64);
pop(top());
}
}
void JFrame::pop_n(const ::std::vector<jtype>& args)
{
for (unsigned i=0; i<args.size(); i++) {
pop(args[(args.size()-i-1)]);
}
}
};}; // ~namespace Jitrino::Jet