static void accept_intrin (void) { SLFile_FD_Type *f; Socket_Type *s, *s1; Domain_Methods_Type *methods; int nargs = SLang_Num_Function_Args; SLang_Ref_Type *refs[MAX_ACCEPT_REF_ARGS]; int i; if (nargs <= 0) { SLang_verror (SL_Usage_Error, "s1 = accept (s [,&v...])"); return; } if (-1 == SLroll_stack (-nargs)) return; if (NULL == (s = pop_socket (&f))) return; nargs--; if (nargs > MAX_ACCEPT_REF_ARGS) { SLang_verror (SL_NumArgs_Error, "accept: too many reference args"); SLfile_free_fd (f); } memset ((char *)refs, 0, sizeof (refs)); i = nargs; while (i != 0) { i--; if (-1 == SLang_pop_ref (refs+i)) goto free_return; } methods = s->methods; if (NULL != (s1 = (*methods->accept)(s, nargs, refs))) (void) push_socket (s1); /* frees it upon error */ /* drop */ free_return: for (i = 0; i < nargs; i++) { if (refs[i] != NULL) SLang_free_ref (refs[i]); } SLfile_free_fd (f); }
static void set_frame_variable (void) { char *name; int depth; if (-1 == SLroll_stack (3)) return; if (-1 == SLang_pop_slstring (&name)) return; if (0 == SLang_pop_int (&depth)) (void) _pSLang_set_frame_variable ((unsigned int) depth, name); SLang_free_slstring (name); }
static void bind_intrin (void) { Socket_Type *s; SLFile_FD_Type *f; int nargs = SLang_Num_Function_Args; Domain_Methods_Type *methods; if (-1 == SLroll_stack (-nargs)) return; if (NULL == (s = pop_socket (&f))) return; nargs--; methods = s->methods; (void)(*methods->bind)(s, nargs); SLfile_free_fd (f); }
static void qualifier_intrin (void) { int has_default; char *name; SLang_Struct_Type *q; SLang_Object_Type *objp; if (-1 == _pSLang_get_qualifiers (&q)) return; has_default = (SLang_Num_Function_Args == 2); if (has_default) { if (-1 == SLroll_stack (2)) return; } if (-1 == SLang_pop_slstring (&name)) return; if (q != NULL) objp = _pSLstruct_get_field_value (q, name); else objp = NULL; SLang_free_slstring (name); if (objp != NULL) { if (has_default) SLdo_pop (); _pSLpush_slang_obj (objp); } else if (has_default == 0) (void) SLang_push_null (); /* Note: objp and q should _not_ be freed since they were not allocated */ }
static void intrin_roll_stack (int *n) { SLroll_stack (*n); }