⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gbx_exec_pop.c

📁 Gambas is a graphical development environment based on a Basic interpreter, like Visual Basic. It us
💻 C
字号:
/***************************************************************************  exec_pop.c  Read values from stack and put them in memory  (c) 2000-2004 Beno顃 Minisini <gambas@users.sourceforge.net>  This program is free software; you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by  the Free Software Foundation; either version 1, or (at your option)  any later version.  This program is distributed in the hope that it will be useful,  but WITHOUT ANY WARRANTY; without even the implied warranty of  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  GNU General Public License for more details.  You should have received a copy of the GNU General Public License  along with this program; if not, write to the Free Software  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.***************************************************************************/#include "gb_common.h"#include "gb_limit.h"#include "gbx_exec.h"#include "gbx_string.h"#include "gbx_object.h"#include "gbx_array.h"#include "gbx_c_collection.h"PUBLIC void EXEC_pop_unknown(void){  static void *jump[6] = {    /* 0 */ &&_POP_GENERIC,    /* 1 */ &&_POP_VARIABLE,    /* 2 */ &&_POP_STATIC_VARIABLE,    /* 3 */ &&_POP_PROPERTY,    /* 4 */ &&_POP_VARIABLE_AUTO,    /* 5 */ &&_POP_PROPERTY_AUTO    };  const char *name;  long index;  CLASS_DESC *desc;  CLASS *class;  OBJECT *object;  char *addr;  boolean defined;  EXEC_object(&SP[-1], &class, &object, &defined);  /*printf("> exec_pop_unknown: SP = %p -> %p\n", SP, SP->_string.addr);*/  goto *jump[*PC & 0xF];_POP_GENERIC:  name = CP->load->unknown[PC[1]];  index = CLASS_find_symbol(class, name);  if (index == NO_SYMBOL)    THROW(E_NSYMBOL, name, class->name);  desc = class->table[index].desc;  switch (CLASS_DESC_get_type(desc))  {    case CD_CONSTANT:      THROW(E_NPROPERTY, class->name, name);    case CD_VARIABLE:      if (object == NULL)      {        if (!class->auto_create)          THROW(E_DYNAMIC, class->name, name);        object = EXEC_auto_create(class);        *PC |= 4;      }      else      {        if (defined) *PC |= 1;      }      if (defined)        PC[1] = index;      goto _POP_VARIABLE_2;    case CD_STATIC_VARIABLE:      if (object != NULL)        THROW(E_STATIC, class->name, name);      if (defined) *PC |= 2;      if (defined)        PC[1] = index;      goto _POP_STATIC_VARIABLE_2;    case CD_PROPERTY:      if (object == NULL)      {        if (!class->auto_create)          THROW(E_DYNAMIC, class->name, name);        object = EXEC_auto_create(class);        *PC |= 5;      }      else      {        if (defined) *PC |= 3;      }      if (defined)        PC[1] = index;      goto _POP_PROPERTY_2;    case CD_STATIC_PROPERTY:      if (object != NULL)        THROW(E_STATIC, class->name, name);      if (defined) *PC |= 3;      if (defined)        PC[1] = index;      goto _POP_PROPERTY_2;    case CD_PROPERTY_READ:    case CD_STATIC_PROPERTY_READ:      THROW(E_NWRITE, class->name, name);    case CD_METHOD:    case CD_STATIC_METHOD:      THROW(E_NPROPERTY, class->name, name);    default:      THROW(E_NSYMBOL, name, class->name);  }_POP_VARIABLE_AUTO:  object = EXEC_auto_create(class);_POP_VARIABLE:  desc = class->table[PC[1]].desc;_POP_VARIABLE_2:  addr = (char *)object + desc->variable.offset;  VALUE_write(&SP[-2], (void *)addr, desc->variable.type);  goto _FIN;_POP_STATIC_VARIABLE:  desc = class->table[PC[1]].desc;_POP_STATIC_VARIABLE_2:  addr = (char *)class->stat + desc->variable.offset;  VALUE_write(&SP[-2], (void *)addr, desc->variable.type);  goto _FIN;_POP_PROPERTY_AUTO:  object = EXEC_auto_create(class);_POP_PROPERTY:  desc = class->table[PC[1]].desc;_POP_PROPERTY_2:  VALUE_conv(&SP[-2], desc->property.type);  if (desc->property.native)  {    if (EXEC_call_native(desc->property.write, object, 0, &SP[-2]))      PROPAGATE();  }  else  {    *SP = SP[-2];    BORROW(SP);    SP++;    EXEC.class = desc->property.class;    EXEC.object = object;    EXEC.drop = FALSE;    EXEC.nparam = 1;    EXEC.native = FALSE;    EXEC.index = (long)desc->property.write;    EXEC_function();  }_FIN:  RELEASE(&SP[-2]);  OBJECT_UNREF(&object, "EXEC_pop_unknown");  SP -= 2;  PC++;}PUBLIC void EXEC_pop_array(void){  CLASS *class;  OBJECT *object;  GET_NPARAM(np);  long dim[MAX_ARRAY_DIM];  int i;  void *data;  boolean defined;  VALUE *val;  VALUE swap;  val = &SP[-np];  if (val->type == T_ARRAY)  {    np--;    for (i = 1; i <= np; i++)    {      VALUE_conv(&val[i], T_INTEGER);      dim[i - 1] = val[i]._integer.value;    }    SP -= np + 1;    data = ARRAY_get_address((ARRAY_DESC *)SP->_array.desc, SP->_array.addr, np, dim);    VALUE_write(SP - 1, data, ((ARRAY_DESC *)SP->_array.desc)->type);    POP();  }  else  {    EXEC_object(val, &class, &object, &defined);    /* Ex閏ution de la m閠hode sp閏iale _put */    /*SP += np;    if (EXEC_special(SPEC_PUT, class, object, np + 1, FALSE))      THROW(E_NARRAY, class->name);*/    /* remplace l'objet par la valeur 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -