static p_file * mpy_on_include(const char *filename, int fullparse) { mpy_fopen_t *f = 0; long len = 0; if (!mpy_parallel) return p_fopen(filename, "r"); /* refuse to reopen file for debug line numbers when parallel */ if (!fullparse) return 0; if (mpy_rank == 0) { p_file *file = p_fopen(filename, "r"); long sz = file? p_fsize(file) : 0; char *txt; long dims[2]; if (file) len = strlen(filename); dims[0] = 1; dims[1] = len + 1 + sz; ypush_check(1); /* may be called outside any interpreted function */ txt = ypush_c(dims); if (len) { strcpy(txt, filename); txt += len + 1; if (p_fread(file, txt, sz) != sz) { yarg_drop(1); y_errorq("rank 0 cannot read include file %s", filename); return 0; } } else { txt[0] = '\0'; } } mpy_bcast(1); /* broadcast top of stack to all ranks */ if (mpy_rank > 0) { /* set filename, file contents on all non-0 ranks */ long sz = 0; filename = ygeta_c(0, &sz, (long *)0); len = strlen(filename); } mpy_bcast(0); /* send acknowledgement back to rank 0 */ if (!len) return 0; f = p_malloc(sizeof(mpy_fopen_t)); f->ops = &mpy_fopen_ops; f->array = yget_use(0); f->addr = len + 1; yarg_drop(1); return (p_file *)f; }
void gy_value_push(GValue * pval, GITypeInfo * info, gy_Object* o) { GITypeTag tag = g_type_info_get_tag(info); GY_DEBUG("Pushing %s from GValue\n", g_type_tag_to_string(tag)); switch (tag) { /* basic types */ case GI_TYPE_TAG_VOID:{ GITypeInfo * cellinfo = g_type_info_get_param_type(info, 0); if (cellinfo) { GITypeTag ctag = g_type_info_get_tag(cellinfo); GY_DEBUG("void contains %s\n", g_type_tag_to_string(ctag)); g_base_info_unref(cellinfo); } ypush_nil(); break;} case GI_TYPE_TAG_BOOLEAN: *ypush_c(NULL) = g_value_get_boolean(pval); break; case GI_TYPE_TAG_INT8: *ypush_gint8(NULL) = g_value_get_schar(pval); break; case GI_TYPE_TAG_UINT8: *ypush_guint8(NULL)= g_value_get_uchar(pval); break; case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_INT32: *ypush_gint32(NULL) = g_value_get_int(pval); break; case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_UINT32: *ypush_guint32(NULL) = g_value_get_uint(pval); break; case GI_TYPE_TAG_INT64: ypush_long(g_value_get_int64(pval)); break; case GI_TYPE_TAG_UINT64: ypush_long(g_value_get_uint64(pval)); break; case GI_TYPE_TAG_FLOAT: *ypush_f(NULL)=g_value_get_float(pval); break; case GI_TYPE_TAG_DOUBLE: ypush_double(g_value_get_double(pval)); break; case GI_TYPE_TAG_GTYPE: ypush_long(g_value_get_gtype(pval)); break; case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: *ypush_q(NULL) = p_strcpy(g_value_get_string(pval)); break; /* array types */ case GI_TYPE_TAG_ARRAY: y_error("array"); break; /* interface types */ case GI_TYPE_TAG_INTERFACE: { GIBaseInfo * itrf = g_type_info_get_interface (info); switch(g_base_info_get_type (itrf)) { case GI_INFO_TYPE_ENUM: ypush_long(g_value_get_enum(pval)); g_base_info_unref(itrf); break; case GI_INFO_TYPE_OBJECT: { GObject * prop=g_value_get_object(pval); g_object_ref_sink(prop); if (!prop) { g_base_info_unref(itrf); y_error("get property failed"); } GY_DEBUG("pushing result... "); ypush_check(1); gy_Object * out = ypush_gy_Object(); out->info=itrf; out->object=prop; out->repo=o->repo; } break; default: g_base_info_unref(itrf); y_error ("fix me: only properties of type object supported yet"); } break; } default: y_error("Unimplemented"); } }
/* modified main calls mpy_on_launch instead of on_launch */ int mpy_on_launch(int argc, char *argv[]) { /* codger creates yinit.c:on_launch, which calls std0.c:y_launch */ char *txt; int ret; mpy_initialize(&argc, &argv); if (!mpy_size) return on_launch(argc, argv); /* on_launch is collective operation, because it queries filesystem * to find path for .i files */ if (!mpy_rank) { long i; /* broadcast yLaunchDir, ySiteDir, yHomeDir, defaultPath */ long dims[2]; int batflag = (argc>1) && !strcmp(argv[1],"-batch"); /* lie about arguments for startup, will put back command line later */ ret = on_launch(batflag?2:(argc?1:0), argv); if (batflag) { if (argc > 2) { /* mpy_initialize already saved -batch script name */ for (i=3 ; i<argc ; i++) argv[i-2] = argv[i]; argc -= 2; } else { argc = 1; } } /* now that on_launch/y_launch done, put back true command line */ ym_argc = argc; ym_argv = argv; dims[0] = 1; dims[1] = STRLEN_P_1(yLaunchDir) + STRLEN_P_1(ySiteDir) + STRLEN_P_1(yHomeDir) + STRLEN_P_1(y_user_dir) + STRLEN_P_1(y_gist_dir); ypush_check(1); /* we are outside any interpreted function */ txt = ypush_c(dims); STRCPY_TXT(yLaunchDir); STRCPY_TXT(ySiteDir); STRCPY_TXT(yHomeDir); STRCPY_TXT(y_user_dir); STRCPY_TXT(y_gist_dir); mpy_bcast(1); } else { extern void Y_set_site(int); /* need to call on_launch to initialize interpreter for mpy_bcast */ ret = on_launch(2, mpy_fake_argv); mpy_bcast(1); txt = ygeta_c(0, (long *)0, (long *)0); if (!txt[0]) txt++, yLaunchDir = 0; else yLaunchDir = p_strcpy(txt), txt += strlen(txt)+1; if (!txt[0]) txt++, ySiteDir = 0; else ySiteDir = p_strcpy(txt), txt += strlen(txt)+1; if (!txt[0]) txt++, yHomeDir = 0; else yHomeDir = p_strcpy(txt), txt += strlen(txt)+1; if (!txt[0]) txt++, y_user_dir = 0; else y_user_dir = p_strcpy(txt); if (!txt[0]) txt++, y_gist_dir = 0; else y_gist_dir = p_strcpy(txt); Y_set_site(0); } yarg_drop(1); /* after on_launch, virtual machine initialized, startup .i files * (including mpy.i) are queued by name but not yet opened, and * batch mode has been set if -batch argv */ /* replace on_include with parallel version, set parallel flag */ ycall_on_include(mpy_on_include); mpy_parallel = 1; /* disable autoload */ if (!mpy0_eval_auto) { mpy0_eval_auto = auto_ops.Eval; auto_ops.Eval = mpy_eval_auto; } return ret; }