Patch title: Release 94 bulk changes
Abstract:
File: /pliant/graphic/browser/server/context.pli
Key:
    Removed line
    Added line
module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"

public

  type BrowserServerContext
    field Link:Stream connection
    field Int inside_para <- 0
    field Str url subpath
    field Link:Dictionary env
    field Link:Sem env_sem
    field Str user_name
    field CBool user_is_admin <- false ; field Int user_auth_level <- 0
    field Dictionary user_rights
    field Str current_section
    field Str event key
    field Float pointer_x pointer_y
    field Str pointer_section ; field Int pointer_index <- undefined
    field Str focus_section ; field Int focus_index <- undefined
    field CBool over_on over_off <- false

  type BrowserServerVariable
    field Arrow variable
    field Str data_path
    field DelayedAction run

  type BrowserServerSection
    field DelayedAction refresh
    field CBool inside <- false
    field Dictionary env

  type BrowserPendingThread
    field DelayedAction action
    field Link:Sem env_sem
    field Link:Dictionary env

  gvar Sem browser_thread_sem
  gvar (Dictionary Str BrowserPendingThread) browser_thread_dict


#-------------------------------------------------------------------------------


gvar Dictionary browser_server_instructions

named_expression browser_server_instruction_prototype
  function 'pliant browser server instruction function' context
    arg_rw BrowserServerContext context
    implicit context
      body

meta browser_server_instruction e
  if e:size>=2 and e:0:is_pure_ident and (e e:size-1):ident="{}"
    var Address mark := e:module mark
    var Link:Expression ee :> expression duplicate browser_server_instruction_prototype substitute parameters (e 1 e:size-2) substitute body (e e:size-1) substitute instruction (expression constant e:0:ident near e:0) near e
    error_push_record (var ErrorRecord er) error_filter_all
    ee compile
    if er:id<>error_id_noerror
      console er:message eol
      er id := error_id_noerror
      e suckup_error ee
    error_pull_record er
    var Link:Function f :> (pliant_general_dictionary first "pliant browser server instruction function") map Function
    e:module rewind mark
    if exists:f
      browser_server_instructions insert e:0:ident true addressof:f
      e set_void_result

export browser_server_instruction browser_server_instructions


#-------------------------------------------------------------------------------


gvar Dictionary browser_pages
gvar Sem browser_pages_sem

named_expression browser_page_prototype
  function 'pliant browser page function' context
    arg_rw BrowserServerContext context
    implicit context
      body

meta browser_page e
  if e:size=2 and (e:0 constant Str)<>null and e:1:ident="{}"
    var Address mark := e:module mark
    var Link:Expression ee :> expression duplicate browser_page_prototype substitute body e:1 near e
    error_push_record (var ErrorRecord er) error_filter_all
    ee compile
    if er:id<>error_id_noerror
      console er:message eol
      er id := error_id_noerror
      e suckup_error ee
    error_pull_record er
    var Link:Function f :> (pliant_general_dictionary first "pliant browser page function") map Function
    e:module rewind mark
    if exists:f
      browser_pages_sem request
      browser_pages insert ((e:0 constant Str) map Str) true addressof:f
      browser_pages_sem release
      e set_void_result

export browser_page browser_pages browser_pages_sem